WordPress.org

Make WordPress Core

Ticket #38819: 38819.diff

File 38819.diff, 5.4 KB (added by dd32, 3 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    class WP_REST_Comments_Controller extend 
    360360        /**
    361361         * Checks if a given request has access to create a comment.
    362362         *
    363363         * @since 4.7.0
    364364         * @access public
    365365         *
    366366         * @param WP_REST_Request $request Full details about the request.
    367367         * @return WP_Error|bool True if the request has access to create items, error object otherwise.
    368368         */
    369369        public function create_item_permissions_check( $request ) {
    370370
    371371                if ( ! is_user_logged_in() && get_option( 'comment_registration' ) ) {
    372372                        return new WP_Error( 'rest_comment_login_required', __( 'Sorry, you must be logged in to comment.' ), array( 'status' => 401 ) );
    373373                }
    374374
    375                 // Limit who can set comment `author`, `karma` or `status` to anything other than the default.
     375                // Limit who can set comment `author`, `author_ip`, `karma` or `status` to anything other than the default.
    376376                if ( isset( $request['author'] ) && get_current_user_id() !== $request['author'] && ! current_user_can( 'moderate_comments' ) ) {
    377377                        return new WP_Error( 'rest_comment_invalid_author', __( 'Comment author invalid.' ), array( 'status' => rest_authorization_required_code() ) );
    378378                }
    379379
     380                if ( isset( $request['author_ip'] ) && !empty( $_SERVER['REMOTE_ADDR'] ) && $request['author_ip'] !== $_SERVER['REMOTE_ADDR'] && ! current_user_can( 'moderate_comments' ) ) {
     381                        return new WP_Error( 'rest_comment_invalid_author_ip', __( 'Sorry, you are not allowed to set author_ip for comments.' ), array( 'status' => rest_authorization_required_code() ) );
     382                }
     383
    380384                if ( isset( $request['karma'] ) && $request['karma'] > 0 && ! current_user_can( 'moderate_comments' ) ) {
    381385                        return new WP_Error( 'rest_comment_invalid_karma', __( 'Sorry, you are not allowed to set karma for comments.' ), array( 'status' => rest_authorization_required_code() ) );
    382386                }
    383387
    384388                if ( isset( $request['status'] ) && ! current_user_can( 'moderate_comments' ) ) {
    385389                        return new WP_Error( 'rest_comment_invalid_status', __( 'Sorry, you are not allowed to set status for comments.' ), array( 'status' => rest_authorization_required_code() ) );
    386390                }
    387391
    388392                if ( empty( $request['post'] ) && ! current_user_can( 'moderate_comments' ) ) {
    389393                        return new WP_Error( 'rest_comment_invalid_post_id', __( 'Sorry, you are not allowed to create this comment without a post.' ), array( 'status' => rest_authorization_required_code() ) );
    390394                }
    391395
    392396                if ( ! empty( $request['post'] ) && $post = get_post( (int) $request['post'] ) ) {
    393397                        if ( 'draft' === $post->post_status ) {
    394398                                return new WP_Error( 'rest_comment_draft_post', __( 'Sorry, you are not allowed to create a comment on this post.' ), array( 'status' => 403 ) );
    class WP_REST_Comments_Controller extend 
    10251029                        }
    10261030                }
    10271031
    10281032                if ( isset( $request['author_name'] ) ) {
    10291033                        $prepared_comment['comment_author'] = $request['author_name'];
    10301034                }
    10311035
    10321036                if ( isset( $request['author_email'] ) ) {
    10331037                        $prepared_comment['comment_author_email'] = $request['author_email'];
    10341038                }
    10351039
    10361040                if ( isset( $request['author_url'] ) ) {
    10371041                        $prepared_comment['comment_author_url'] = $request['author_url'];
    10381042                }
    10391043
    1040                 if ( isset( $request['author_ip'] ) ) {
     1044                if ( ! empty( $request['author_ip'] ) ) {
    10411045                        $prepared_comment['comment_author_IP'] = $request['author_ip'];
     1046                } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
     1047                        $prepared_comment['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
    10421048                }
    10431049
    10441050                if ( isset( $request['author_user_agent'] ) ) {
    10451051                        $prepared_comment['comment_agent'] = $request['author_user_agent'];
    10461052                }
    10471053
    10481054                if ( isset( $request['type'] ) ) {
    10491055                        // Comment type "comment" needs to be created as an empty string.
    10501056                        $prepared_comment['comment_type'] = 'comment' === $request['type'] ? '' : $request['type'];
    10511057                }
    10521058
    10531059                if ( isset( $request['karma'] ) ) {
    10541060                        $prepared_comment['comment_karma'] = $request['karma'] ;
    10551061                }
    10561062
    class WP_REST_Comments_Controller extend 
    11051111                                        'description'  => __( 'The id of the user object, if author was a user.' ),
    11061112                                        'type'         => 'integer',
    11071113                                        'context'      => array( 'view', 'edit', 'embed' ),
    11081114                                ),
    11091115                                'author_email'     => array(
    11101116                                        'description'  => __( 'Email address for the object author.' ),
    11111117                                        'type'         => 'string',
    11121118                                        'format'       => 'email',
    11131119                                        'context'      => array( 'edit' ),
    11141120                                ),
    11151121                                'author_ip'     => array(
    11161122                                        'description'  => __( 'IP address for the object author.' ),
    11171123                                        'type'         => 'string',
    11181124                                        'format'       => 'ipv4',
    11191125                                        'context'      => array( 'edit' ),
    1120                                         'default'      => '127.0.0.1',
     1126                                        'default'      => '127.0.0.1', // TODO: This default doesn't play nice with create_item_permission_check(), set default dynamically on callback?
    11211127                                ),
    11221128                                'author_name'     => array(
    11231129                                        'description'  => __( 'Display name for the object author.' ),
    11241130                                        'type'         => 'string',
    11251131                                        'context'      => array( 'view', 'edit', 'embed' ),
    11261132                                        'arg_options'  => array(
    11271133                                                'sanitize_callback' => 'sanitize_text_field',
    11281134                                        ),
    11291135                                ),
    11301136                                'author_url'       => array(
    11311137                                        'description'  => __( 'URL for the object author.' ),
    11321138                                        'type'         => 'string',
    11331139                                        'format'       => 'uri',
    11341140                                        'context'      => array( 'view', 'edit', 'embed' ),
    11351141                                ),