summaryrefslogtreecommitdiff
path: root/ext/standard/tests/file/windows_acls
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/tests/file/windows_acls')
-rw-r--r--ext/standard/tests/file/windows_acls/bug44859.phpt63
-rw-r--r--ext/standard/tests/file/windows_acls/bug44859_2.phpt63
-rw-r--r--ext/standard/tests/file/windows_acls/bug44859_3.phpt37
-rw-r--r--ext/standard/tests/file/windows_acls/bug44859_4.phpt65
-rw-r--r--ext/standard/tests/file/windows_acls/common.inc199
-rw-r--r--ext/standard/tests/file/windows_acls/tiny.bat1
-rw-r--r--ext/standard/tests/file/windows_acls/tiny.exebin0 -> 133 bytes
7 files changed, 428 insertions, 0 deletions
diff --git a/ext/standard/tests/file/windows_acls/bug44859.phpt b/ext/standard/tests/file/windows_acls/bug44859.phpt
new file mode 100644
index 0000000..952b6eb
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/bug44859.phpt
@@ -0,0 +1,63 @@
+--TEST--
+bug #44859 (incorrect result with NTFS ACL permissions, is_writable)
+--SKIPIF--
+<?php
+include_once __DIR__ . '/common.inc';
+skipif();
+?>
+--FILE--
+<?php
+include_once __DIR__ . '/common.inc';
+fix_acls();
+
+$iteration = array(
+ PHPT_ACL_READ => false,
+ PHPT_ACL_NONE => false,
+ PHPT_ACL_WRITE => true,
+ PHPT_ACL_WRITE|PHPT_ACL_READ => true,
+);
+
+echo "Testing file:\n";
+$i = 1;
+$path = __DIR__ . '/a.txt';
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_writable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_writable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+echo "Testing directory:\n";
+$path = __DIR__ . '/adir';
+$i = 1;
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_writable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_writable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+?>
+--EXPECT--
+Testing file:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
+Testing directory:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
diff --git a/ext/standard/tests/file/windows_acls/bug44859_2.phpt b/ext/standard/tests/file/windows_acls/bug44859_2.phpt
new file mode 100644
index 0000000..d741156
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/bug44859_2.phpt
@@ -0,0 +1,63 @@
+--TEST--
+bug #44859 (incorrect result with NTFS ACL permissions, is_readable)
+--SKIPIF--
+<?php
+include_once __DIR__ . '/common.inc';
+skipif();
+?>
+--FILE--
+<?php
+include_once __DIR__ . '/common.inc';
+fix_acls();
+
+$iteration = array(
+ PHPT_ACL_READ => true,
+ PHPT_ACL_NONE => false,
+ PHPT_ACL_WRITE => false,
+ PHPT_ACL_WRITE|PHPT_ACL_READ => true,
+);
+
+echo "Testing file:\n";
+$i = 1;
+$path = __DIR__ . '/a.txt';
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_readable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_readable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+echo "Testing directory:\n";
+$path = __DIR__ . '/adir';
+$i = 1;
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_readable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_readable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+?>
+--EXPECT--
+Testing file:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
+Testing directory:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
diff --git a/ext/standard/tests/file/windows_acls/bug44859_3.phpt b/ext/standard/tests/file/windows_acls/bug44859_3.phpt
new file mode 100644
index 0000000..ed57abb
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/bug44859_3.phpt
@@ -0,0 +1,37 @@
+--TEST--
+bug #44859 (incorrect result with NTFS ACL permissions, is_executable)
+--SKIPIF--
+<?php
+include_once __DIR__ . '/common.inc';
+skipif();
+?>
+--FILE--
+<?php
+include_once __DIR__ . '/common.inc';
+fix_acls();
+
+$iteration = array(
+ 'tiny.exe' => true,
+ //'tiny.bat' => true, To be fixed in _access
+ __FILE__ => false
+);
+
+$i = 1;
+$path = __DIR__;
+
+foreach ($iteration as $file => $exp) {
+ $path = __DIR__ . '/' . $file;
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_executable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_executable($path), $exp);
+ echo "failed.\n";
+ }
+}
+
+
+?>
+--EXPECT--
+Iteration #1: passed.
+Iteration #2: passed.
diff --git a/ext/standard/tests/file/windows_acls/bug44859_4.phpt b/ext/standard/tests/file/windows_acls/bug44859_4.phpt
new file mode 100644
index 0000000..954c100
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/bug44859_4.phpt
@@ -0,0 +1,65 @@
+--TEST--
+bug #44859 (incorrect result with NTFS ACL permissions, is_readable)
+--CREDITS--
+Venkat Raman Don
+--SKIPIF--
+<?php
+include_once __DIR__ . '/common.inc';
+skipif();
+?>
+--FILE--
+<?php
+include_once __DIR__ . '/common.inc';
+fix_acls();
+
+$iteration = array(
+ PHPT_ACL_READ => true,
+ PHPT_ACL_NONE => false,
+ PHPT_ACL_WRITE => false,
+ PHPT_ACL_WRITE|PHPT_ACL_READ => true,
+);
+
+echo "Testing file with relative path:\n";
+$i = 1;
+$path = './a.txt';
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_readable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_readable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+echo "Testing directory with relative path:\n";
+$path = 'adir';
+$i = 1;
+foreach ($iteration as $perms => $exp) {
+ create_file($path, $perms);
+ clearstatcache(true, $path);
+ echo 'Iteration #' . $i++ . ': ';
+ if (is_readable($path) == $exp) {
+ echo "passed.\n";
+ } else {
+ var_dump(is_readable($path), $exp);
+ echo "failed.\n";
+ }
+ delete_file($path);
+}
+
+?>
+--EXPECT--
+Testing file with relative path:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
+Testing directory with relative path:
+Iteration #1: passed.
+Iteration #2: passed.
+Iteration #3: passed.
+Iteration #4: passed.
diff --git a/ext/standard/tests/file/windows_acls/common.inc b/ext/standard/tests/file/windows_acls/common.inc
new file mode 100644
index 0000000..26fadf3
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/common.inc
@@ -0,0 +1,199 @@
+<?php
+error_reporting(E_ALL);
+define('PHPT_ACL_READ', 1 << 1);
+define('PHPT_ACL_WRITE', 1 << 2);
+define('PHPT_ACL_EXEC', 1 << 3);
+define('PHPT_ACL_NONE', 1 << 4);
+define('PHPT_ACL_FULL', 1 << 5);
+
+define('PHPT_ACL_GRANT', 1);
+define('PHPT_ACL_DENY', 2);
+
+function skipif() {
+ if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+ die('skip windows only test');
+ }
+ if(stripos(php_uname(), 'XP') !== FALSE) {
+ die('skip windows 2003 or newer only test');
+ }
+}
+
+function get_username(){
+ $user = getenv('USERNAME');
+
+ if (!$user) {
+ $user = get_current_user();
+ }
+
+ if (!$user) {
+ $user = exec('echo %USERNAME%');
+ }
+
+ return $user;
+}
+
+function get_domainname()
+{
+ $domain = getenv('USERDOMAIN');
+
+ return $domain;
+}
+
+function get_icacls()
+{
+ $sysroot = exec('echo %SYSTEMROOT%');
+
+ return "$sysroot\\System32\\icacls.exe";
+}
+
+function fix_acls() {
+ $user = get_username();
+ /* Current user needs to be owner of the test files. As well
+ all the other users having acls on the files must loose them.
+ The following fixes this just partially, as dynamically reading
+ all the users having acls on a file could be sophisticated. */
+ exec(get_icacls() . ' . /setowner $user /T /L /Q 2> nul');
+ exec(get_icacls() . ' . /remove:g Administrators /T /L /Q 2> nul');
+}
+
+function icacls_set($path, $mode, $perm) {
+ $icacls = get_icacls();
+ $user = get_username();
+ $path_escaped = '"' . $path . '"';
+ $perm_entry = array();
+
+ if ($perm & PHPT_ACL_READ) $perm_entry[] = 'R';
+ if ($perm & PHPT_ACL_WRITE) $perm_entry[] = 'W';
+ if ($perm & PHPT_ACL_EXEC) $perm_entry[] = 'RX';
+ if ($perm & PHPT_ACL_FULL) $perm_entry[] = 'F';
+
+ // Deny all
+ $cmd = $icacls . ' ' . $path_escaped . ' /inheritance:r /deny ' . $user . ':(F,M,R,RX,W)';
+ exec($cmd);
+
+ if ($perm & PHPT_ACL_NONE) {
+ /*
+ This is required to remove all the previously denied
+ permission for the USER. Just granting permission doesn't
+ remove the previously denied permission.
+ */
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:d ' . $user;
+ exec($cmd);
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:g ' . $user;
+ exec($cmd);
+ return;
+ }
+
+ if ($mode == PHPT_ACL_GRANT) {
+ $mode = 'grant';
+ } else {
+ $mode = 'deny';
+ }
+
+
+ // Deny all
+ $cmd = $icacls . ' ' . $path_escaped . ' /deny ' . $user . ':(F,M,R,RX,W)';
+ exec($cmd);
+
+ /*
+ This is required to remove all the previously denied
+ permission for the USER. Just granting permission doesn't
+ remove the previously denied permission.
+ */
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:d ' . $user;
+ exec($cmd);
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:g ' . $user;
+ exec($cmd);
+
+
+ /*
+ Required to set no permission and check that is_readable()
+ returns false. If the $perm_entry contains 'N' skip this step.
+ This will make the file/dir with NO aceess.
+ */
+ if (!in_array('N', $perm_entry)) {
+ /*
+ This is required to remove all the previously denied
+ permission for the USER. Just granting permission doesn't
+ remove the previously denied permission.
+ */
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:d ' . $user;
+ exec($cmd);
+ $cmd = $icacls . ' ' . $path_escaped . ' /remove:g ' . $user;
+ exec($cmd);
+
+ $cmd = $icacls . ' ' . $path_escaped . ' /' . $mode . ' ' . $user;
+ $cmd .= ':' . '(' . implode($perm_entry, ',') . ')';
+ exec($cmd);
+ }
+}
+
+function create_dir($name, $perms) {
+ if (empty($name)) {
+ echo "create_dir: Empty name is not allowed\n";
+ return;
+ }
+
+ mkdir($name);
+ $dst = realpath($name);
+ icacls_set($name, PHPT_ACL_GRANT, $perms);
+}
+
+function create_file($name, $perms) {
+ if (empty($name)) {
+ echo "create_file: Empty name is not allowed\n";
+ return;
+ }
+
+ touch($name);
+ icacls_set($name, PHPT_ACL_GRANT, $perms);
+}
+
+function delete_file($path) {
+ icacls_set($path, PHPT_ACL_GRANT, PHPT_ACL_FULL);
+ if (is_file($path)) {
+ unlink($path);
+ } else {
+ echo "delete_file: '$path' is not a file\n";
+ return;
+ }
+}
+
+function delete_dir($path) {
+ if (is_dir($path)) {
+ icacls_set($path, PHPT_ACL_GRANT, PHPT_ACL_FULL);
+ rmdir($path);
+ } else {
+ echo "delete_dir: '$path' is not a directory\n";
+ return;
+ }
+}
+if (0) {
+$path = __DIR__ . '/a.txt';
+create_file($path, PHPT_ACL_NONE);
+if (!is_writable($path)) {
+ echo "PHPT_ACL_NONE success!!\n";
+} else {
+ echo "PHPT_ACL_NONE failed!!\n";
+}
+delete_file($path);
+
+$path = __DIR__ . '/a.txt';
+create_file($path, PHPT_ACL_READ);
+if (!is_writable($path)) {
+ echo "PHPT_ACL_READ success!!\n";
+} else {
+ echo "PHPT_ACL_READ failed!!\n";
+}
+delete_file($path);
+
+$path = __DIR__ . '/adir';
+create_dir($path, PHPT_ACL_READ);
+if (!is_writable($path)) {
+ echo "PHPT_ACL_READ dir success!!\n";
+} else {
+ echo "PHPT_ACL_READ dir failed!!\n";
+}
+delete_dir($path);
+
+}
diff --git a/ext/standard/tests/file/windows_acls/tiny.bat b/ext/standard/tests/file/windows_acls/tiny.bat
new file mode 100644
index 0000000..c5464d3
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/tiny.bat
@@ -0,0 +1 @@
+echo FOO
diff --git a/ext/standard/tests/file/windows_acls/tiny.exe b/ext/standard/tests/file/windows_acls/tiny.exe
new file mode 100644
index 0000000..a27e3e6
--- /dev/null
+++ b/ext/standard/tests/file/windows_acls/tiny.exe
Binary files differ