WordPress.org

Make WordPress Core

Ticket #21403: wp-scandir.diff

File wp-scandir.diff, 16.4 KB (added by wonderboymusic, 2 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) ) {