WordPress.org

Make WordPress Core

Ticket #21403: wp-scandir.diff

File wp-scandir.diff, 16.4 KB (added by wonderboymusic, 6 years ago)
  • wp-includes/class-wp-theme.php

     
    966966                if ( ! is_dir( $path ) )
    967967                        return false;
    968968
    969                 if ( $extensions ) {
    970                         $extensions = (array) $extensions;
    971                         $_extensions = implode( '|', $extensions );
    972                 }
    973 
    974969                $relative_path = trailingslashit( $relative_path );
    975970                if ( '/' == $relative_path )
    976971                        $relative_path = '';
    977972
    978                 $results = scandir( $path );
     973                $results = wp_scandir( $path, $extensions );
    979974                $files = array();
    980975
     976                if ( empty( $results ) )
     977                        return $files;
     978                       
    981979                foreach ( $results as $result ) {
    982                         if ( '.' == $result[0] )
    983                                 continue;
    984                         if ( is_dir( $path . '/' . $result ) ) {
    985                                 if ( ! $depth || 'CVS' == $result )
     980                        $basename = basename( $result );
     981
     982                        if ( is_dir( $result ) ) {
     983                                if ( ! $depth )
    986984                                        continue;
    987                                 $found = self::scandir( $path . '/' . $result, $extensions, $depth - 1 , $relative_path . $result );
     985                                $found = self::scandir( $result, $extensions, $depth - 1 , $relative_path . $basename );
    988986                                $files = array_merge_recursive( $files, $found );
    989                         } elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) {
    990                                 $files[ $relative_path . $result ] = $path . '/' . $result;
     987                        } else {
     988                                $files[ $relative_path . $basename ] = $result;
    991989                        }
    992990                }
    993991
  • wp-includes/theme.php

     
    372372        foreach ( $wp_theme_directories as $theme_root ) {
    373373
    374374                // Start with directories in the root of the current theme directory.
    375                 $dirs = @ scandir( $theme_root );
     375                $dirs = wp_scandir( $theme_root );
    376376                if ( ! $dirs )
    377377                        return false;
     378               
    378379                foreach ( $dirs as $dir ) {
    379                         if ( ! is_dir( $theme_root . '/' . $dir ) || $dir[0] == '.' || $dir == 'CVS' )
     380                        $dir = basename( $dir );
     381                       
     382                        if ( ! is_dir( $theme_root . '/' . $dir ) )
    380383                                continue;
     384                       
    381385                        if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {
    382386                                // wp-content/themes/a-single-theme
    383387                                // wp-content/themes is $theme_root, a-single-theme is $dir
     
    389393                                $found_theme = false;
    390394                                // wp-content/themes/a-folder-of-themes/*
    391395                                // wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs
    392                                 $sub_dirs = @ scandir( $theme_root . '/' . $dir );
     396                                $sub_dirs = wp_scandir( $theme_root . '/' . $dir );
    393397                                if ( ! $sub_dirs )
    394398                                        return false;
     399                               
    395400                                foreach ( $sub_dirs as $sub_dir ) {
    396                                         if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || $dir[0] == '.' || $dir == 'CVS' )
     401                                        $sub_dir = basename( $sub_dir );
     402                                       
     403                                        if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) )
    397404                                                continue;
    398405                                        if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) )
    399406                                                continue;
  • wp-includes/load.php

     
    439439}
    440440
    441441/**
     442 * Abstracts common implementation of PHP5 scandir
     443 *
     444 * @access public
     445 * @since 3.5.0
     446 *
     447 * @param string $dir A directory to scan for files
     448 * @param bool|$ext if set, check that files match extension(s)
     449 * @param bool|$files_only whether to return directories
     450 *
     451 * @return null|array of absolute filepaths
     452 */
     453function wp_scandir( $dir, $ext = false, $files_only = false ) {
     454        if ( !is_dir( $dir ) || !is_readable( $dir ) )
     455                return;
     456       
     457        $paths = array();
     458        $scanned = @ scandir( $dir );
     459       
     460        if ( ! empty( $scanned ) ) {
     461                $diffed = array_diff( $scanned, array( '..', '.', 'CVS' ) );
     462                if ( ! empty( $diffed ) ) {
     463                       
     464                        foreach ( $diffed as $basename ) {
     465                                $path = $dir . DIRECTORY_SEPARATOR . $basename;
     466
     467                                if ( is_file( $path ) ) {
     468                                        if ( !empty( $ext ) ) {
     469                                                $ext = (array) $ext;
     470                                                $_ext = implode( '|', $ext );
     471                                               
     472                                                if ( ! preg_match( '~\.(' . $_ext . ')$~', $basename ) )
     473                                                        continue;                                               
     474                                        }
     475                                } elseif ( !$files_only && !is_dir( $path ) ) {
     476                                        continue;
     477                                }
     478                               
     479                                $paths[] = $path;
     480                        }
     481                }
     482        }
     483       
     484        return $paths;
     485}
     486
     487/**
    442488 * Returns array of must-use plugin files to be included in global scope.
    443489 *
    444490 * The default directory is wp-content/mu-plugins. To change the default directory
     
    450496 * @return array Files to include
    451497 */
    452498function wp_get_mu_plugins() {
    453         $mu_plugins = array();
    454         if ( !is_dir( WPMU_PLUGIN_DIR ) )
    455                 return $mu_plugins;
    456         if ( ! $dh = opendir( WPMU_PLUGIN_DIR ) )
    457                 return $mu_plugins;
    458         while ( ( $plugin = readdir( $dh ) ) !== false ) {
    459                 if ( substr( $plugin, -4 ) == '.php' )
    460                         $mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin;
    461         }
    462         closedir( $dh );
     499        $mu_plugins = wp_scandir( WPMU_PLUGIN_DIR, 'php', true );
     500        if ( empty( $mu_plugins ) )
     501                return array();
     502
    463503        sort( $mu_plugins );
    464 
     504       
    465505        return $mu_plugins;
    466506}
    467507
  • wp-includes/ms-functions.php

     
    14291429 *
    14301430 * @since MU
    14311431 *
    1432  * @param string $directory
     1432 * @param string $dir
    14331433 * @return int
    14341434 */
    1435 function recurse_dirsize( $directory ) {
     1435function recurse_dirsize( $dir ) {
    14361436        $size = 0;
     1437        $dir = untrailingslashit( $dir );
    14371438
    1438         $directory = untrailingslashit( $directory );
    1439 
    1440         if ( !file_exists($directory) || !is_dir( $directory ) || !is_readable( $directory ) )
    1441                 return false;
    1442 
    1443         if ($handle = opendir($directory)) {
    1444                 while(($file = readdir($handle)) !== false) {
    1445                         $path = $directory.'/'.$file;
    1446                         if ($file != '.' && $file != '..') {
    1447                                 if (is_file($path)) {
    1448                                         $size += filesize($path);
    1449                                 } elseif (is_dir($path)) {
    1450                                         $handlesize = recurse_dirsize($path);
    1451                                         if ($handlesize > 0)
    1452                                                 $size += $handlesize;
    1453                                 }
     1439        $paths = wp_scandir( $dir );
     1440       
     1441        if ( !empty( $paths ) ) {
     1442                foreach ( $paths as $path ) {
     1443                        if ( is_file( $path ) ) {
     1444                                $size += filesize( $path );
     1445                        } elseif ( is_dir( $path ) ) {
     1446                                $handlesize = recurse_dirsize( $path );
     1447                                if ( $handlesize > 0 )
     1448                                        $size += $handlesize;
    14541449                        }
    14551450                }
    1456                 closedir($handle);
    14571451        }
    14581452        return $size;
    14591453}
  • wp-admin/includes/plugin.php

     
    179179 * @param string $plugin Plugin ID
    180180 * @return array List of files relative to the plugin root.
    181181 */
    182 function get_plugin_files($plugin) {
     182function get_plugin_files( $plugin ) {
     183        $plugin_files = array( $plugin );
    183184        $plugin_file = WP_PLUGIN_DIR . '/' . $plugin;
    184         $dir = dirname($plugin_file);
    185         $plugin_files = array($plugin);
    186         if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) {
    187                 $plugins_dir = @ opendir( $dir );
    188                 if ( $plugins_dir ) {
    189                         while (($file = readdir( $plugins_dir ) ) !== false ) {
    190                                 if ( substr($file, 0, 1) == '.' )
    191                                         continue;
    192                                 if ( is_dir( $dir . '/' . $file ) ) {
    193                                         $plugins_subdir = @ opendir( $dir . '/' . $file );
    194                                         if ( $plugins_subdir ) {
    195                                                 while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
    196                                                         if ( substr($subfile, 0, 1) == '.' )
    197                                                                 continue;
    198                                                         $plugin_files[] = plugin_basename("$dir/$file/$subfile");
    199                                                 }
    200                                                 @closedir( $plugins_subdir );
    201                                         }
    202                                 } else {
    203                                         if ( plugin_basename("$dir/$file") != $plugin )
    204                                                 $plugin_files[] = plugin_basename("$dir/$file");
    205                                 }
    206                         }
    207                         @closedir( $plugins_dir );
     185        $dir = dirname( $plugin_file );
     186        if ( $dir === WP_PLUGIN_DIR )
     187                return $plugin_files;
     188       
     189        $paths = wp_scandir( $dir );
     190
     191        if ( !empty( $paths ) ) {
     192                foreach ( $paths as $path ) {
     193                        if ( is_dir( $path ) ) {
     194                                $plugins_subdir = wp_scandir( $path );
     195
     196                                if ( !empty( $plugins_subdir ) )
     197                                        foreach ( $plugins_subdir as $subfile )
     198                                                $plugin_files[] = plugin_basename( $subfile );
     199
     200                        } else if ( plugin_basename( $path ) != $plugin )
     201                                $plugin_files[] = plugin_basename( $path );
    208202                }
    209203        }
    210 
     204       
    211205        return $plugin_files;
    212206}
    213207
     208
    214209/**
    215210 * Check the plugins directory and retrieve all plugin files with plugin data.
    216211 *
     
    231226 * @param string $plugin_folder Optional. Relative path to single plugin folder.
    232227 * @return array Key is the plugin file path and the value is an array of the plugin data.
    233228 */
    234 function get_plugins($plugin_folder = '') {
     229function get_plugins( $plugin_folder = '' ) {
    235230
    236         if ( ! $cache_plugins = wp_cache_get('plugins', 'plugins') )
     231        if ( ! $cache_plugins = wp_cache_get( 'plugins', 'plugins' ) )
    237232                $cache_plugins = array();
    238233
    239         if ( isset($cache_plugins[ $plugin_folder ]) )
     234        if ( isset( $cache_plugins[ $plugin_folder ] ) )
    240235                return $cache_plugins[ $plugin_folder ];
    241236
    242         $wp_plugins = array ();
     237        $wp_plugins = array();
    243238        $plugin_root = WP_PLUGIN_DIR;
    244         if ( !empty($plugin_folder) )
     239        if ( !empty( $plugin_folder ) )
    245240                $plugin_root .= $plugin_folder;
    246241
    247242        // Files in wp-content/plugins directory
    248         $plugins_dir = @ opendir( $plugin_root);
     243        $plugin_paths = wp_scandir( $plugin_root );
    249244        $plugin_files = array();
    250         if ( $plugins_dir ) {
    251                 while (($file = readdir( $plugins_dir ) ) !== false ) {
    252                         if ( substr($file, 0, 1) == '.' )
    253                                 continue;
    254                         if ( is_dir( $plugin_root.'/'.$file ) ) {
    255                                 $plugins_subdir = @ opendir( $plugin_root.'/'.$file );
    256                                 if ( $plugins_subdir ) {
    257                                         while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
    258                                                 if ( substr($subfile, 0, 1) == '.' )
    259                                                         continue;
    260                                                 if ( substr($subfile, -4) == '.php' )
    261                                                         $plugin_files[] = "$file/$subfile";
    262                                         }
    263                                         closedir( $plugins_subdir );
    264                                 }
     245        if ( !empty( $plugin_paths ) ) {
     246                foreach ( $plugin_paths as $plugin_path ) {
     247                        if ( is_dir( $plugin_path ) ) {
     248                                $plugins_subdir = wp_scandir( $plugin_path, 'php', true );
     249                                if ( !empty( $plugins_subdir ) )
     250                                        foreach ( $plugins_subdir as $subfile )
     251                                                $plugin_files[] = $subfile;
    265252                        } else {
    266                                 if ( substr($file, -4) == '.php' )
    267                                         $plugin_files[] = $file;
    268                         }
     253                                if ( '.php' === substr( $plugin_path, -4 ) )
     254                                        $plugin_files[] = $plugin_path;
     255                        }                       
    269256                }
    270                 closedir( $plugins_dir );
    271257        }
    272 
    273         if ( empty($plugin_files) )
     258       
     259        if ( empty( $plugin_files ) )
    274260                return $wp_plugins;
    275261
    276262        foreach ( $plugin_files as $plugin_file ) {
    277                 if ( !is_readable( "$plugin_root/$plugin_file" ) )
     263                if ( !is_readable( $plugin_file ) )
    278264                        continue;
    279265
    280                 $plugin_data = get_plugin_data( "$plugin_root/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached.
     266                $plugin_data = get_plugin_data( $plugin_file, false, false ); //Do not apply markup/translate as it'll be cached.
    281267
    282                 if ( empty ( $plugin_data['Name'] ) )
     268                if ( empty( $plugin_data['Name'] ) )
    283269                        continue;
    284270
    285271                $wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;
     
    304290function get_mu_plugins() {
    305291        $wp_plugins = array();
    306292        // Files in wp-content/mu-plugins directory
    307         $plugin_files = array();
    308 
    309         if ( ! is_dir( WPMU_PLUGIN_DIR ) )
    310                 return $wp_plugins;
    311         if ( $plugins_dir = @ opendir( WPMU_PLUGIN_DIR ) ) {
    312                 while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
    313                         if ( substr( $file, -4 ) == '.php' )
    314                                 $plugin_files[] = $file;
    315                 }
    316         } else {
    317                 return $wp_plugins;
    318         }
    319 
    320         @closedir( $plugins_dir );
    321 
    322         if ( empty($plugin_files) )
    323                 return $wp_plugins;
    324 
     293        $plugin_files = wp_scandir( WPMU_PLUGIN_DIR, 'php', true );
     294       
     295        if ( empty( $plugin_files ) )
     296                return array();
     297               
    325298        foreach ( $plugin_files as $plugin_file ) {
    326                 if ( !is_readable( WPMU_PLUGIN_DIR . "/$plugin_file" ) )
     299                if ( !is_readable( $plugin_file ) )
    327300                        continue;
    328301
    329                 $plugin_data = get_plugin_data( WPMU_PLUGIN_DIR . "/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached.
     302                $plugin_data = get_plugin_data( $plugin_file, false, false ); //Do not apply markup/translate as it'll be cached.
    330303
    331                 if ( empty ( $plugin_data['Name'] ) )
    332                         $plugin_data['Name'] = $plugin_file;
     304                if ( empty( $plugin_data['Name'] ) )
     305                        $plugin_data['Name'] = basename( $plugin_file );
    333306
    334                 $wp_plugins[ $plugin_file ] = $plugin_data;
     307                $wp_plugins[ basename( $plugin_file ) ] = $plugin_data;
    335308        }
    336309
    337310        if ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php') <= 30 ) // silence is golden
     
    364337
    365338        $_dropins = _get_dropins();
    366339
    367         // These exist in the wp-content directory
    368         if ( $plugins_dir = @ opendir( WP_CONTENT_DIR ) ) {
    369                 while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
    370                         if ( isset( $_dropins[ $file ] ) )
    371                                 $plugin_files[] = $file;
    372                 }
    373         } else {
     340        $paths = wp_scandir( WP_CONTENT_DIR, 'php', true );
     341       
     342        if ( empty( $paths ) )
    374343                return $dropins;
     344       
     345        // These exist in the wp-content directory
     346        foreach ( $paths as $path ) {
     347                $file = basename( $path );
     348                if ( isset( $_dropins[ $file ] ) )
     349                        $plugin_files[] = $file;
    375350        }
    376351
    377         @closedir( $plugins_dir );
    378 
    379         if ( empty($plugin_files) )
    380                 return $dropins;
    381 
    382352        foreach ( $plugin_files as $plugin_file ) {
    383353                if ( !is_readable( WP_CONTENT_DIR . "/$plugin_file" ) )
    384354                        continue;
    385                 $plugin_data = get_plugin_data( WP_CONTENT_DIR . "/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached.
     355               
     356                $absolute = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $plugin_file;
     357                $plugin_data = get_plugin_data( $absolute, false, false ); //Do not apply markup/translate as it'll be cached.
     358               
    386359                if ( empty( $plugin_data['Name'] ) )
    387360                        $plugin_data['Name'] = $plugin_file;
     361               
    388362                $dropins[ $plugin_file ] = $plugin_data;
    389363        }
    390364
  • wp-admin/includes/file.php

     
    128128 * @return bool|array False on failure, Else array of files
    129129 */
    130130function list_files( $folder = '', $levels = 100 ) {
    131         if ( empty($folder) )
     131        if ( empty( $folder ) )
    132132                return false;
    133133
    134134        if ( ! $levels )
    135135                return false;
    136136
    137137        $files = array();
    138         if ( $dir = @opendir( $folder ) ) {
    139                 while (($file = readdir( $dir ) ) !== false ) {
    140                         if ( in_array($file, array('.', '..') ) )
    141                                 continue;
    142                         if ( is_dir( $folder . '/' . $file ) ) {
    143                                 $files2 = list_files( $folder . '/' . $file, $levels - 1);
    144                                 if ( $files2 )
    145                                         $files = array_merge($files, $files2 );
    146                                 else
    147                                         $files[] = $folder . '/' . $file . '/';
    148                         } else {
    149                                 $files[] = $folder . '/' . $file;
    150                         }
     138        $paths = wp_scandir( $folder );
     139        if ( empty( $paths ) )
     140                return $files;
     141       
     142        foreach ( $paths as $path ) {
     143                if ( is_dir( $path ) ) {
     144                        $found = list_files( $path, $levels - 1);
     145                        if ( !empty( $found ) )
     146                                $files = array_merge( $files, $found );
     147                        else
     148                                $files[] = trailingslashit( $path );
     149                } else {
     150                        $files[] = $path;
    151151                }
    152152        }
    153         @closedir( $dir );
     153       
    154154        return $files;
    155155}
    156156
  • wp-admin/includes/ms.php

     
    9292                $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $blog_id ) );
    9393
    9494                $dir = apply_filters( 'wpmu_delete_blog_upload_dir', WP_CONTENT_DIR . "/blogs.dir/{$blog_id}/files/", $blog_id );
    95                 $dir = rtrim( $dir, DIRECTORY_SEPARATOR );
     95                $dir = untrailingslashit( $dir );
    9696                $top_dir = $dir;
    9797                $stack = array($dir);
    9898                $index = 0;
     
    101101                        # Get indexed directory from stack
    102102                        $dir = $stack[$index];
    103103
    104                         $dh = @opendir( $dir );
    105                         if ( $dh ) {
    106                                 while ( ( $file = @readdir( $dh ) ) !== false ) {
    107                                         if ( $file == '.' || $file == '..' )
    108                                                 continue;
    109 
    110                                         if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) )
    111                                                 $stack[] = $dir . DIRECTORY_SEPARATOR . $file;
    112                                         else if ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) )
    113                                                 @unlink( $dir . DIRECTORY_SEPARATOR . $file );
    114                                 }
     104                        $paths = wp_scandir( $dir );
     105                       
     106                        if ( !empty( $paths ) ) {
     107                                foreach ( $paths as $path ) {
     108                                        if ( @is_dir( $path ) )
     109                                                $stack[] = $path;
     110                                        else if ( @is_file( $path ) )
     111                                                @unlink( $path );
     112                                }                                       
    115113                        }
    116114                        $index++;
    117115                }
  • wp-admin/plugin-editor.php

     
    2727if ( empty($plugins) )
    2828        wp_die( __('There are no plugins installed on this site.') );
    2929
    30 if ( isset($_REQUEST['file']) )
     30if ( isset( $_REQUEST['file'] ) && !isset( $_REQUEST['plugin'] ) )
    3131        $plugin = stripslashes($_REQUEST['file']);
    3232
    3333if ( empty($plugin) ) {