-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathcheck_permission_x.php
More file actions
110 lines (85 loc) · 2.77 KB
/
check_permission_x.php
File metadata and controls
110 lines (85 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
declare(strict_types=1);
/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <admin@codeigniter.com>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Utils;
require __DIR__ . '/../system/util_bootstrap.php';
use CodeIgniter\CLI\CLI;
use FilesystemIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use RuntimeException;
use SplFileInfo;
/**
* @param list<string> $excludeDirs
*
* @return list<string>
*/
function findExecutableFiles(string $dir, array $excludeDirs = []): array
{
static $execFileList = [
'.github/scripts/deploy-userguide',
'.github/scripts/secure-git-push',
'admin/release-userguide',
'admin/release-deploy',
'admin/apibot',
'admin/alldocs',
'admin/release',
'admin/docbot',
'admin/release-notes.bb',
'admin/release-revert',
'admin/starter/builds',
'user_guide_src/add-edit-this-page',
];
$executableFiles = [];
if (! is_dir($dir)) {
throw new RuntimeException('No such directory: ' . $dir);
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_FILEINFO),
RecursiveIteratorIterator::CHILD_FIRST | RecursiveIteratorIterator::LEAVES_ONLY,
);
/** @var SplFileInfo $fileinfo */
foreach ($iterator as $fileinfo) {
$filePath = $fileinfo->getPathname();
if ($fileinfo->isFile() && is_executable($filePath)) {
$dirPath = dirname($filePath);
foreach ($excludeDirs as $excludeDir) {
if (str_contains($dirPath, $excludeDir)) {
continue 2;
}
}
if (in_array($filePath, $execFileList, true)) {
continue;
}
if (str_ends_with($filePath, '.sh')) {
continue;
}
$executableFiles[] = $filePath;
}
}
return $executableFiles;
}
// Main
chdir(__DIR__ . '/../');
$includeDirs = ['.github', 'admin', 'app', 'public', 'system', 'tests', 'user_guide_src', 'utils', 'writable'];
$excludeDirs = ['utils/vendor'];
$executableFiles = [];
foreach ($includeDirs as $dir) {
$executableFiles = array_merge($executableFiles, findExecutableFiles($dir, $excludeDirs));
}
if ($executableFiles !== []) {
CLI::write('Files with unnecessary execution permissions were detected:', 'light_gray', 'red');
foreach ($executableFiles as $file) {
CLI::write('- ' . $file);
}
exit(1);
}
CLI::write('No files with unnecessary execution permissions were detected.', 'black', 'green');
exit(0);