Make WordPress Core


Ignore:
Timestamp:
11/05/2021 02:14:07 AM (5 years ago)
Author:
TimothyBlynJacobs
Message:

REST API: Allow sidebars and their widgets to be public.

By default, only users with the edit_theme_options capability can access the sidebars and widgets REST API endpoints. In this commit, A new show_in_rest parameter is added to the register_sidebar function. When enabled, all users will be able to access that sidebar and any widgets belonging to that sidebar.

This commit reduces the context for a widget's instance information to only edit. This is to ensure that internal widget data is not inadvertently exposed to the public. A future ticket may expose additional APIs to allow widget authors to indicate that their instance data can be safely exposed. REST API consumers intending to access this instance information should take care to explicitly set the context parameter to edit.

Props spacedmonkey, zieladam.
Fixes #53915.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/rest-api/rest-widgets-controller.php

    r51830 r52016  
    242242
    243243        /**
     244         * @ticket 53915
     245         */
     246        public function test_get_items_no_permission_show_in_rest() {
     247                $this->setup_widget(
     248                        'text',
     249                        1,
     250                        array(
     251                                'text' => 'Custom text test',
     252                        )
     253                );
     254                $this->setup_sidebar(
     255                        'sidebar-1',
     256                        array(
     257                                'name'         => 'Test sidebar',
     258                                'show_in_rest' => true,
     259                        ),
     260                        array( 'text-1', 'testwidget' )
     261                );
     262
     263                $request  = new WP_REST_Request( 'GET', '/wp/v2/widgets' );
     264                $response = rest_get_server()->dispatch( $request );
     265                $data     = $response->get_data();
     266                $data     = $this->remove_links( $data );
     267                $this->assertSameIgnoreEOL(
     268                        array(
     269                                array(
     270                                        'id'       => 'text-1',
     271                                        'id_base'  => 'text',
     272                                        'sidebar'  => 'sidebar-1',
     273                                        'rendered' => '<div class="textwidget">Custom text test</div>',
     274                                ),
     275                                array(
     276                                        'id'       => 'testwidget',
     277                                        'id_base'  => 'testwidget',
     278                                        'sidebar'  => 'sidebar-1',
     279                                        'rendered' => '<h1>Default id</h1><span>Default text</span>',
     280                                ),
     281                        ),
     282                        $data
     283                );
     284        }
     285
     286        /**
     287         * @ticket 53915
     288         */
     289        public function test_get_items_without_show_in_rest_are_removed_from_the_list() {
     290                wp_set_current_user( self::$author_id );
     291                $this->setup_widget(
     292                        'text',
     293                        1,
     294                        array(
     295                                'text' => 'Custom text test',
     296                        )
     297                );
     298                $this->setup_sidebar(
     299                        'sidebar-1',
     300                        array(
     301                                'name'         => 'Test sidebar 1',
     302                                'show_in_rest' => true,
     303                        ),
     304                        array( 'text-1', 'testwidget' )
     305                );
     306                $this->setup_sidebar(
     307                        'sidebar-2',
     308                        array(
     309                                'name'         => 'Test sidebar 2',
     310                                'show_in_rest' => false,
     311                        ),
     312                        array( 'text-1', 'testwidget' )
     313                );
     314                $request  = new WP_REST_Request( 'GET', '/wp/v2/widgets' );
     315                $response = rest_get_server()->dispatch( $request );
     316                $data     = $response->get_data();
     317                $data     = $this->remove_links( $data );
     318                $this->assertSameIgnoreEOL(
     319                        array(
     320                                array(
     321                                        'id'       => 'text-1',
     322                                        'id_base'  => 'text',
     323                                        'sidebar'  => 'sidebar-1',
     324                                        'rendered' => '<div class="textwidget">Custom text test</div>',
     325                                ),
     326                                array(
     327                                        'id'       => 'testwidget',
     328                                        'id_base'  => 'testwidget',
     329                                        'sidebar'  => 'sidebar-1',
     330                                        'rendered' => '<h1>Default id</h1><span>Default text</span>',
     331                                ),
     332                        ),
     333                        $data
     334                );
     335        }
     336
     337        /**
    244338         * @ticket 41683
    245339         */
    … …  
    296390                                        'sidebar'  => 'sidebar-1',
    297391                                        'rendered' => '<p>Block test</p>',
    298                                         'instance' => array(
    299                                                 'encoded' => base64_encode(
    300                                                         serialize(
    301                                                                 array(
    302                                                                         'content' => $block_content,
    303                                                                 )
    304                                                         )
    305                                                 ),
    306                                                 'hash'    => wp_hash(
    307                                                         serialize(
    308                                                                 array(
    309                                                                         'content' => $block_content,
    310                                                                 )
    311                                                         )
    312                                                 ),
    313                                                 'raw'     => array(
    314                                                         'content' => $block_content,
    315                                                 ),
    316                                         ),
    317392                                ),
    318393                                array(
    … …  
    321396                                        'sidebar'  => 'sidebar-1',
    322397                                        'rendered' => '<a class="rsswidget" href="https://wordpress.org/news/feed"><img class="rss-widget-icon" style="border:0" width="14" height="14" src="http://example.org/wp-includes/images/rss.png" alt="RSS" /></a> <a class="rsswidget" href="https://wordpress.org/news">RSS test</a><ul><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/12/introducing-learn-wordpress/\'>Introducing Learn WordPress</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/12/simone/\'>WordPress 5.6 “Simone”</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/12/state-of-the-word-2020/\'>State of the Word 2020</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/12/the-month-in-wordpress-november-2020/\'>The Month in WordPress: November 2020</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/12/wordpress-5-6-release-candidate-2/\'>WordPress 5.6 Release Candidate 2</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/11/wordpress-5-6-release-candidate/\'>WordPress 5.6 Release Candidate</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/11/wordpress-5-6-beta-4/\'>WordPress 5.6 Beta 4</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/11/wordpress-5-6-beta-3/\'>WordPress 5.6 Beta 3</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/11/the-month-in-wordpress-october-2020/\'>The Month in WordPress: October 2020</a></li><li><a class=\'rsswidget\' href=\'https://wordpress.org/news/2020/10/wordpress-5-5-3-maintenance-release/\'>WordPress 5.5.3 Maintenance Release</a></li></ul>',
    323                                         'instance' => array(
    324                                                 'encoded' => base64_encode(
    325                                                         serialize(
    326                                                                 array(
    327                                                                         'title' => 'RSS test',
    328                                                                         'url'   => 'https://wordpress.org/news/feed',
    329                                                                 )
    330                                                         )
    331                                                 ),
    332                                                 'hash'    => wp_hash(
    333                                                         serialize(
    334                                                                 array(
    335                                                                         'title' => 'RSS test',
    336                                                                         'url'   => 'https://wordpress.org/news/feed',
    337                                                                 )
    338                                                         )
    339                                                 ),
    340                                         ),
    341398                                ),
    342399                                array(
    … …  
    345402                                        'sidebar'  => 'sidebar-1',
    346403                                        'rendered' => '<h1>Default id</h1><span>Default text</span>',
    347                                         'instance' => null,
    348404                                ),
    349405                        ),
    … …  
    470526                                'sidebar'  => 'sidebar-1',
    471527                                'rendered' => '<div class="textwidget">Custom text test</div>',
    472                                 'instance' => array(
    473                                         'encoded' => base64_encode(
    474                                                 serialize(
    475                                                         array(
    476                                                                 'text' => 'Custom text test',
    477                                                         )
    478                                                 )
    479                                         ),
    480                                         'hash'    => wp_hash(
    481                                                 serialize(
    482                                                         array(
    483                                                                 'text' => 'Custom text test',
    484                                                         )
    485                                                 )
    486                                         ),
    487                                         'raw'     => array(
    488                                                 'text' => 'Custom text test',
    489                                         ),
    490                                 ),
    491528                        ),
    492529                        $data
    … …  
    542579                $response = rest_get_server()->dispatch( $request );
    543580                $this->assertErrorResponse( 'rest_cannot_manage_widgets', $response, 403 );
     581        }
     582
     583        /**
     584         * @ticket 53915
     585         */
     586        public function test_get_item_no_permission_show_in_rest() {
     587                wp_set_current_user( 0 );
     588
     589                $this->setup_widget(
     590                        'text',
     591                        1,
     592                        array(
     593                                'text' => 'Custom text test',
     594                        )
     595                );
     596                $this->setup_sidebar(
     597                        'sidebar-1',
     598                        array(
     599                                'name'         => 'Test sidebar',
     600                                'show_in_rest' => true,
     601                        ),
     602                        array( 'text-1' )
     603                );
     604
     605                $request  = new WP_REST_Request( 'GET', '/wp/v2/widgets/text-1' );
     606                $response = rest_get_server()->dispatch( $request );
     607                $data     = $response->get_data();
     608                $this->assertSameSets(
     609                        array(
     610                                'id'       => 'text-1',
     611                                'id_base'  => 'text',
     612                                'sidebar'  => 'sidebar-1',
     613                                'rendered' => '<div class="textwidget">Custom text test</div>',
     614                        ),
     615                        $data
     616                );
    544617        }
    545618
Note: See TracChangeset for help on using the changeset viewer.