WordPress.org

Make WordPress Core

Ticket #38692: 38692.2.diff

File 38692.2.diff, 8.0 KB (added by flixos90, 4 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

     
    108108                        foreach ( (array) $request['post'] as $post_id ) {
    109109                                $post = get_post( $post_id );
    110110
    111                                 if ( ! empty( $post_id ) && $post && ! $this->check_read_post_permission( $post ) ) {
     111                                if ( ! empty( $post_id ) && $post && ! $this->check_read_post_permission( $post, $request ) ) {
    112112                                        return new WP_Error( 'rest_cannot_read_post', __( 'Sorry, you are not allowed to read the post for this comment.' ), array( 'status' => rest_authorization_required_code() ) );
    113113                                } elseif ( 0 === $post_id && ! current_user_can( 'moderate_comments' ) ) {
    114114                                        return new WP_Error( 'rest_cannot_read', __( 'Sorry, you are not allowed to read comments without a post.' ), array( 'status' => rest_authorization_required_code() ) );
     
    242242                $comments = array();
    243243
    244244                foreach ( $query_result as $comment ) {
    245                         if ( ! $this->check_read_permission( $comment ) ) {
     245                        if ( ! $this->check_read_permission( $comment, $request ) ) {
    246246                                continue;
    247247                        }
    248248
     
    309309                        return true;
    310310                }
    311311
    312                 if ( ! $this->check_read_permission( $comment ) ) {
    313                         return new WP_Error( 'rest_cannot_read', __( 'Sorry, you are not allowed to read this comment.' ), array( 'status' => rest_authorization_required_code() ) );
     312                if ( ! empty( $request['context'] ) && 'edit' === $request['context'] && ! current_user_can( 'moderate_comments' ) ) {
     313                        return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit comments.' ), array( 'status' => rest_authorization_required_code() ) );
    314314                }
    315315
    316316                $post = get_post( $comment->comment_post_ID );
    317317
    318                 if ( $post && ! $this->check_read_post_permission( $post ) ) {
    319                         return new WP_Error( 'rest_cannot_read_post', __( 'Sorry, you are not allowed to read the post for this comment.' ), array( 'status' => rest_authorization_required_code() ) );
     318                if ( ! $this->check_read_permission( $comment, $request ) ) {
     319                        return new WP_Error( 'rest_cannot_read', __( 'Sorry, you are not allowed to read this comment.' ), array( 'status' => rest_authorization_required_code() ) );
    320320                }
    321321
    322                 if ( ! empty( $request['context'] ) && 'edit' === $request['context'] && ! current_user_can( 'moderate_comments' ) ) {
    323                         return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit comments.' ), array( 'status' => rest_authorization_required_code() ) );
     322                if ( $post && ! $this->check_read_post_permission( $post, $request ) ) {
     323                        return new WP_Error( 'rest_cannot_read_post', __( 'Sorry, you are not allowed to read the post for this comment.' ), array( 'status' => rest_authorization_required_code() ) );
    324324                }
    325325
    326326                return true;
     
    433433                        return new WP_Error( 'rest_comment_trash_post', __( 'Sorry, you are not allowed to create a comment on this post.' ), array( 'status' => 403 ) );
    434434                }
    435435
    436                 if ( ! $this->check_read_post_permission( $post ) ) {
     436                if ( ! $this->check_read_post_permission( $post, $request ) ) {
    437437                        return new WP_Error( 'rest_cannot_read_post', __( 'Sorry, you are not allowed to read the post for this comment.' ), array( 'status' => rest_authorization_required_code() ) );
    438438                }
    439439
     
    14881488         * @since 4.7.0
    14891489         * @access protected
    14901490         *
    1491          * @param WP_Post $post Post Object.
     1491         * @param WP_Post         $post    Post object.
     1492         * @param WP_REST_Request $request Request data to check.
    14921493         * @return bool Whether post can be read.
    14931494         */
    1494         protected function check_read_post_permission( $post ) {
     1495        protected function check_read_post_permission( $post, $request ) {
    14951496                $posts_controller = new WP_REST_Posts_Controller( $post->post_type );
    14961497                $post_type = get_post_type_object( $post->post_type );
    14971498
     1499                $has_password_filter = false;
     1500
     1501                if ( $posts_controller->can_access_password_content( $post, $request ) ) {
     1502                        add_filter( 'post_password_required', '__return_false' );
     1503
     1504                        $has_password_filter = true;
     1505                }
     1506
    14981507                if ( post_password_required( $post ) ) {
    1499                         return current_user_can( $post_type->cap->edit_post, $post->ID );
     1508                        $result = current_user_can( $post_type->cap->edit_post, $post->ID );
     1509                } else {
     1510                        $result = $posts_controller->check_read_permission( $post );
    15001511                }
    15011512
    1502                 return $posts_controller->check_read_permission( $post );
     1513                if ( $has_password_filter ) {
     1514                        remove_filter( 'post_password_required', '__return_false' );
     1515                }
     1516
     1517                return $result;
    15031518        }
    15041519
    15051520        /**
     
    15081523         * @since 4.7.0
    15091524         * @access protected
    15101525         *
    1511          * @param WP_Comment $comment Comment object.
     1526         * @param WP_Comment      $comment Comment object.
     1527         * @param WP_REST_Request $request Request data to check.
    15121528         * @return bool Whether the comment can be read.
    15131529         */
    1514         protected function check_read_permission( $comment ) {
     1530        protected function check_read_permission( $comment, $request ) {
    15151531                if ( ! empty( $comment->comment_post_ID ) ) {
    15161532                        $post = get_post( $comment->comment_post_ID );
    15171533                        if ( $post ) {
    1518                                 if ( $this->check_read_post_permission( $post ) && 1 === (int) $comment->comment_approved ) {
     1534                                if ( $this->check_read_post_permission( $post, $request ) && 1 === (int) $comment->comment_approved ) {
    15191535                                        return true;
    15201536                                }
    15211537                        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

     
    383383         * check in core with a filter.
    384384         *
    385385         * @since 4.7.0
    386          * @access protected
     386         * @access public
    387387         *
    388388         * @param WP_Post         $post    Post to check against.
    389389         * @param WP_REST_Request $request Request data to check.
    390390         * @return bool True if the user can access password-protected content, otherwise false.
    391391         */
    392         protected function can_access_password_content( $post, $request ) {
     392        public function can_access_password_content( $post, $request ) {
    393393                if ( empty( $post->post_password ) ) {
    394394                        // No filter required.
    395395                        return false;
  • tests/phpunit/tests/rest-api/rest-comments-controller.php

     
    167167                $this->assertCount( 7, $comments );
    168168        }
    169169
     170        /**
     171         * @ticket 38692
     172         */
     173        public function test_get_password_items_with_valid_password() {
     174                wp_set_current_user( 0 );
     175
     176                $args = array(
     177                        'comment_approved' => 1,
     178                        'comment_post_ID'  => self::$password_id,
     179                );
     180                $password_comment = $this->factory->comment->create( $args );
     181
     182                $request = new WP_REST_Request( 'GET', '/wp/v2/comments' );
     183                $request->set_param( 'password', 'toomanysecrets' );
     184
     185                $response = $this->server->dispatch( $request );
     186                $this->assertEquals( 200, $response->get_status() );
     187
     188                $collection_data = $response->get_data();
     189                $this->assertTrue( in_array( $password_comment, wp_list_pluck( $collection_data, 'id' ), true ) );
     190        }
     191
    170192        public function test_get_password_items_without_edit_post_permission() {
    171193                wp_set_current_user( 0 );
    172194
     
    853875                $this->assertErrorResponse( 'rest_cannot_read', $response, 403 );
    854876        }
    855877
     878        /**
     879         * @ticket 38692
     880         */
     881        public function test_get_comment_with_password_with_valid_password() {
     882                wp_set_current_user( self::$subscriber_id );
     883
     884                $args = array(
     885                        'comment_approved' => 1,
     886                        'comment_post_ID'  => self::$password_id,
     887                );
     888                $password_comment = $this->factory->comment->create( $args );
     889
     890                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/comments/%s', $password_comment ) );
     891                $request->set_param( 'password', 'toomanysecrets' );
     892
     893                $response = $this->server->dispatch( $request );
     894                $this->assertEquals( 200, $response->get_status() );
     895        }
     896
    856897        public function test_create_item() {
    857898                wp_set_current_user( self::$admin_id );
    858899