WordPress.org

Make WordPress Core

Ticket #37560: 37560.2.diff

File 37560.2.diff, 3.8 KB (added by rmccue, 4 years ago)

Updated patch with tests

  • src/wp-includes/rest-api/class-wp-rest-request.php

     
    780780         * @since 4.4.0
    781781         * @access public
    782782         *
    783          * @return true|null True if there are no parameters to sanitize, null otherwise.
     783         * @return true|WP_Error True if parameters were sanitized, WP_Error if an error occurred during sanitization.
    784784         */
    785785        public function sanitize_params() {
    786 
    787786                $attributes = $this->get_attributes();
    788787
    789788                // No arguments set, skip sanitizing.
     
    793792
    794793                $order = $this->get_parameter_order();
    795794
     795                $invalid_params = array();
     796
    796797                foreach ( $order as $type ) {
    797798                        if ( empty( $this->params[ $type ] ) ) {
    798799                                continue;
    799800                        }
    800801                        foreach ( $this->params[ $type ] as $key => $value ) {
    801802                                // Check if this param has a sanitize_callback added.
    802                                 if ( isset( $attributes['args'][ $key ] ) && ! empty( $attributes['args'][ $key ]['sanitize_callback'] ) ) {
    803                                         $this->params[ $type ][ $key ] = call_user_func( $attributes['args'][ $key ]['sanitize_callback'], $value, $this, $key );
     803                                if ( ! isset( $attributes['args'][ $key ] ) || empty( $attributes['args'][ $key ]['sanitize_callback'] ) ) {
     804                                        continue;
    804805                                }
     806
     807                                $sanitized_value = call_user_func( $attributes['args'][ $key ]['sanitize_callback'], $value, $this, $key );
     808
     809                                if ( is_wp_error( $sanitized_value ) ) {
     810                                        $invalid_params[ $key ] = $sanitized_value->get_error_message();
     811                                } else {
     812                                        $this->params[ $type ][ $key ] = $sanitized_value;
     813                                }
    805814                        }
    806815                }
    807                 return null;
     816
     817                if ( $invalid_params ) {
     818                        return new WP_Error( 'rest_invalid_param', sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', array_keys( $invalid_params ) ) ), array( 'status' => 400, 'params' => $invalid_params ) );
     819                }
     820
     821                return true;
    808822        }
    809823
    810824        /**
     
    817831         *                       WP_Error if required parameters are missing.
    818832         */
    819833        public function has_valid_params() {
    820 
    821834                $attributes = $this->get_attributes();
    822835                $required = array();
    823836
  • src/wp-includes/rest-api/class-wp-rest-server.php

     
    866866                                        $check_required = $request->has_valid_params();
    867867                                        if ( is_wp_error( $check_required ) ) {
    868868                                                $response = $check_required;
     869                                        } else {
     870                                                $check_sanitized = $request->sanitize_params();
     871                                                if ( is_wp_error( $check_sanitized ) ) {
     872                                                        $response = $check_sanitized;
     873                                                }
    869874                                        }
    870 
    871                                         $request->sanitize_params();
    872875                                }
    873876
    874877                                if ( ! is_wp_error( $response ) ) {
  • tests/phpunit/tests/rest-api/rest-request.php

     
    309309                $this->assertEquals( 0, $this->request->get_param( 'somestring' ) );
    310310        }
    311311
     312        public function test_sanitize_params_error() {
     313                $this->request->set_url_params( array(
     314                        'successparam' => '123',
     315                        'failparam'    => '123',
     316                ));
     317                $this->request->set_attributes( array(
     318                        'args' => array(
     319                                'successparam' => array(
     320                                        'sanitize_callback' => 'absint',
     321                                ),
     322                                'failparam' => array(
     323                                        'sanitize_callback' => array( $this, '_return_wp_error_on_validate_callback' ),
     324                                ),
     325                        ),
     326                ));
     327
     328                $valid = $this->request->sanitize_params();
     329                $this->assertWPError( $valid );
     330                $this->assertEquals( 'rest_invalid_param', $valid->get_error_code() );
     331        }
     332
    312333        public function test_has_valid_params_required_flag() {
    313334                $this->request->set_attributes( array(
    314335                        'args' => array(