WordPress.org

Make WordPress Core

Changeset 30404


Ignore:
Timestamp:
11/20/2014 06:52:07 AM (5 years ago)
Author:
jeremyfelt
Message:

Prevent wpmu_delete_blog from removing the wrong uploads directory

wp_upload_dir() includes some logic to fall back to the default site's upload directory if a specific directory for the requested site cannot be found. Because of this, if wpmu_delete_blog() is fired twice in a row for the same site, the main site's upload directory could be deleted as well.

This adds some checks in wpmu_delete_blog() so that we are confident in the site and it's upload directory's existence before dropping the site. Tests are added for when ms_files_rewriting is enabled or disabled.

Fixes #30121

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/ms.php

    r30177 r30404  
    8686    $current_site = get_current_site();
    8787
     88    // If a full blog object is not available, do not destroy anything.
     89    if ( $drop && ! $blog ) {
     90        $drop = false;
     91    }
     92
    8893    // Don't destroy the initial, main, or root blog.
    89     if ( $drop && ( 1 == $blog_id || is_main_site( $blog_id ) || ( $blog->path == $current_site->path && $blog->domain == $current_site->domain ) ) )
     94    if ( $drop && ( 1 == $blog_id || is_main_site( $blog_id ) || ( $blog->path == $current_site->path && $blog->domain == $current_site->domain ) ) ) {
    9095        $drop = false;
     96    }
     97
     98    $upload_path = trim( get_option( 'upload_path' ) );
     99
     100    // If ms_files_rewriting is enabled and upload_path is empty, wp_upload_dir is not reliable.
     101    if ( $drop && get_site_option( 'ms_files_rewriting' ) && empty( $upload_path ) ) {
     102        $drop = false;
     103    }
    91104
    92105    if ( $drop ) {
     106        $uploads = wp_upload_dir();
     107
    93108        $tables = $wpdb->tables( 'blog' );
    94109        /**
     
    108123        $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $blog_id ) );
    109124
    110         $uploads = wp_upload_dir();
    111125        /**
    112126         * Filter the upload base directory to delete when the blog is deleted.
  • trunk/tests/phpunit/tests/multisite/ms-files-rewriting.php

    r30286 r30404  
    5656        restore_current_blog();
    5757    }
     58
     59    /**
     60     * When a site is deleted with wpmu_delete_blog(), only the files associated with
     61     * that site should be removed. When wpmu_delete_blog() is run a second time, nothing
     62     * should change with upload directories.
     63     */
     64    function test_upload_directories_after_multiple_wpmu_delete_blog_with_ms_files() {
     65        $filename = rand_str().'.jpg';
     66        $contents = rand_str();
     67
     68        // Upload a file to the main site on the network.
     69        $file1 = wp_upload_bits( $filename, null, $contents );
     70
     71        $blog_id = $this->factory->blog->create();
     72
     73        switch_to_blog( $blog_id );
     74        $file2 = wp_upload_bits( $filename, null, $contents );
     75        restore_current_blog();
     76
     77        wpmu_delete_blog( $blog_id, true );
     78
     79        // The file on the main site should still exist. The file on the deleted site should not.
     80        $this->assertTrue( file_exists( $file1['file'] ) );
     81        $this->assertFalse( file_exists( $file2['file'] ) );
     82
     83        wpmu_delete_blog( $blog_id, true );
     84
     85        // The file on the main site should still exist. The file on the deleted site should not.
     86        $this->assertTrue( file_exists( $file1['file'] ) );
     87        $this->assertFalse( file_exists( $file2['file'] ) );
     88    }
    5889}
    5990
  • trunk/tests/phpunit/tests/multisite/site.php

    r30286 r30404  
    275275    }
    276276
     277    /**
     278     * When a site is deleted with wpmu_delete_blog(), only the files associated with
     279     * that site should be removed. When wpmu_delete_blog() is run a second time, nothing
     280     * should change with upload directories.
     281     */
     282    function test_upload_directories_after_multiple_wpmu_delete_blog() {
     283        $filename = rand_str().'.jpg';
     284        $contents = rand_str();
     285
     286        // Upload a file to the main site on the network.
     287        $file1 = wp_upload_bits( $filename, null, $contents );
     288
     289        $blog_id = $this->factory->blog->create();
     290
     291        switch_to_blog( $blog_id );
     292        $file2 = wp_upload_bits( $filename, null, $contents );
     293        restore_current_blog();
     294
     295        wpmu_delete_blog( $blog_id, true );
     296
     297        // The file on the main site should still exist. The file on the deleted site should not.
     298        $this->assertTrue( file_exists( $file1['file'] ) );
     299        $this->assertFalse( file_exists( $file2['file'] ) );
     300
     301        wpmu_delete_blog( $blog_id, true );
     302
     303        // The file on the main site should still exist. The file on the deleted site should not.
     304        $this->assertTrue( file_exists( $file1['file'] ) );
     305        $this->assertFalse( file_exists( $file2['file'] ) );
     306    }
     307
    277308    function test_wpmu_update_blogs_date() {
    278309        global $wpdb;
Note: See TracChangeset for help on using the changeset viewer.