From 927c219b1fc1cc69f724827771d567384b2cda8c Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sat, 26 Apr 2014 18:04:47 +0200 Subject: [ticket/12273] Use RecursiveDirectoryIterator with filter in php_exporter PHPBB3-12273 --- phpBB/phpbb/event/php_exporter.php | 56 ++++++---------------- .../event/recursive_event_filter_iterator.php | 45 +++++++++++++++++ 2 files changed, 59 insertions(+), 42 deletions(-) create mode 100644 phpBB/phpbb/event/recursive_event_filter_iterator.php (limited to 'phpBB/phpbb/event') diff --git a/phpBB/phpbb/event/php_exporter.php b/phpBB/phpbb/event/php_exporter.php index 41058216e8..8e4a9d399d 100644 --- a/phpBB/phpbb/event/php_exporter.php +++ b/phpBB/phpbb/event/php_exporter.php @@ -100,17 +100,22 @@ class php_exporter /** * Returns a list of files in $dir * - * Works recursive with any depth - * * @param string $dir Directory to go through - * @param string $path Path from root to $dir - * @return array List of files (including directories) + * @return array List of files (including the path) */ - public function get_recursive_file_list($dir, $path = '') + public function get_recursive_file_list($dir) { try { - $iterator = new \DirectoryIterator($dir); + $iterator = new \RecursiveIteratorIterator( + new \phpbb\event\recursive_event_filter_iterator( + new \RecursiveDirectoryIterator( + $dir, + \FilesystemIterator::SKIP_DOTS + ) + ), + \RecursiveIteratorIterator::LEAVES_ONLY + ); } catch (\Exception $e) { @@ -120,42 +125,9 @@ class php_exporter $files = array(); foreach ($iterator as $file_info) { - /** @var \DirectoryIterator $file_info */ - if ($file_info->isDot()) - { - continue; - } - - // Do not scan some directories - if ($file_info->isDir() && ( - ($path == '' && in_array($file_info->getFilename(), array( - 'cache', - 'develop', - 'ext', - 'files', - 'language', - 'store', - 'vendor', - ))) - || ($path == '/includes' && in_array($file_info->getFilename(), array('utf'))) - || ($path == '/phpbb/db/migration' && in_array($file_info->getFilename(), array('data'))) - || ($path == '/phpbb' && in_array($file_info->getFilename(), array('event'))) - )) - { - continue; - } - else if ($file_info->isDir()) - { - $sub_dir = $this->get_recursive_file_list($file_info->getPath() . '/' . $file_info->getFilename(), $path . '/' . $file_info->getFilename()); - foreach ($sub_dir as $file) - { - $files[] = $file_info->getFilename() . '/' . $file; - } - } - else if (substr($file_info->getFilename(), -4) == '.php') - { - $files[] = $file_info->getFilename(); - } + /** @var \RecursiveDirectoryIterator $file_info */ + $relative_path = $iterator->getInnerIterator()->getSubPathname(); + $files[] = str_replace(DIRECTORY_SEPARATOR, '/', $relative_path); } return $files; diff --git a/phpBB/phpbb/event/recursive_event_filter_iterator.php b/phpBB/phpbb/event/recursive_event_filter_iterator.php new file mode 100644 index 0000000000..c520bdae4a --- /dev/null +++ b/phpBB/phpbb/event/recursive_event_filter_iterator.php @@ -0,0 +1,45 @@ +current()); + $filename = $this->current()->getFilename(); + + return (substr($relative_path, -4) === '.php' || $this->current()->isDir()) + && $filename[0] !== '.' + && strpos($relative_path, 'phpBB/cache/') !== 0 + && strpos($relative_path, 'phpBB/develop/') !== 0 + && strpos($relative_path, 'phpBB/ext/') !== 0 + && strpos($relative_path, 'phpBB/files/') !== 0 + && strpos($relative_path, 'phpBB/includes/utf/') !== 0 + && strpos($relative_path, 'phpBB/language/') !== 0 + && strpos($relative_path, 'phpBB/phpbb/db/migration/data/') !== 0 + && strpos($relative_path, 'phpBB/phpbb/event/') !== 0 + && strpos($relative_path, 'phpBB/store/') !== 0 + && strpos($relative_path, 'phpBB/vendor/') !== 0 + ; + } +} -- cgit v1.2.1