Make WordPress Core

Changeset 38960


Ignore:
Timestamp:
10/26/2016 02:51:54 PM (8 years ago)
Author:
boonebgorges
Message:

REST API: Use term-specific caps for permission checks in term update and delete endpoints.

See #38505.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    r38942 r38960  
    452452        }
    453453
    454         $taxonomy_obj = get_taxonomy( $this->taxonomy );
    455         if ( ! current_user_can( $taxonomy_obj->cap->edit_terms ) ) {
     454        if ( ! current_user_can( 'edit_term', $term->term_id ) ) {
    456455            return new WP_Error( 'rest_cannot_update', __( 'Sorry, you cannot update resource.' ), array( 'status' => rest_authorization_required_code() ) );
    457456        }
     
    528527            return new WP_Error( 'rest_term_invalid', __( "Resource doesn't exist." ), array( 'status' => 404 ) );
    529528        }
    530         $taxonomy_obj = get_taxonomy( $this->taxonomy );
    531         if ( ! current_user_can( $taxonomy_obj->cap->delete_terms ) ) {
     529
     530        if ( ! current_user_can( 'delete_term', $term->term_id ) ) {
    532531            return new WP_Error( 'rest_cannot_delete', __( 'Sorry, you cannot delete resource.' ), array( 'status' => rest_authorization_required_code() ) );
    533532        }
  • trunk/tests/phpunit/tests/rest-api/rest-tags-controller.php

    r38941 r38960  
    534534    }
    535535
     536    /**
     537     * @ticket 38505
     538     */
     539    public function test_update_item_with_edit_term_cap_granted() {
     540        wp_set_current_user( self::$subscriber );
     541        $term = $this->factory->tag->create_and_get();
     542        $request = new WP_REST_Request( 'POST', '/wp/v2/tags/' . $term->term_id );
     543        $request->set_param( 'name', 'New Name' );
     544
     545        add_filter( 'map_meta_cap', array( $this, 'grant_edit_term' ), 10, 2 );
     546        $response = $this->server->dispatch( $request );
     547        remove_filter( 'user_has_cap', array( $this, 'grant_edit_term' ), 10, 2 );
     548
     549        $this->assertEquals( 200, $response->get_status() );
     550        $data = $response->get_data();
     551        $this->assertEquals( 'New Name', $data['name'] );
     552    }
     553
     554    public function grant_edit_term( $caps, $cap ) {
     555        if ( 'edit_term' === $cap ) {
     556            $caps = array( 'read' );
     557        }
     558        return $caps;
     559    }
     560
     561    /**
     562     * @ticket 38505
     563     */
     564    public function test_update_item_with_edit_term_cap_revoked() {
     565        wp_set_current_user( self::$administrator );
     566        $term = $this->factory->tag->create_and_get();
     567        $request = new WP_REST_Request( 'POST', '/wp/v2/tags/' . $term->term_id );
     568        $request->set_param( 'name', 'New Name' );
     569
     570        add_filter( 'map_meta_cap', array( $this, 'revoke_edit_term' ), 10, 2 );
     571        $response = $this->server->dispatch( $request );
     572        remove_filter( 'user_has_cap', array( $this, 'revoke_edit_term' ), 10, 2 );
     573
     574        $this->assertErrorResponse( 'rest_cannot_update', $response, 403 );
     575    }
     576
     577    public function revoke_edit_term( $caps, $cap ) {
     578        if ( 'edit_term' === $cap ) {
     579            $caps = array( 'do_not_allow' );
     580        }
     581        return $caps;
     582    }
     583
    536584    public function test_update_item_parent_non_hierarchical_taxonomy() {
    537585        wp_set_current_user( self::$administrator );
     
    577625        $response = $this->server->dispatch( $request );
    578626        $this->assertErrorResponse( 'rest_cannot_delete', $response, 403 );
     627    }
     628
     629    /**
     630     * @ticket 38505
     631     */
     632    public function test_delete_item_with_delete_term_cap_granted() {
     633        wp_set_current_user( self::$subscriber );
     634        $term = get_term_by( 'id', $this->factory->tag->create( array( 'name' => 'Deleted Tag' ) ), 'post_tag' );
     635        $request = new WP_REST_Request( 'DELETE', '/wp/v2/tags/' . $term->term_id );
     636        $request->set_param( 'force', true );
     637
     638        add_filter( 'map_meta_cap', array( $this, 'grant_delete_term' ), 10, 2 );
     639        $response = $this->server->dispatch( $request );
     640        remove_filter( 'map_meta_cap', array( $this, 'grant_delete_term' ), 10, 2 );
     641
     642        $this->assertEquals( 200, $response->get_status() );
     643        $data = $response->get_data();
     644        $this->assertEquals( 'Deleted Tag', $data['name'] );
     645    }
     646
     647    public function grant_delete_term( $caps, $cap ) {
     648        if ( 'delete_term' === $cap ) {
     649            $caps = array( 'read' );
     650        }
     651        return $caps;
     652    }
     653
     654    /**
     655     * @ticket 38505
     656     */
     657    public function test_delete_item_with_delete_term_cap_revoked() {
     658        wp_set_current_user( self::$administrator );
     659        $term = get_term_by( 'id', $this->factory->tag->create( array( 'name' => 'Deleted Tag' ) ), 'post_tag' );
     660        $request = new WP_REST_Request( 'DELETE', '/wp/v2/tags/' . $term->term_id );
     661        $request->set_param( 'force', true );
     662
     663        add_filter( 'map_meta_cap', array( $this, 'revoke_delete_term' ), 10, 2 );
     664        $response = $this->server->dispatch( $request );
     665        remove_filter( 'map_meta_cap', array( $this, 'revoke_delete_term' ), 10, 2 );
     666
     667        $this->assertErrorResponse( 'rest_cannot_delete', $response, 403 );
     668    }
     669
     670    public function revoke_delete_term( $caps, $cap ) {
     671        if ( 'delete_term' === $cap ) {
     672            $caps = array( 'do_not_allow' );
     673        }
     674        return $caps;
    579675    }
    580676
Note: See TracChangeset for help on using the changeset viewer.