Make WordPress Core

Ticket #39701: 39701.diff

File 39701.diff, 6.8 KB (added by flixos90, 8 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

     
    379379                        return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) );
    380380                } elseif ( ! count_user_posts( $user->ID, $types ) && ! current_user_can( 'edit_user', $user->ID ) && ! current_user_can( 'list_users' ) ) {
    381381                        return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) );
     382                } elseif ( is_multisite() && ! is_user_member_of_blog( $user->ID ) && ! current_user_can( 'edit_user', $user->ID ) ) {
     383                        return new WP_Error( 'rest_user_cannot_view', __( 'Sorry, you are not allowed to list users.' ), array( 'status' => rest_authorization_required_code() ) );
    382384                }
    383385
    384386                return true;
     
    575577                        return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to edit this user.' ), array( 'status' => rest_authorization_required_code() ) );
    576578                }
    577579
    578                 if ( ! empty( $request['roles'] ) && ! current_user_can( 'edit_users' ) ) {
    579                         return new WP_Error( 'rest_cannot_edit_roles', __( 'Sorry, you are not allowed to edit roles of this user.' ), array( 'status' => rest_authorization_required_code() ) );
     580                if ( ! empty( $request['roles'] ) ) {
     581                        if ( ! current_user_can( 'edit_users' ) ) {
     582                                return new WP_Error( 'rest_cannot_edit_roles', __( 'Sorry, you are not allowed to edit roles of this user.' ), array( 'status' => rest_authorization_required_code() ) );
     583                        }
     584
     585                        if ( is_multisite() && ! is_user_member_of_blog( $user->ID ) ) {
     586                                return new WP_Error( 'rest_cannot_edit_roles', __( 'Sorry, you are not allowed to edit roles of this user.' ), array( 'status' => 400 ) );
     587                        }
    580588                }
    581589
    582590                return true;
     
    639647                /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php */
    640648                do_action( 'rest_insert_user', $user, $request, false );
    641649
    642                 if ( is_multisite() && ! is_user_member_of_blog( $id ) ) {
    643                         add_user_to_blog( get_current_blog_id(), $id, '' );
    644                 }
    645 
    646650                if ( ! empty( $request['roles'] ) ) {
    647651                        array_map( array( $user, 'add_role' ), $request['roles'] );
    648652                }
  • tests/phpunit/tests/rest-api/rest-users-controller.php

     
    10361036                }
    10371037        }
    10381038
    1039         public function test_update_existing_network_user_on_sub_site_adds_user_to_site() {
     1039        public function test_update_existing_network_user_on_sub_site_does_not_add_user_to_site() {
    10401040                if ( ! is_multisite() ) {
    10411041                        $this->markTestSkipped( 'Test requires multisite.' );
    10421042                }
     
    10711071
    10721072                wpmu_delete_user( $user_id );
    10731073
    1074                 $this->assertTrue( $user_is_member );
     1074                $this->assertFalse( $user_is_member );
    10751075        }
    10761076
    10771077        public function test_json_create_user() {
     
    21892189                $wp_rest_additional_fields = array();
    21902190        }
    21912191
     2192        /**
     2193         * @ticket 39701
     2194         */
     2195        public function test_get_item_from_different_site_as_site_administrator() {
     2196                if ( ! is_multisite() ) {
     2197                        $this->markTestSkipped( 'Test only runs in multisite' );
     2198                }
     2199
     2200                switch_to_blog( self::$site );
     2201                $user_id = $this->factory->user->create( array(
     2202                        'role' => 'author',
     2203                ) );
     2204                restore_current_blog();
     2205
     2206                wp_set_current_user( self::$user );
     2207                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/users/%d', $user_id ) );
     2208
     2209                $response = $this->server->dispatch( $request );
     2210                $this->assertErrorResponse( 'rest_user_cannot_view', $response, 403 );
     2211        }
     2212
     2213        /**
     2214         * @ticket 39701
     2215         */
     2216        public function test_get_item_from_different_site_as_network_administrator() {
     2217                if ( ! is_multisite() ) {
     2218                        $this->markTestSkipped( 'Test only runs in multisite' );
     2219                }
     2220
     2221                switch_to_blog( self::$site );
     2222                $user_id = $this->factory->user->create( array(
     2223                        'role' => 'author',
     2224                ) );
     2225                restore_current_blog();
     2226
     2227                wp_set_current_user( self::$superadmin );
     2228                $request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/users/%d', $user_id ) );
     2229
     2230                $response = $this->server->dispatch( $request );
     2231                $this->check_get_user_response( $response );
     2232        }
     2233
     2234        /**
     2235         * @ticket 39701
     2236         */
     2237        public function test_update_item_from_different_site_as_site_administrator() {
     2238                if ( ! is_multisite() ) {
     2239                        $this->markTestSkipped( 'Test only runs in multisite' );
     2240                }
     2241
     2242                switch_to_blog( self::$site );
     2243                $user_id = $this->factory->user->create( array(
     2244                        'role' => 'author',
     2245                ) );
     2246                restore_current_blog();
     2247
     2248                wp_set_current_user( self::$user );
     2249                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/users/%d', $user_id ) );
     2250                $request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
     2251                $request->set_body_params( array( 'first_name' => 'New Name' ) );
     2252
     2253                $response = $this->server->dispatch( $request );
     2254                $this->assertErrorResponse( 'rest_cannot_edit', $response, 403 );
     2255        }
     2256
     2257        /**
     2258         * @ticket 39701
     2259         */
     2260        public function test_update_item_from_different_site_as_network_administrator() {
     2261                if ( ! is_multisite() ) {
     2262                        $this->markTestSkipped( 'Test only runs in multisite' );
     2263                }
     2264
     2265                switch_to_blog( self::$site );
     2266                $user_id = $this->factory->user->create( array(
     2267                        'role' => 'author',
     2268                ) );
     2269                restore_current_blog();
     2270
     2271                wp_set_current_user( self::$superadmin );
     2272                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/users/%d', $user_id ) );
     2273                $request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
     2274                $request->set_body_params( array( 'first_name' => 'New Name' ) );
     2275
     2276                $response = $this->server->dispatch( $request );
     2277                $this->check_add_edit_user_response( $response, true );
     2278        }
     2279
     2280        /**
     2281         * @ticket 39701
     2282         */
     2283        public function test_update_item_from_different_site_as_network_administrator_with_roles() {
     2284                if ( ! is_multisite() ) {
     2285                        $this->markTestSkipped( 'Test only runs in multisite' );
     2286                }
     2287
     2288                switch_to_blog( self::$site );
     2289                $user_id = $this->factory->user->create( array(
     2290                        'role' => 'author',
     2291                ) );
     2292                restore_current_blog();
     2293
     2294                wp_set_current_user( self::$superadmin );
     2295                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/users/%d', $user_id ) );
     2296                $request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
     2297                $request->set_body_params( array( 'roles' => array( 'subscriber' ) ) );
     2298
     2299                $response = $this->server->dispatch( $request );
     2300                $this->assertErrorResponse( 'rest_cannot_edit_roles', $response, 400 );
     2301        }
     2302
    21922303        public function additional_field_get_callback( $object ) {
    21932304                return get_user_meta( $object['id'], 'my_custom_int', true );
    21942305        }