WordPress.org

Make WordPress Core

Changeset 31155


Ignore:
Timestamp:
01/12/2015 01:42:46 AM (5 years ago)
Author:
jeremyfelt
Message:

Enforce leading and trailing slashes on paths updated with update_blog_details()

In multisite, core expects the stored value for a site's path to have leading and trailing slashes. When these slashes are missing, it becomes impossible to visit the site.

This enforces proper /path/ creation in update_blog_details(), most likely used when updating an existing site through site-info.php.

Props earnjam, simonwheatley.

Fixes #18117. Fixes #23865.

Location:
trunk
Files:
2 edited

Legend:

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

    r30656 r31155  
    297297    $update_details = array();
    298298    $fields = array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id');
    299     foreach ( array_intersect( array_keys( $details ), $fields ) as $field )
    300         $update_details[$field] = $details[$field];
     299    foreach ( array_intersect( array_keys( $details ), $fields ) as $field ) {
     300        if ( 'path' === $field ) {
     301            $details[ $field ] = array_filter( explode( '/', $details[ $field ] ) );
     302            $details[ $field ] = trailingslashit( '/' . implode( '/', $details[ $field ] ) );
     303        }
     304
     305        $update_details[ $field ] = $details[ $field ];
     306    }
    301307
    302308    $result = $wpdb->update( $wpdb->blogs, $update_details, array('blog_id' => $blog_id) );
  • trunk/tests/phpunit/tests/multisite/site.php

    r30786 r31155  
    344344
    345345        $this->assertEquals( 'example.com', $blog->domain );
    346         $this->assertEquals( 'my_path/', $blog->path );
     346        $this->assertEquals( '/my_path/', $blog->path );
    347347        $this->assertEquals( '0', $blog->spam );
    348348    }
     
    541541        global $test_action_counter;
    542542        $test_action_counter++;
     543    }
     544
     545    /**
     546     * When the path for a site is updated with update_blog_details(), the final
     547     * path should have a leading and trailing slash. When multiple directories
     548     * are part of the path, only one slash should separate each directory.
     549     *
     550     * @ticket 18117
     551     */
     552    function test_update_blog_details_single_path_no_slashes() {
     553        update_blog_details( 1, array( 'path' => 'my_path' ) );
     554        $blog = get_blog_details( 1 );
     555        $this->assertEquals( '/my_path/', $blog->path );
     556    }
     557
     558    function test_update_blog_details_single_path_double_trailing_slashes() {
     559        update_blog_details( 1, array( 'path' => 'my_path//' ) );
     560        $blog = get_blog_details( 1 );
     561        $this->assertEquals( '/my_path/', $blog->path );
     562    }
     563
     564    function test_update_blog_details_single_path_double_leading_slashes() {
     565        update_blog_details( 1, array( 'path' => '//my_path' ) );
     566        $blog = get_blog_details( 1 );
     567        $this->assertEquals( '/my_path/', $blog->path );
     568    }
     569
     570    function test_update_blog_details_single_path_single_trailing_slash() {
     571        update_blog_details( 1, array( 'path' => 'my_path/' ) );
     572        $blog = get_blog_details( 1 );
     573        $this->assertEquals( '/my_path/', $blog->path );
     574    }
     575
     576    function test_update_blog_details_single_path_single_leading_slashes() {
     577        update_blog_details( 1, array( 'path' => '/my_path' ) );
     578        $blog = get_blog_details( 1 );
     579        $this->assertEquals( '/my_path/', $blog->path );
     580    }
     581
     582    function test_update_blog_details_single_path_both_slashes() {
     583        update_blog_details( 1, array( 'path' => '/my_path/' ) );
     584        $blog = get_blog_details( 1 );
     585        $this->assertEquals( '/my_path/', $blog->path );
     586    }
     587
     588    function test_update_blog_details_multiple_paths_no_slashes() {
     589        update_blog_details( 1, array( 'path' => 'multiple/dirs' ) );
     590        $blog = get_blog_details( 1 );
     591        $this->assertEquals( '/multiple/dirs/', $blog->path );
     592    }
     593
     594    function test_update_blog_details_multiple_paths_middle_slashes() {
     595        update_blog_details( 1, array( 'path' => 'multiple///dirs' ) );
     596        $blog = get_blog_details( 1 );
     597        $this->assertEquals( '/multiple/dirs/', $blog->path );
     598    }
     599
     600    function test_update_blog_details_multiple_paths_leading_slash() {
     601        update_blog_details( 1, array( 'path' => '/multiple/dirs' ) );
     602        $blog = get_blog_details( 1 );
     603        $this->assertEquals( '/multiple/dirs/', $blog->path );
     604    }
     605
     606    function test_update_blog_details_multiple_paths_trailing_slash() {
     607        update_blog_details( 1, array( 'path' => 'multiple/dirs/' ) );
     608        $blog = get_blog_details( 1 );
     609        $this->assertEquals( '/multiple/dirs/', $blog->path );
     610    }
     611
     612    function test_update_blog_details_multiple_paths_both_slashes() {
     613        update_blog_details( 1, array( 'path' => '/multiple/dirs/' ) );
     614        $blog = get_blog_details( 1 );
     615        $this->assertEquals( '/multiple/dirs/', $blog->path );
    543616    }
    544617
Note: See TracChangeset for help on using the changeset viewer.