diff --git a/core/includes/file.inc b/core/includes/file.inc index 545a4a2..d241e15 100644 --- a/core/includes/file.inc +++ b/core/includes/file.inc @@ -914,7 +914,7 @@ function file_unmanaged_save_data($data, $destination = NULL, $replace = FILE_EX * @param $options * An associative array of additional options, with the following elements: * - 'nomask': The preg_match() regular expression for files to be excluded. - * There is no default. + * Defaults to the 'file_scan_ignore_directories' setting. * - 'callback': The callback function to call for each match. There is no * default callback. * - 'recurse': When TRUE, the directory scan will recurse the entire tree @@ -953,6 +953,9 @@ function file_scan_directory($dir, $mask, $options = array(), $depth = 0) { // performance boost. if (!isset($options['nomask'])) { $ignore_directories = Settings::get('file_scan_ignore_directories', []); + array_walk($ignore_directories, function(&$value) { + $value = preg_quote($value, '/'); + }); $default_nomask = '/^' . implode('|', $ignore_directories) . '$/'; } diff --git a/core/modules/system/src/Tests/File/ScanDirectoryTest.php b/core/modules/system/src/Tests/File/ScanDirectoryTest.php index 96fdc33..9c85d16 100644 --- a/core/modules/system/src/Tests/File/ScanDirectoryTest.php +++ b/core/modules/system/src/Tests/File/ScanDirectoryTest.php @@ -7,8 +7,6 @@ namespace Drupal\system\Tests\File; -use Drupal\Core\Site\Settings; - /** * Tests the file_scan_directory() function. * @@ -160,6 +158,12 @@ function testIgnoreDirectories() { $files = file_scan_directory('core/modules/system/tests/fixtures/IgnoreDirectories', '/\.txt$/'); $this->assertEqual(1, count($files), '1 text files found when ignoring directories called "frontend_framework".'); + // Ensure that the directories in file_scan_ignore_directories are escaped + // using preg_quote. + $this->settingsSet('file_scan_ignore_directories', ['frontend.*']); + $files = file_scan_directory('core/modules/system/tests/fixtures/IgnoreDirectories', '/\.txt$/'); + $this->assertEqual(2, count($files), '2 text files found when ignoring a directory that is not there.'); + $files = file_scan_directory('core/modules/system/tests/fixtures/IgnoreDirectories', '/\.txt$/', ['nomask' => '/^something_thing_else$/']); $this->assertEqual(2, count($files), '2 text files found when an "nomasl" option passed in.'); } diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php index 1df5da2..c99aba9 100644 --- a/sites/default/default.settings.php +++ b/sites/default/default.settings.php @@ -705,10 +705,14 @@ */ /** - * The list of folders disabled for directory scanning. + * The default list of directories that will be ignored by Drupal's file API's. * * By default ignore node_modules and bower_components folders to avoid issues - * with Drupal recursive scanning. + * with common frontend tools and recursive scanning of directories looking for + * extensions. + * + * @see file_scan_directory() + * @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory() */ $settings['file_scan_ignore_directories'] = [ 'node_modules',