WordPress.org

Make WordPress Core

Ticket #42069: 42069.7.diff

File 42069.7.diff, 4.2 KB (added by TimothyBlynJacobs, 3 years ago)
  • src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

    diff --git a/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php b/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php
    index 059f78c6e8..a24a5f649c 100644
    a b abstract class WP_REST_Meta_Fields { 
    317317                        );
    318318                }
    319319
    320                 $meta_key   = wp_slash( $meta_key );
    321                 $meta_value = wp_slash( $value );
    322 
    323320                // Do the exact same check for a duplicate value as in update_metadata() to avoid update_metadata() returning false.
    324321                $old_value = get_metadata( $meta_type, $object_id, $meta_key );
     322                $subtype   = get_object_subtype( $meta_type, $object_id );
    325323
    326324                if ( 1 === count( $old_value ) ) {
    327                         if ( $old_value[0] === $meta_value ) {
     325                        if ( (string) sanitize_meta( $meta_key, $value, $meta_type, $subtype ) === $old_value[0] ) {
    328326                                return true;
    329327                        }
    330328                }
    331329
    332                 if ( ! update_metadata( $meta_type, $object_id, $meta_key, $meta_value ) ) {
     330                if ( ! update_metadata( $meta_type, $object_id, wp_slash( $meta_key ), wp_slash( $value ) ) ) {
    333331                        return new WP_Error(
    334332                                'rest_meta_database_error',
    335333                                __( 'Could not update meta value in database.' ),
  • tests/phpunit/tests/rest-api/rest-post-meta-fields.php

    diff --git a/tests/phpunit/tests/rest-api/rest-post-meta-fields.php b/tests/phpunit/tests/rest-api/rest-post-meta-fields.php
    index 2b09d994d1..57ec3f4375 100644
    a b class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    192192                        )
    193193                );
    194194
     195                register_meta(
     196                        'post', 'test_boolean_update', array(
     197                                'single'            => true,
     198                                'type'              => 'boolean',
     199                                'sanitize_callback' => 'absint',
     200                                'show_in_rest'      => true,
     201                        )
     202                );
     203
     204                register_meta(
     205                        'post', 'test_textured_text_update', array(
     206                                'single'            => true,
     207                                'type'              => 'string',
     208                                'sanitize_callback' => 'sanitize_text_field',
     209                                'show_in_rest'      => true,
     210                        )
     211                );
     212
     213                register_meta(
     214                        'post', 'test_json_encoded', array(
     215                                'single'       => true,
     216                                'type'         => 'string',
     217                                'show_in_rest' => true,
     218                        )
     219                );
     220
     221                register_meta(
     222                        'post', 'test\'slashed\'key', array(
     223                                'single'       => true,
     224                                'type'         => 'string',
     225                                'show_in_rest' => true,
     226                        )
     227                );
     228
    195229                /** @var WP_REST_Server $wp_rest_server */
    196230                global $wp_rest_server;
    197231                $wp_rest_server = new Spy_REST_Server;
    class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    12551289                return $data;
    12561290        }
    12571291
     1292        /**
     1293         * @ticket 42069
     1294         * @dataProvider data_update_value_return_success_with_same_value
     1295         */
     1296        public function test_update_value_return_success_with_same_value( $meta_key, $meta_value ) {
     1297                add_post_meta( self::$post_id, $meta_key, $meta_value );
     1298
     1299                $this->grant_write_permission();
     1300
     1301                $data = array(
     1302                        'meta' => array(
     1303                                $meta_key => $meta_value,
     1304                        ),
     1305                );
     1306
     1307                $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     1308                $request->set_body_params( $data );
     1309
     1310                $response = rest_get_server()->dispatch( $request );
     1311
     1312                $this->assertEquals( 200, $response->get_status() );
     1313        }
     1314
     1315        public function data_update_value_return_success_with_same_value() {
     1316                return array(
     1317                        array( 'test_boolean_update', false ),
     1318                        array( 'test_boolean_update', true ),
     1319                        array( 'test_textured_text_update', 'She said, "What about the > 10,000 penguins in the kitchen?"' ),
     1320                        array( 'test_textured_text_update', "He's about to do something rash..." ),
     1321                        array( 'test_json_encoded', json_encode( array( 'foo' => 'bar' ) ) ),
     1322                        array( 'test\'slashed\'key', 'Hello' ),
     1323                );
     1324        }
     1325
     1326        public function test_slashed_meta_key() {
     1327
     1328                add_post_meta( self::$post_id, 'test\'slashed\'key', 'Hello' );
     1329
     1330                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     1331
     1332                $response = rest_get_server()->dispatch( $request );
     1333                $data     = $response->get_data();
     1334
     1335                $this->assertArrayHasKey( 'test\'slashed\'key', $data['meta'] );
     1336                $this->assertEquals( 'Hello', $data['meta']['test\'slashed\'key'] );
     1337        }
     1338
    12581339        /**
    12591340         * Internal function used to disable an insert query which
    12601341         * will trigger a wpdb error for testing purposes.