WordPress.org

Make WordPress Core

Ticket #7395: 7395.diff

File 7395.diff, 4.8 KB (added by DD32, 10 years ago)
  • wp-admin/includes/file.php

     
    482482        if ( 0 == count($archive_files) )
    483483                return new WP_Error('empty_archive', __('Empty archive'));
    484484
     485        //Prepend another directory level if there are files in the root directory of the zip
     486        foreach ( $archive_files as $archive_file ) {
     487                if ( false === strpos($archive_file['filename'], '/') ) {
     488                        $to = trailingslashit($to) . basename($file, '.zip');
     489                        break;
     490                }
     491        }
     492
    485493        $path = explode('/', untrailingslashit($to));
    486494        for ( $i = count($path); $i > 0; $i-- ) { //>0 = first element is empty allways for paths starting with '/'
    487495                $tmppath = implode('/', array_slice($path, 0, $i) );
     
    558566}
    559567
    560568/**
     569 * Locates the lowest safe directory in a Plugin folder to copy to the plugins directory.
     570 *
     571 * @since 2.7.0
     572 *
     573 * @param string $working_dir the Working directory of the plugin files
     574 * @return string The directory from the folder to copy from.
     575 */
     576function update_pluginfiles_base_dir($working_dir) {
     577        $files = list_files($working_dir);
     578        //Remove non-php files
     579        foreach ( (array)$files as $key => $file )
     580                if ( ! preg_match('!.php$!i', $file) )
     581                        unset($files[$key]);
     582        //remove non-plugin files
     583        foreach ( (array)$files as $key => $file ) {
     584                $details = get_plugin_data($file, false, false);
     585                if ( empty($details['Name']) )
     586                        unset($files[$key]);
     587        }
     588        if ( empty($files) )
     589                return false;
     590        //Left with paths to files which ARE plugins.
     591        $min_num = 100; //assume no zips with deeper paths will come along
     592        $min_file = '';
     593        foreach ( (array)$files as $key => $file ) {
     594                $this_num = substr_count($file, '/');
     595                if ( $this_num < $min_num ) {
     596                        $min_file = $file;
     597                        $min_num = $this_num;
     598                }
     599        }
     600        unset($min_num);
     601        return dirname(dirname($min_file));
     602}
     603
     604/**
    561605 * {@internal Missing Short Description}}
    562606 *
    563607 * @since unknown
  • wp-admin/includes/plugin-install.php

     
    752752        }
    753753
    754754        apply_filters('install_feedback', __('Installing the plugin'));
     755
     756        //find base plugin directory
     757        $plugin_working_dir = update_pluginfiles_base_dir($working_dir);
     758
    755759        // Copy new version of plugin into place.
    756         $result = copy_dir($working_dir, $plugins_dir);
     760        $result = copy_dir($plugin_working_dir, $plugins_dir);
    757761        if ( is_wp_error($result) ) {
    758762                $wp_filesystem->delete($working_dir, true);
    759763                return $result;
    760764        }
    761765
    762766        //Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin
    763         $filelist = array_keys( $wp_filesystem->dirlist($working_dir) );
     767        $filelist = array_keys( $wp_filesystem->dirlist($plugin_working_dir) );
    764768
    765769        // Remove working directory
    766770        $wp_filesystem->delete($working_dir, true);
     
    847851        }
    848852
    849853        apply_filters('install_feedback', __('Installing the plugin'));
     854
     855        //find base plugin directory
     856        $plugin_working_dir = update_pluginfiles_base_dir($working_dir);
     857       
    850858        // Copy new version of plugin into place.
    851         $result = copy_dir($working_dir, $plugins_dir);
     859        $result = copy_dir($plugin_working_dir, $plugins_dir);
    852860        if ( is_wp_error($result) ) {
    853861                $wp_filesystem->delete($working_dir, true);
    854862                return $result;
    855863        }
    856864
    857865        //Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin
    858         $filelist = array_keys( $wp_filesystem->dirlist($working_dir) );
     866        $filelist = array_keys( $wp_filesystem->dirlist($plugin_working_dir) );
    859867
    860868        // Remove working directory
    861869        $wp_filesystem->delete($working_dir, true);
     
    871879        return  $folder . '/' . $pluginfiles[0];
    872880}
    873881
    874 ?>
     882?>
     883 No newline at end of file
  • wp-admin/includes/update.php

     
    173173        }
    174174
    175175        apply_filters('update_feedback', __('Installing the latest version'));
     176
     177        //find base plugin directory
     178        $plugin_working_dir = update_pluginfiles_base_dir($working_dir);
     179
    176180        // Copy new version of plugin into place.
    177         $result = copy_dir($working_dir, $plugins_dir);
     181        $result = copy_dir($plugin_working_dir, $plugins_dir);
    178182        if ( is_wp_error($result) ) {
    179183                $wp_filesystem->delete($working_dir, true);
    180184                return $result;
    181185        }
    182186
    183187        //Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin
    184         $filelist = array_keys( $wp_filesystem->dirlist($working_dir) );
     188        $filelist = array_keys( $wp_filesystem->dirlist($plugin_working_dir) );
    185189
    186190        // Remove working directory
    187191        $wp_filesystem->delete($working_dir, true);