Make WordPress Core

Changeset 58022


Ignore:
Timestamp:
04/18/2024 03:15:50 AM (2 years ago)
Author:
peterwilsoncc
Message:

Upgrade/Install: Validate source & destination values in WP_Ugrader.

Adds a missing string and some additional validation of paths in the upgrader class.

Follow up to [56992].

Props costdev, jipmoors, karlijnbok, swissspidy, afragen, mukesh27.
Fixes #59712.

Location:
trunk
Files:
2 edited

Legend:

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

    r56550 r58022  
    197197                $this->strings['fs_no_folder'] = __( 'Unable to locate needed folder (%s).' );
    198198
     199                $this->strings['no_package']           = __( 'Package not available.' );
    199200                $this->strings['download_failed']      = __( 'Download failed.' );
    200201                $this->strings['installing_package']   = __( 'Installing the latest version…' );
     
    528529                }
    529530
    530                 if ( empty( $source ) || empty( $destination ) ) {
     531                if (
     532                        ( ! is_string( $source ) || '' === $source || trim( $source ) !== $source ) ||
     533                        ( ! is_string( $destination ) || '' === $destination || trim( $destination ) !== $destination )
     534                ) {
    531535                        return new WP_Error( 'bad_request', $this->strings['bad_request'] );
    532536                }
  • trunk/tests/phpunit/tests/admin/wpUpgrader.php

    r56992 r58022  
    138138                                'fs_no_themes_dir',
    139139                                'fs_no_folder',
     140                                'no_package',
    140141                                'download_failed',
    141142                                'installing_package',
     
    778779        public function data_install_package_invalid_paths() {
    779780                return array(
    780                         'empty string' => array( 'path' => '' ),
     781                        'empty string'                   => array( 'path' => '' ),
    781782
    782783                        // Type checks.
    783                         'empty array'  => array( 'path' => array() ),
    784                         '(int) 0'      => array( 'path' => 0 ),
    785                         '(int) -0'     => array( 'path' => -0 ),
    786                         '(float) 0.0'  => array( 'path' => 0.0 ),
    787                         '(float) -0.0' => array( 'path' => -0.0 ),
    788                         '(bool) false' => array( 'path' => false ),
    789                         'null'         => array( 'path' => null ),
     784                        'empty array'                    => array( 'path' => array() ),
     785                        'populated array'                => array( 'path' => array( '/' ) ),
     786                        '(int) 0'                        => array( 'path' => 0 ),
     787                        '(int) -0'                       => array( 'path' => -0 ),
     788                        '(int) -1'                       => array( 'path' => -1 ),
     789                        '(int) 1'                        => array( 'path' => 1 ),
     790                        '(float) 0.0'                    => array( 'path' => 0.0 ),
     791                        '(float) -0.0'                   => array( 'path' => -0.0 ),
     792                        '(float) 1.0'                    => array( 'path' => 1.0 ),
     793                        '(float) -1.0'                   => array( 'path' => -1.0 ),
     794                        '(bool) false'                   => array( 'path' => false ),
     795                        '(bool) true'                    => array( 'path' => true ),
     796                        'null'                           => array( 'path' => null ),
     797                        'empty object'                   => array( 'path' => new stdClass() ),
     798                        'populated object'               => array( 'path' => (object) array( '/' ) ),
     799
     800                        // Ensures that `trim()` is run triggering an empty array.
     801                        'a string with spaces'           => array( 'path' => '   ' ),
     802                        'a string with tabs'             => array( 'path' => "\t\t" ),
     803                        'a string with new lines'        => array( 'path' => "\n\n" ),
     804                        'a string with carriage returns' => array( 'path' => "\r\r" ),
     805
     806                        // Ensure that strings with leading/trailing whitespace are invalid.
     807                        'a path with a leading space'    => array( 'path' => ' /path' ),
     808                        'a path with a trailing space'   => array( 'path' => '/path ' ),
     809                        'a path with a leading tab'      => array( 'path' => "\t/path" ),
     810                        'a path with a trailing tab'     => array( 'path' => "/path\t" ),
    790811                );
    791812        }
     
    15581579
    15591580        /**
     1581         * Tests that `WP_Upgrader::download_package()` returns a WP_Error object
     1582         * for an empty package.
     1583         *
     1584         * @ticket 59712
     1585         *
     1586         * @covers WP_Upgrader::download_package
     1587         */
     1588        public function test_download_package_should_return_a_wp_error_object_for_an_empty_package() {
     1589                self::$instance->init();
     1590
     1591                $result = self::$instance->download_package( '' );
     1592
     1593                $this->assertWPError(
     1594                        $result,
     1595                        'WP_Upgrader::download_package() did not return a WP_Error object'
     1596                );
     1597
     1598                $this->assertSame(
     1599                        'no_package',
     1600                        $result->get_error_code(),
     1601                        'Unexpected WP_Error code'
     1602                );
     1603        }
     1604
     1605        /**
    15601606         * Tests that `WP_Upgrader::download_package()` returns a file with the
    15611607         * package name in it.
Note: See TracChangeset for help on using the changeset viewer.