diff options
Diffstat (limited to 'ext/standard/tests/file/windows_acls')
-rw-r--r-- | ext/standard/tests/file/windows_acls/bug44859.phpt | 63 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/bug44859_2.phpt | 63 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/bug44859_3.phpt | 37 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/bug44859_4.phpt | 65 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/common.inc | 199 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/tiny.bat | 1 | ||||
-rw-r--r-- | ext/standard/tests/file/windows_acls/tiny.exe | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..a27e3e6 --- /dev/null +++ b/ext/standard/tests/file/windows_acls/tiny.exe |