WordPress.org

Make WordPress Core

Ticket #44096: 44096.1.diff

File 44096.1.diff, 7.9 KB (added by danielbachhuber, 3 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php
    index e431d4b743..32c543ce19 100644
    a b class WP_REST_Taxonomies_Controller extends WP_REST_Controller { 
    8484                                $taxonomies = get_taxonomies( '', 'objects' );
    8585                        }
    8686                        foreach ( $taxonomies as $taxonomy ) {
    87                                 if ( ! empty( $taxonomy->show_in_rest ) && current_user_can( $taxonomy->cap->manage_terms ) ) {
     87                                if ( ! empty( $taxonomy->show_in_rest ) && current_user_can( $taxonomy->cap->assign_terms ) ) {
    8888                                        return true;
    8989                                }
    9090                        }
    class WP_REST_Taxonomies_Controller extends WP_REST_Controller { 
    113113                }
    114114                $data = array();
    115115                foreach ( $taxonomies as $tax_type => $value ) {
    116                         if ( empty( $value->show_in_rest ) || ( 'edit' === $request['context'] && ! current_user_can( $value->cap->manage_terms ) ) ) {
     116                        if ( empty( $value->show_in_rest ) || ( 'edit' === $request['context'] && ! current_user_can( $value->cap->assign_terms ) ) ) {
    117117                                continue;
    118118                        }
    119119                        $tax               = $this->prepare_item_for_response( $value, $request );
    class WP_REST_Taxonomies_Controller extends WP_REST_Controller { 
    145145                        if ( empty( $tax_obj->show_in_rest ) ) {
    146146                                return false;
    147147                        }
    148                         if ( 'edit' === $request['context'] && ! current_user_can( $tax_obj->cap->manage_terms ) ) {
     148                        if ( 'edit' === $request['context'] && ! current_user_can( $tax_obj->cap->assign_terms ) ) {
    149149                                return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to manage terms in this taxonomy.' ), array( 'status' => rest_authorization_required_code() ) );
    150150                        }
    151151                }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
    index ea2d0d19a7..af806b812f 100644
    a b class WP_REST_Terms_Controller extends WP_REST_Controller { 
    380380                }
    381381
    382382                $taxonomy_obj = get_taxonomy( $this->taxonomy );
    383                 if ( ! current_user_can( $taxonomy_obj->cap->edit_terms ) ) {
     383                if ( ( is_taxonomy_hierarchical( $this->taxonomy )
     384                                && ! current_user_can( $taxonomy_obj->cap->edit_terms ) )
     385                        || ( ! is_taxonomy_hierarchical( $this->taxonomy )
     386                                && ! current_user_can( $taxonomy_obj->cap->assign_terms ) ) ) {
    384387                        return new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to create new terms.' ), array( 'status' => rest_authorization_required_code() ) );
    385388                }
    386389
  • tests/phpunit/tests/rest-api/rest-categories-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-categories-controller.php b/tests/phpunit/tests/rest-api/rest-categories-controller.php
    index 2e01943158..ac8d02a0ea 100644
    a b  
    1212 */
    1313class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcase {
    1414        protected static $administrator;
     15        protected static $contributor;
    1516        protected static $subscriber;
    1617
    1718        public static function wpSetUpBeforeClass( $factory ) {
    class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcas 
    2021                                'role' => 'administrator',
    2122                        )
    2223                );
     24                self::$contributor   = $factory->user->create(
     25                        array(
     26                                'role' => 'subscriber',
     27                        )
     28                );
    2329                self::$subscriber    = $factory->user->create(
    2430                        array(
    2531                                'role' => 'subscriber',
    class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcas 
    726732                $this->assertErrorResponse( 'rest_cannot_create', $response, 403 );
    727733        }
    728734
     735        public function test_create_item_incorrect_permissions_contributor() {
     736                wp_set_current_user( self::$contributor );
     737                $request = new WP_REST_Request( 'POST', '/wp/v2/categories' );
     738                $request->set_param( 'name', 'Incorrect permissions' );
     739                $response = rest_get_server()->dispatch( $request );
     740                $this->assertErrorResponse( 'rest_cannot_create', $response, 403 );
     741        }
     742
    729743        public function test_create_item_missing_arguments() {
    730744                wp_set_current_user( self::$administrator );
    731745                $request  = new WP_REST_Request( 'POST', '/wp/v2/categories' );
  • tests/phpunit/tests/rest-api/rest-tags-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-tags-controller.php b/tests/phpunit/tests/rest-api/rest-tags-controller.php
    index f2cd6a74a8..2b3cd11250 100644
    a b class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase { 
    1313        protected static $superadmin;
    1414        protected static $administrator;
    1515        protected static $editor;
     16        protected static $contributor;
    1617        protected static $subscriber;
    1718
    1819        public static function wpSetUpBeforeClass( $factory ) {
    class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase { 
    3233                                'role' => 'editor',
    3334                        )
    3435                );
     36                self::$contributor   = $factory->user->create(
     37                        array(
     38                                'role' => 'contributor',
     39                        )
     40                );
    3541                self::$subscriber    = $factory->user->create(
    3642                        array(
    3743                                'role' => 'subscriber',
    class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase { 
    624630                $this->assertEquals( 'so-awesome', $data['slug'] );
    625631        }
    626632
     633        public function test_create_item_contributor() {
     634                wp_set_current_user( self::$contributor );
     635                $request = new WP_REST_Request( 'POST', '/wp/v2/tags' );
     636                $request->set_param( 'name', 'My Awesome Term' );
     637                $request->set_param( 'description', 'This term is so awesome.' );
     638                $request->set_param( 'slug', 'so-awesome' );
     639                $response = rest_get_server()->dispatch( $request );
     640                $this->assertEquals( 201, $response->get_status() );
     641                $headers = $response->get_headers();
     642                $data    = $response->get_data();
     643                $this->assertContains( '/wp/v2/tags/' . $data['id'], $headers['Location'] );
     644                $this->assertEquals( 'My Awesome Term', $data['name'] );
     645                $this->assertEquals( 'This term is so awesome.', $data['description'] );
     646                $this->assertEquals( 'so-awesome', $data['slug'] );
     647        }
     648
    627649        public function test_create_item_incorrect_permissions() {
    628650                wp_set_current_user( self::$subscriber );
    629651                $request = new WP_REST_Request( 'POST', '/wp/v2/tags' );
  • tests/phpunit/tests/rest-api/rest-taxonomies-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php b/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php
    index 635969cb38..3eea3be489 100644
    a b class WP_Test_REST_Taxonomies_Controller extends WP_Test_REST_Controller_Testcas 
    6262                $this->assertEquals( 'tags', $data['post_tag']['rest_base'] );
    6363        }
    6464
     65        public function test_get_items_context_edit() {
     66                wp_set_current_user( self::$contributor_id );
     67                $request    = new WP_REST_Request( 'GET', '/wp/v2/taxonomies' );
     68                $request->set_param( 'context', 'edit' );
     69                $response   = rest_get_server()->dispatch( $request );
     70                $data       = $response->get_data();
     71                $taxonomies = $this->get_public_taxonomies( get_taxonomies( '', 'objects' ) );
     72                $this->assertEquals( count( $taxonomies ), count( $data ) );
     73                $this->assertEquals( 'Categories', $data['category']['name'] );
     74                $this->assertEquals( 'category', $data['category']['slug'] );
     75                $this->assertEquals( true, $data['category']['hierarchical'] );
     76                $this->assertEquals( 'Tags', $data['post_tag']['name'] );
     77                $this->assertEquals( 'post_tag', $data['post_tag']['slug'] );
     78                $this->assertEquals( false, $data['post_tag']['hierarchical'] );
     79                $this->assertEquals( 'tags', $data['post_tag']['rest_base'] );
     80        }
     81
    6582        public function test_get_items_invalid_permission_for_context() {
    6683                wp_set_current_user( 0 );
    6784                $request = new WP_REST_Request( 'GET', '/wp/v2/taxonomies' );