WordPress.org

Make WordPress Core

Ticket #38692: 38692.diff

File 38692.diff, 6.2 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;