WordPress.org

Make WordPress Core

Ticket #49270: 49270.3.diff

File 49270.3.diff, 3.8 KB (added by spacedmonkey, 8 months ago)
  • src/wp-includes/rest-api.php

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 8fbf4b1342..d517916fbe 100644
    a b function rest_parse_date( $date, $force_utc = false ) { 
    966966        return strtotime( $date );
    967967}
    968968
     969/**
     970 * Parses an 3 or 6 digit hex color (with #).
     971 *
     972 * @since 5.4.0
     973 *
     974 * @param string $color 3 or 6 digit hex color (with #).
     975 * @return string|boolean
     976 */
     977function rest_parse_hex_color( $color ) {
     978        $regex = '|^#([A-Fa-f0-9]{3}){1,2}$|';
     979        if ( ! preg_match( $regex, $color, $matches ) ) {
     980                return false;
     981        }
     982
     983        return $color;
     984}
     985
    969986/**
    970987 * Parses a date into both its local and UTC equivalent, in MySQL datetime format.
    971988 *
    function rest_validate_value_from_schema( $value, $args, $param = '' ) { 
    13141331
    13151332        if ( isset( $args['format'] ) ) {
    13161333                switch ( $args['format'] ) {
     1334                        case 'hex-color':
     1335                                if ( ! rest_parse_hex_color( $value ) ) {
     1336                                        return new WP_Error( 'rest_invalid_color', __( 'Invalid color.' ) );
     1337                                }
     1338                                break;
     1339
    13171340                        case 'date-time':
    13181341                                if ( ! rest_parse_date( $value ) ) {
    13191342                                        return new WP_Error( 'rest_invalid_date', __( 'Invalid date.' ) );
    function rest_sanitize_value_from_schema( $value, $args ) { 
    14701493
    14711494        if ( isset( $args['format'] ) ) {
    14721495                switch ( $args['format'] ) {
     1496                        case 'hex-color':
     1497                                return sanitize_hex_color( $value );
     1498
    14731499                        case 'date-time':
    14741500                                return sanitize_text_field( $value );
    14751501
  • tests/phpunit/tests/rest-api/rest-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-controller.php b/tests/phpunit/tests/rest-api/rest-controller.php
    index 91e1d0c5b7..4877c04274 100644
    a b class WP_Test_REST_Controller extends WP_Test_REST_TestCase { 
    166166                );
    167167        }
    168168
     169        /**
     170         * @ticket 49270
     171         */
     172        public function test_validate_schema_format_hex_color() {
     173
     174                $this->assertTrue(
     175                        rest_validate_request_arg( '#000000', $this->request, 'somehex' )
     176                );
     177
     178                $this->assertErrorResponse(
     179                        'rest_invalid_color',
     180                        rest_validate_request_arg( 'blue', $this->request, 'somehex' )
     181                );
     182        }
     183
    169184        public function test_validate_schema_format_date_time() {
    170185
    171186                $this->assertTrue(
  • tests/phpunit/tests/rest-api/rest-schema-validation.php

    diff --git a/tests/phpunit/tests/rest-api/rest-schema-validation.php b/tests/phpunit/tests/rest-api/rest-schema-validation.php
    index 9c18a846dc..ba04c443ea 100644
    a b class WP_Test_REST_Schema_Validation extends WP_UnitTestCase { 
    7272                $this->assertWPError( rest_validate_value_from_schema( 'email', $schema ) );
    7373        }
    7474
     75        /**
     76         * @ticket 45098
     77         */
     78        public function test_format_hex_color() {
     79                $schema = array(
     80                        'type'   => 'string',
     81                        'format' => 'hex-color',
     82                );
     83                $this->assertTrue( rest_validate_value_from_schema( '#000000', $schema ) );
     84                $this->assertTrue( rest_validate_value_from_schema( '#FFF', $schema ) );
     85                $this->assertWPError( rest_validate_value_from_schema( 'wordpress', $schema ) );
     86        }
     87
    7588        public function test_format_date_time() {
    7689                $schema = array(
    7790                        'type'   => 'string',
  • tests/phpunit/tests/rest-api/rest-test-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-test-controller.php b/tests/phpunit/tests/rest-api/rest-test-controller.php
    index b79e7cf59b..d90f87297a 100644
    a b class WP_REST_Test_Controller extends WP_REST_Controller { 
    6464                                        'format'  => 'email',
    6565                                        'context' => array( 'view' ),
    6666                                ),
     67                                'somehex'      => array(
     68                                        'type'    => 'string',
     69                                        'format'  => 'hex-color',
     70                                        'context' => array( 'view' ),
     71                                ),
    6772                                'someenum'       => array(
    6873                                        'type'    => 'string',
    6974                                        'enum'    => array( 'a', 'b', 'c' ),