Make WordPress Core

Changeset 39444 for trunk


Ignore:
Timestamp:
12/02/2016 10:43:03 PM (10 years ago)
Author:
rachelbaker
Message:

REST API: Fix bug where comment author and author email could be an empty string when creating a comment.

If the require_name_email option is true, creating a comment with an empty string for the author name or email should not be accepted. Both values can be an empty string on update.

Props flixos90, hnle, dd32, rachelbaker, jnylen0, ChopinBach, joehoyle, pento.

Fixes #38971.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    r39349 r39444  
    509509                // Honor the discussion setting that requires a name and email address of the comment author.
    510510                if ( get_option( 'require_name_email' ) ) {
    511                         if ( ! isset( $prepared_comment['comment_author'] ) && ! isset( $prepared_comment['comment_author_email'] ) ) {
     511                        if ( empty( $prepared_comment['comment_author'] ) || empty( $prepared_comment['comment_author_email'] ) ) {
    512512                                return new WP_Error( 'rest_comment_author_data_required', __( 'Creating a comment requires valid author name and email values.' ), array( 'status' => 400 ) );
    513                         }
    514 
    515                         if ( ! isset( $prepared_comment['comment_author'] ) ) {
    516                                 return new WP_Error( 'rest_comment_author_required', __( 'Creating a comment requires a valid author name.' ), array( 'status' => 400 ) );
    517                         }
    518 
    519                         if ( ! isset( $prepared_comment['comment_author_email'] ) ) {
    520                                 return new WP_Error( 'rest_comment_author_email_required', __( 'Creating a comment requires a valid author email.' ), array( 'status' => 400 ) );
    521513                        }
    522514                }
     
    11561148                                        'format'       => 'email',
    11571149                                        'context'      => array( 'edit' ),
     1150                                        'arg_options'  => array(
     1151                                                'sanitize_callback' => array( $this, 'check_comment_author_email' ),
     1152                                                'validate_callback' => null, // skip built-in validation of 'email'.
     1153                                        ),
    11581154                                ),
    11591155                                'author_ip'     => array(
     
    15821578                return current_user_can( 'edit_comment', $comment->comment_ID );
    15831579        }
     1580
     1581        /**
     1582         * Checks a comment author email for validity.
     1583         *
     1584         * Accepts either a valid email address or empty string as a valid comment
     1585         * author email address. Setting the comment author email to an empty
     1586         * string is allowed when a comment is being updated.
     1587         *
     1588         * @since 4.7.0
     1589         *
     1590         * @param string          $value   Author email value submitted.
     1591         * @param WP_REST_Request $request Full details about the request.
     1592         * @param string          $param   The parameter name.
     1593         * @return WP_Error|string The sanitized email address, if valid,
     1594         *                         otherwise an error.
     1595         */
     1596        public function check_comment_author_email( $value, $request, $param ) {
     1597                $email = (string) $value;
     1598                if ( empty( $email ) ) {
     1599                        return $email;
     1600                }
     1601
     1602                $check_email = rest_validate_request_arg( $email, $request, $param );
     1603                if ( is_wp_error( $check_email ) ) {
     1604                        return $check_email;
     1605                }
     1606
     1607                return $email;
     1608        }
    15841609}
  • trunk/tests/phpunit/tests/rest-api/rest-comments-controller.php

    r39375 r39444  
    9696                        update_site_option( 'site_admins', array( 'superadmin' ) );
    9797                }
    98         }
    99 
    100         public function tearDown() {
    101                 parent::tearDown();
    10298        }
    10399
     
    988984        }
    989985
    990         public function test_create_comment_missing_required_author_name_and_email_per_option_value() {
     986        public function test_create_comment_missing_required_author_name() {
    991987                add_filter( 'rest_allow_anonymous_comments', '__return_true' );
    992                 update_option( 'require_name_email', 1 );
    993 
    994                 $params = array(
    995                         'post'    => self::$post_id,
    996                         'content' => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
    997                 );
    998 
    999                 $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
    1000                 $request->add_header( 'content-type', 'application/json' );
    1001                 $request->set_body( wp_json_encode( $params ) );
    1002 
    1003                 $response = $this->server->dispatch( $request );
    1004 
    1005                 $this->assertErrorResponse( 'rest_comment_author_data_required', $response, 400 );
    1006 
    1007                 update_option( 'require_name_email', 0 );
    1008         }
    1009 
    1010         public function test_create_comment_missing_required_author_name_per_option_value() {
    1011                 wp_set_current_user( self::$admin_id );
    1012988                update_option( 'require_name_email', 1 );
    1013989
     
    1023999
    10241000                $response = $this->server->dispatch( $request );
    1025                 $this->assertErrorResponse( 'rest_comment_author_required', $response, 400 );
    1026 
    1027                 update_option( 'require_name_email', 0 );
    1028         }
    1029 
    1030         public function test_create_comment_missing_required_author_email_per_option_value() {
     1001
     1002                $this->assertErrorResponse( 'rest_comment_author_data_required', $response, 400 );
     1003        }
     1004
     1005        public function test_create_comment_empty_required_author_name() {
     1006                add_filter( 'rest_allow_anonymous_comments', '__return_true' );
     1007                update_option( 'require_name_email', 1 );
     1008
     1009                $params = array(
     1010                        'author_name'  => '',
     1011                        'author_email' => 'ekrabappel@springfield-elementary.edu',
     1012                        'post'         => self::$post_id,
     1013                        'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     1014                );
     1015
     1016                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     1017                $request->add_header( 'content-type', 'application/json' );
     1018                $request->set_body( wp_json_encode( $params ) );
     1019
     1020                $response = $this->server->dispatch( $request );
     1021
     1022                $this->assertErrorResponse( 'rest_comment_author_data_required', $response, 400 );
     1023        }
     1024
     1025        public function test_create_comment_missing_required_author_email() {
    10311026                wp_set_current_user( self::$admin_id );
    10321027                update_option( 'require_name_email', 1 );
     
    10431038
    10441039                $response = $this->server->dispatch( $request );
    1045                 $this->assertErrorResponse( 'rest_comment_author_email_required', $response, 400 );
    1046 
    1047                 update_option( 'require_name_email', 0 );
     1040                $this->assertErrorResponse( 'rest_comment_author_data_required', $response, 400 );
     1041        }
     1042
     1043        public function test_create_comment_empty_required_author_email() {
     1044                wp_set_current_user( self::$admin_id );
     1045                update_option( 'require_name_email', 1 );
     1046
     1047                $params = array(
     1048                        'post'         => self::$post_id,
     1049                        'author_name'  => 'Edna Krabappel',
     1050                        'author_email' => '',
     1051                        'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     1052                );
     1053
     1054                $request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
     1055                $request->add_header( 'content-type', 'application/json' );
     1056                $request->set_body( wp_json_encode( $params ) );
     1057
     1058                $response = $this->server->dispatch( $request );
     1059                $this->assertErrorResponse( 'rest_comment_author_data_required', $response, 400 );
    10481060        }
    10491061
     
    19912003                $this->assertEquals( $params['date_gmt'], $comment['date_gmt'] );
    19922004                $this->assertEquals( $params['date_gmt'], mysql_to_rfc3339( $updated->comment_date_gmt ) );
     2005        }
     2006
     2007        public function test_update_comment_author_email_only() {
     2008                wp_set_current_user( self::$editor_id );
     2009                update_option( 'require_name_email', 1 );
     2010
     2011                $params = array(
     2012                        'post'         => self::$post_id,
     2013                        'author_email' => 'ekrabappel@springfield-elementary.edu',
     2014                        'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     2015                );
     2016
     2017                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     2018                $request->add_header( 'content-type', 'application/json' );
     2019                $request->set_body( wp_json_encode( $params ) );
     2020
     2021                $response = $this->server->dispatch( $request );
     2022                $this->assertEquals( 200, $response->get_status() );
     2023        }
     2024
     2025        public function test_update_comment_empty_author_name() {
     2026                wp_set_current_user( self::$editor_id );
     2027                update_option( 'require_name_email', 1 );
     2028
     2029                $params = array(
     2030                        'author_name'  => '',
     2031                        'author_email' => 'ekrabappel@springfield-elementary.edu',
     2032                        'post'         => self::$post_id,
     2033                        'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     2034                );
     2035
     2036                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     2037                $request->add_header( 'content-type', 'application/json' );
     2038                $request->set_body( wp_json_encode( $params ) );
     2039
     2040                $response = $this->server->dispatch( $request );
     2041                $this->assertEquals( 200, $response->get_status() );
     2042        }
     2043
     2044        public function test_update_comment_author_name_only() {
     2045                wp_set_current_user( self::$admin_id );
     2046                update_option( 'require_name_email', 1 );
     2047
     2048                $params = array(
     2049                        'post'        => self::$post_id,
     2050                        'author_name' => 'Edna Krabappel',
     2051                        'content'     => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     2052                );
     2053
     2054                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     2055                $request->add_header( 'content-type', 'application/json' );
     2056                $request->set_body( wp_json_encode( $params ) );
     2057
     2058                $response = $this->server->dispatch( $request );
     2059                $this->assertEquals( 200, $response->get_status() );
     2060        }
     2061
     2062        public function test_update_comment_empty_author_email() {
     2063                wp_set_current_user( self::$admin_id );
     2064                update_option( 'require_name_email', 1 );
     2065
     2066                $params = array(
     2067                        'post'         => self::$post_id,
     2068                        'author_name'  => 'Edna Krabappel',
     2069                        'author_email' => '',
     2070                        'content'      => 'Now, I don\'t want you to worry class. These tests will have no affect on your grades. They merely determine your future social status and financial success. If any.',
     2071                );
     2072
     2073                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     2074                $request->add_header( 'content-type', 'application/json' );
     2075                $request->set_body( wp_json_encode( $params ) );
     2076
     2077                $response = $this->server->dispatch( $request );
     2078                $this->assertEquals( 200, $response->get_status() );
     2079        }
     2080
     2081        public function test_update_comment_author_email_too_short() {
     2082                wp_set_current_user( self::$admin_id );
     2083
     2084                $params = array(
     2085                        'post'         => self::$post_id,
     2086                        'author_name'  => 'Homer J. Simpson',
     2087                        'author_email' => 'a@b',
     2088                        'content'      => 'in this house, we obey the laws of thermodynamics!',
     2089                );
     2090
     2091                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
     2092                $request->add_header( 'content-type', 'application/json' );
     2093                $request->set_body( wp_json_encode( $params ) );
     2094                $response = $this->server->dispatch( $request );
     2095
     2096                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     2097                $data = $response->get_data();
     2098                $this->assertArrayHasKey( 'author_email', $data['data']['params'] );
    19932099        }
    19942100
Note: See TracChangeset for help on using the changeset viewer.