WordPress.org

Make WordPress Core

Ticket #41445: 41445.diff

File 41445.diff, 2.2 KB (added by stuartfeldt, 21 months ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

     
    473473        }
    474474
    475475        /**
     476         * Checks if a given request has access to read an attachment.
     477         *
     478         * @param WP_REST_Request $request Full details about the request.
     479         * @return bool|WP_Error True if the request has read access for the item, WP_Error object otherwise.
     480         */
     481        public function get_item_permissions_check( $request ) {
     482
     483                $query_args = array(
     484                        'post_status' => 'any',
     485                        'post_type' => 'any',
     486                        'meta_key'   => '_thumbnail_id',
     487                        'meta_value' => $request['id']
     488                );
     489
     490                $posts_query  = new WP_Query();
     491                $query_result = $posts_query->query( $query_args );
     492
     493                $has_permission = false;
     494                $wp_error = false;
     495
     496                foreach ( $query_result as $post ) {
     497
     498                        if ( is_wp_error( $post ) ) {
     499                                continue;
     500                        }
     501
     502                        if ( 'edit' === $request['context'] && $post && ! $this->check_update_permission( $post ) ) {
     503                                $wp_error = WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit this post.' ), array( 'status' => rest_authorization_required_code() ) );
     504                        }
     505
     506                        if ( $post && ! empty( $request['password'] ) ) {
     507                                // Check post password, and return error if invalid.
     508                                if ( ! hash_equals( $post->post_password, $request['password'] ) ) {
     509                                        $wp_error = WP_Error( 'rest_post_incorrect_password', __( 'Incorrect post password.' ), array( 'status' => 403 ) );
     510                                }
     511                        }
     512
     513                        // Allow access to all password protected posts if the context is edit.
     514                        if ( 'edit' === $request['context'] ) {
     515                                add_filter( 'post_password_required', '__return_false' );
     516                        }
     517
     518
     519                        if ( $post ) {
     520                                $has_permission = $this->check_read_permission( $post );
     521                        }
     522
     523                        if( $has_permission ) {
     524                                return true;
     525                        }
     526                }
     527
     528                if( $wp_error && ! $has_permission ) {
     529                        return $wp_error;
     530                }
     531
     532                return parent::get_item_permissions_check( $request );
     533        }
     534
     535        /**
    476536         * Handles an upload via raw POST data.
    477537         *
    478538         * @since 4.7.0