Make WordPress Core

Ticket #43701: 43701.3.diff

File 43701.3.diff, 5.9 KB (added by danielbachhuber, 6 years ago)

Refreshes 43701.2.diff against the 5.0 branch

  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index e94601ea28..317780b39a 100644
    a b class WP_REST_Posts_Controller extends WP_REST_Controller { 
    24982498
    24992499                        $post_type_obj = get_post_type_object( $this->post_type );
    25002500
    2501                         if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
     2501                        if ( current_user_can( $post_type_obj->cap->edit_posts ) || 'private' === $status && current_user_can( $post_type_obj->cap->read_private_posts ) ) {
    25022502                                $result = rest_validate_request_arg( $status, $request, $parameter );
    25032503                                if ( is_wp_error( $result ) ) {
    25042504                                        return $result;
  • tests/phpunit/tests/rest-api/rest-posts-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
    index 4893cb8470..ec38bd7a85 100644
    a b class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    1616        protected static $editor_id;
    1717        protected static $author_id;
    1818        protected static $contributor_id;
     19        protected static $private_reader_id;
    1920
    2021        protected static $supported_formats;
    2122
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    3940                        'role' => 'contributor',
    4041                ) );
    4142
     43                self::$private_reader_id = $factory->user->create(
     44                        array(
     45                                'role' => 'private_reader',
     46                        )
     47                );
     48
    4249                if ( is_multisite() ) {
    4350                        update_site_option( 'site_admins', array( 'superadmin' ) );
    4451                }
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    6269                self::delete_user( self::$editor_id );
    6370                self::delete_user( self::$author_id );
    6471                self::delete_user( self::$contributor_id );
     72                self::delete_user( self::$private_reader_id );
    6573        }
    6674
    6775        public function setUp() {
    6876                parent::setUp();
    6977                register_post_type( 'youseeme', array( 'supports' => array(), 'show_in_rest' => true ) );
     78
     79                add_role( 'private_reader', 'Private Reader' );
     80                $role = get_role( 'private_reader' );
     81                $role->add_cap( 'read_private_posts' );
     82
    7083                add_filter( 'rest_pre_dispatch', array( $this, 'wpSetUpBeforeRequest' ), 10, 3 );
    7184                add_filter( 'posts_clauses', array( $this, 'save_posts_clauses' ), 10, 2 );
    7285        }
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    497510                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    498511        }
    499512
     513        /**
     514         * @ticket 43701
     515         */
     516        public function test_get_items_multiple_statuses_custom_role_one_invalid_query() {
     517                $private_post_id = $this->factory->post->create( array( 'post_status' => 'private' ) );
     518
     519                wp_set_current_user( self::$private_reader_id );
     520                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     521                $request->set_param( 'status', array( 'private', 'future' ) );
     522
     523                $response = rest_get_server()->dispatch( $request );
     524                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     525        }
     526
    500527        public function test_get_items_invalid_status_query() {
    501528                wp_set_current_user( 0 );
    502529                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
    class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te 
    9931020                $this->assertContains( '<' . $next_link . '>; rel="next"', $headers['Link'] );
    9941021        }
    9951022
    996         public function test_get_items_private_status_query_var() {
    997                 // Private query vars inaccessible to unauthorized users
    998                 wp_set_current_user( 0 );
     1023        public function test_get_items_status_draft_permissions() {
    9991024                $draft_id = $this->factory->post->create( array( 'post_status' => 'draft' ) );
     1025
     1026                // Drafts status query var inaccessible to unauthorized users.
     1027                wp_set_current_user( 0 );
     1028                $request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1029                $request->set_param( 'status', 'draft' );
     1030                $response = rest_get_server()->dispatch( $request );
     1031                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     1032
     1033                // Users with 'read_private_posts' cap shouldn't also be able to view drafts.
     1034                wp_set_current_user( self::$private_reader_id );
    10001035                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
    10011036                $request->set_param( 'status', 'draft' );
    1002                 $response = $this->server->dispatch( $request );
     1037                $response = rest_get_server()->dispatch( $request );
    10031038                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
    10041039
    1005                 // But they are accessible to authorized users
     1040                // But drafts are accessible to authorized users.
    10061041                wp_set_current_user( self::$editor_id );
    1007                 $response = $this->server->dispatch( $request );
    1008                 $data = $response->get_data();
    1009                 $this->assertCount( 1, $data );
     1042                $response = rest_get_server()->dispatch( $request );
     1043                $data     = $response->get_data();
     1044
    10101045                $this->assertEquals( $draft_id, $data[0]['id'] );
    10111046        }
    10121047
     1048        /**
     1049         * @ticket 43701
     1050         */
     1051        public function test_get_items_status_private_permissions() {
     1052                $private_post_id = $this->factory->post->create( array( 'post_status' => 'private' ) );
     1053
     1054                wp_set_current_user( 0 );
     1055                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1056                $request->set_param( 'status', 'private' );
     1057                $response = rest_get_server()->dispatch( $request );
     1058                $this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
     1059
     1060                wp_set_current_user( self::$private_reader_id );
     1061                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
     1062                $request->set_param( 'status', 'private' );
     1063
     1064                $response = rest_get_server()->dispatch( $request );
     1065                $data     = $response->get_data();
     1066                $this->assertEquals( 200, $response->get_status() );
     1067                $this->assertCount( 1, $data );
     1068                $this->assertEquals( $private_post_id, $data[0]['id'] );
     1069        }
     1070
    10131071        public function test_get_items_invalid_per_page() {
    10141072                $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
    10151073                $request->set_query_params( array( 'per_page' => -1 ) );