WordPress.org

Make WordPress Core

Ticket #38818: 38818.2.diff

File 38818.2.diff, 4.5 KB (added by danielbachhuber, 3 years ago)

Allow both IPv4 and IPv6 for 'ip' schema format

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

    diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
    index 741e768..c80c065 100644
    a b function rest_parse_request_arg( $value, $request, $param ) { 
    869869}
    870870
    871871/**
    872  * Determines if a IPv4 address is valid.
     872 * Determines if an IP address is valid.
    873873 *
    874  * Does not handle IPv6 addresses.
     874 * Handles both IPv4 and IPv6 addresses.
    875875 *
    876876 * @since 4.7.0
    877877 *
    878  * @param  string $ipv4 IP 32-bit address.
    879  * @return string|false The valid IPv4 address, otherwise false.
     878 * @param  string $ip IP address.
     879 * @return string|false The valid IP address, otherwise false.
    880880 */
    881 function rest_is_ip_address( $ipv4 ) {
    882         $pattern = '/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/';
    883 
    884         if ( ! preg_match( $pattern, $ipv4 ) ) {
    885                 return false;
    886         }
    887 
    888         return $ipv4;
     881function rest_is_ip_address( $ip ) {
     882        return filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) || filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 );
    889883}
    890884
    891885/**
    function rest_validate_value_from_schema( $value, $args, $param = '' ) { 
    10531047                                        return new WP_Error( 'rest_invalid_email', __( 'Invalid email address.' ) );
    10541048                                }
    10551049                                break;
    1056                         case 'ipv4' :
     1050                        case 'ip' :
    10571051                                if ( ! rest_is_ip_address( $value ) ) {
    1058                                         /* translators: %s: IP address */ 
     1052                                        /* translators: %s: IP address */
    10591053                                        return new WP_Error( 'rest_invalid_param', sprintf( __( '%s is not a valid IP address.' ), $value ) );
    10601054                                }
    10611055                                break;
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php
    index ccd172f..695dc6e 100644
    a b class WP_REST_Comments_Controller extends WP_REST_Controller { 
    11201120                                'author_ip'     => array(
    11211121                                        'description'  => __( 'IP address for the object author.' ),
    11221122                                        'type'         => 'string',
    1123                                         'format'       => 'ipv4',
     1123                                        'format'       => 'ip',
    11241124                                        'context'      => array( 'edit' ),
    11251125                                        'default'      => '127.0.0.1',
    11261126                                ),
  • 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 4e4a111..f504cb7 100644
    a b class WP_Test_REST_Schema_Validation extends WP_UnitTestCase { 
    8383                $this->assertWPError( rest_validate_value_from_schema( '2016-06-30', $schema ) );
    8484        }
    8585
    86         public function test_format_ipv4() {
     86        public function test_format_ip() {
    8787                $schema = array(
    8888                        'type'  => 'string',
    89                         'format' => 'ipv4',
     89                        'format' => 'ip',
    9090                );
     91
     92                // IPv4.
    9193                $this->assertTrue( rest_validate_value_from_schema( '127.0.0.1', $schema ) );
    9294                $this->assertWPError( rest_validate_value_from_schema( '3333.3333.3333.3333', $schema ) );
    9395                $this->assertWPError( rest_validate_value_from_schema( '1', $schema ) );
     96
     97                // IPv6.
     98                $this->assertTrue( rest_validate_value_from_schema( '::1', $schema ) ); // Loopback, compressed, non-routable.
     99                $this->assertTrue( rest_validate_value_from_schema( '::', $schema ) ); // Unspecified, compressed, non-routable.
     100                $this->assertTrue( rest_validate_value_from_schema( '0:0:0:0:0:0:0:1', $schema ) ); // Loopback, full.
     101                $this->assertTrue( rest_validate_value_from_schema( '0:0:0:0:0:0:0:0', $schema ) ); // Unspecified, full.
     102                $this->assertTrue( rest_validate_value_from_schema( '2001:DB8:0:0:8:800:200C:417A', $schema ) ); // Unicast, full.
     103                $this->assertTrue( rest_validate_value_from_schema( 'FF01:0:0:0:0:0:0:101', $schema ) ); // Multicast, full.
     104                $this->assertTrue( rest_validate_value_from_schema( '2001:DB8::8:800:200C:417A', $schema ) ); // Unicast, compressed.
     105                $this->assertTrue( rest_validate_value_from_schema( 'FF01::101', $schema ) ); // Multicast, compressed.
     106                $this->assertTrue( rest_validate_value_from_schema( 'fe80::217:f2ff:fe07:ed62', $schema ) );
     107                $this->assertWPError( rest_validate_value_from_schema( '', $schema ) ); // Empty string.
     108                $this->assertWPError( rest_validate_value_from_schema( '2001:DB8:0:0:8:800:200C:417A:221', $schema ) ); // Unicast, full.
     109                $this->assertWPError( rest_validate_value_from_schema( 'FF01::101::2', $schema ) ); // Multicast, compressed.
    94110        }
    95111
    96112        public function test_type_array() {