WordPress.org

Make WordPress Core

Changeset 45508


Ignore:
Timestamp:
06/10/2019 07:49:27 AM (6 months ago)
Author:
peterwilsoncc
Message:

Site health: Introduce view_site_health_checks capability.

Introduces the faux primitive capability view_site_health_checks available to single site admins and multisite super-admin to view the site health page within the admin.

The capability is mapped to the install_plugins capability without being dependent on the file system being writable. This fixes a bug where the feature couldn't be used by sites unable to write to the file system or managed through version control.

The capability is granted on the user_has_cap filter.

Props birgire, Clorith, palmiak, peterwilsoncc, spacedmonkey.
Merges [45507] to the 5.2 branch.
Fixes #46957 for 5.2.2.

Location:
branches/5.2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/5.2

  • branches/5.2/src/wp-admin/includes/ajax-actions.php

    r45239 r45508  
    48704870    check_ajax_referer( 'health-check-site-status' );
    48714871
    4872     if ( ! current_user_can( 'install_plugins' ) ) {
     4872    if ( ! current_user_can( 'view_site_health_checks' ) ) {
    48734873        wp_send_json_error();
    48744874    }
     
    48904890    wp_verify_nonce( 'health-check-site-status' );
    48914891
    4892     if ( ! current_user_can( 'install_plugins' ) ) {
     4892    if ( ! current_user_can( 'view_site_health_checks' ) ) {
    48934893        wp_send_json_error();
    48944894    }
     
    49104910    check_ajax_referer( 'health-check-site-status' );
    49114911
    4912     if ( ! current_user_can( 'install_plugins' ) ) {
     4912    if ( ! current_user_can( 'view_site_health_checks' ) ) {
    49134913        wp_send_json_error();
    49144914    }
     
    49314931    check_ajax_referer( 'health-check-site-status' );
    49324932
    4933     if ( ! current_user_can( 'install_plugins' ) ) {
     4933    if ( ! current_user_can( 'view_site_health_checks' ) ) {
    49344934        wp_send_json_error();
    49354935    }
     
    49514951    check_ajax_referer( 'health-check-site-status-result' );
    49524952
    4953     if ( ! current_user_can( 'install_plugins' ) ) {
     4953    if ( ! current_user_can( 'view_site_health_checks' ) ) {
    49544954        wp_send_json_error();
    49554955    }
     
    49684968    check_ajax_referer( 'health-check-site-status-result' );
    49694969
    4970     if ( ! current_user_can( 'install_plugins' ) || is_multisite() ) {
     4970    if ( ! current_user_can( 'view_site_health_checks' ) || is_multisite() ) {
    49714971        wp_send_json_error();
    49724972    }
  • branches/5.2/src/wp-admin/menu.php

    r45142 r45508  
    264264    $submenu['tools.php'][10] = array( __( 'Import' ), 'import', 'import.php' );
    265265    $submenu['tools.php'][15] = array( __( 'Export' ), 'export', 'export.php' );
    266     $submenu['tools.php'][20] = array( __( 'Site Health' ), 'install_plugins', 'site-health.php' );
     266    $submenu['tools.php'][20] = array( __( 'Site Health' ), 'view_site_health_checks', 'site-health.php' );
    267267if ( is_multisite() && ! is_main_site() ) {
    268268    $submenu['tools.php'][25] = array( __( 'Delete Site' ), 'delete_site', 'ms-delete-site.php' );
  • branches/5.2/src/wp-admin/site-health-info.php

    r45259 r45508  
    1212$title = __( 'Site Health Info' );
    1313
    14 if ( ! current_user_can( 'install_plugins' ) ) {
     14if ( ! current_user_can( 'view_site_health_checks' ) ) {
    1515    wp_die( __( 'Sorry, you are not allowed to access the debug data.' ), '', 403 );
    1616}
  • branches/5.2/src/wp-admin/site-health.php

    r45201 r45508  
    1717$title = __( 'Site Health Status' );
    1818
    19 if ( ! current_user_can( 'install_plugins' ) ) {
     19if ( ! current_user_can( 'view_site_health_checks' ) ) {
    2020    wp_die( __( 'Sorry, you are not allowed to access site health information.' ), '', 403 );
    2121}
  • branches/5.2/src/wp-includes/capabilities.php

    r44976 r45508  
    980980}
    981981
     982/**
     983 * Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary.
     984 *
     985 * @since 5.2.2
     986 *
     987 * @param bool[]   $allcaps An array of all the user's capabilities.
     988 * @param string[] $caps    Required primitive capabilities for the requested capability.
     989 * @param array    $args {
     990 *     Arguments that accompany the requested capability check.
     991 *
     992 *     @type string    $0 Requested capability.
     993 *     @type int       $1 Concerned user ID.
     994 *     @type mixed  ...$2 Optional second and further parameters, typically object ID.
     995 * }
     996 * @param WP_User  $user    The user object.
     997 * @return bool[] Filtered array of the user's capabilities.
     998 */
     999function wp_maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) {
     1000    if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) {
     1001        $allcaps['view_site_health_checks'] = true;
     1002    }
     1003
     1004    return $allcaps;
     1005}
     1006
    9821007return;
    9831008
  • branches/5.2/src/wp-includes/default-filters.php

    r44973 r45508  
    581581add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1 );
    582582add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1 );
     583add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 );
    583584
    584585unset( $filter, $action );
  • branches/5.2/tests/phpunit/tests/user/capabilities.php

    r44973 r45508  
    7777        return array(
    7878
    79             'unfiltered_html'        => array( 'administrator', 'editor' ),
    80 
    81             'activate_plugins'       => array( 'administrator' ),
    82             'create_users'           => array( 'administrator' ),
    83             'delete_plugins'         => array( 'administrator' ),
    84             'delete_themes'          => array( 'administrator' ),
    85             'delete_users'           => array( 'administrator' ),
    86             'edit_files'             => array( 'administrator' ),
    87             'edit_plugins'           => array( 'administrator' ),
    88             'edit_themes'            => array( 'administrator' ),
    89             'edit_users'             => array( 'administrator' ),
    90             'install_plugins'        => array( 'administrator' ),
    91             'install_themes'         => array( 'administrator' ),
    92             'update_core'            => array( 'administrator' ),
    93             'update_plugins'         => array( 'administrator' ),
    94             'update_themes'          => array( 'administrator' ),
    95             'edit_theme_options'     => array( 'administrator' ),
    96             'export'                 => array( 'administrator' ),
    97             'import'                 => array( 'administrator' ),
    98             'list_users'             => array( 'administrator' ),
    99             'manage_options'         => array( 'administrator' ),
    100             'promote_users'          => array( 'administrator' ),
    101             'remove_users'           => array( 'administrator' ),
    102             'switch_themes'          => array( 'administrator' ),
    103             'edit_dashboard'         => array( 'administrator' ),
    104             'resume_plugins'         => array( 'administrator' ),
    105             'resume_themes'          => array( 'administrator' ),
    106 
    107             'moderate_comments'      => array( 'administrator', 'editor' ),
    108             'manage_categories'      => array( 'administrator', 'editor' ),
    109             'edit_others_posts'      => array( 'administrator', 'editor' ),
    110             'edit_pages'             => array( 'administrator', 'editor' ),
    111             'edit_others_pages'      => array( 'administrator', 'editor' ),
    112             'edit_published_pages'   => array( 'administrator', 'editor' ),
    113             'publish_pages'          => array( 'administrator', 'editor' ),
    114             'delete_pages'           => array( 'administrator', 'editor' ),
    115             'delete_others_pages'    => array( 'administrator', 'editor' ),
    116             'delete_published_pages' => array( 'administrator', 'editor' ),
    117             'delete_others_posts'    => array( 'administrator', 'editor' ),
    118             'delete_private_posts'   => array( 'administrator', 'editor' ),
    119             'edit_private_posts'     => array( 'administrator', 'editor' ),
    120             'read_private_posts'     => array( 'administrator', 'editor' ),
    121             'delete_private_pages'   => array( 'administrator', 'editor' ),
    122             'edit_private_pages'     => array( 'administrator', 'editor' ),
    123             'read_private_pages'     => array( 'administrator', 'editor' ),
    124 
    125             'edit_published_posts'   => array( 'administrator', 'editor', 'author' ),
    126             'upload_files'           => array( 'administrator', 'editor', 'author' ),
    127             'publish_posts'          => array( 'administrator', 'editor', 'author' ),
    128             'delete_published_posts' => array( 'administrator', 'editor', 'author' ),
    129 
    130             'edit_posts'             => array( 'administrator', 'editor', 'author', 'contributor' ),
    131             'delete_posts'           => array( 'administrator', 'editor', 'author', 'contributor' ),
    132 
    133             'read'                   => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
    134 
    135             'level_10'               => array( 'administrator' ),
    136             'level_9'                => array( 'administrator' ),
    137             'level_8'                => array( 'administrator' ),
    138             'level_7'                => array( 'administrator', 'editor' ),
    139             'level_6'                => array( 'administrator', 'editor' ),
    140             'level_5'                => array( 'administrator', 'editor' ),
    141             'level_4'                => array( 'administrator', 'editor' ),
    142             'level_3'                => array( 'administrator', 'editor' ),
    143             'level_2'                => array( 'administrator', 'editor', 'author' ),
    144             'level_1'                => array( 'administrator', 'editor', 'author', 'contributor' ),
    145             'level_0'                => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
    146 
    147             'administrator'          => array( 'administrator' ),
    148             'editor'                 => array( 'editor' ),
    149             'author'                 => array( 'author' ),
    150             'contributor'            => array( 'contributor' ),
    151             'subscriber'             => array( 'subscriber' ),
     79            'unfiltered_html'         => array( 'administrator', 'editor' ),
     80
     81            'activate_plugins'        => array( 'administrator' ),
     82            'create_users'            => array( 'administrator' ),
     83            'delete_plugins'          => array( 'administrator' ),
     84            'delete_themes'           => array( 'administrator' ),
     85            'delete_users'            => array( 'administrator' ),
     86            'edit_files'              => array( 'administrator' ),
     87            'edit_plugins'            => array( 'administrator' ),
     88            'edit_themes'             => array( 'administrator' ),
     89            'edit_users'              => array( 'administrator' ),
     90            'install_plugins'         => array( 'administrator' ),
     91            'install_themes'          => array( 'administrator' ),
     92            'update_core'             => array( 'administrator' ),
     93            'update_plugins'          => array( 'administrator' ),
     94            'update_themes'           => array( 'administrator' ),
     95            'edit_theme_options'      => array( 'administrator' ),
     96            'export'                  => array( 'administrator' ),
     97            'import'                  => array( 'administrator' ),
     98            'list_users'              => array( 'administrator' ),
     99            'manage_options'          => array( 'administrator' ),
     100            'promote_users'           => array( 'administrator' ),
     101            'remove_users'            => array( 'administrator' ),
     102            'switch_themes'           => array( 'administrator' ),
     103            'edit_dashboard'          => array( 'administrator' ),
     104            'resume_plugins'          => array( 'administrator' ),
     105            'resume_themes'           => array( 'administrator' ),
     106            'view_site_health_checks' => array( 'administrator' ),
     107
     108            'moderate_comments'       => array( 'administrator', 'editor' ),
     109            'manage_categories'       => array( 'administrator', 'editor' ),
     110            'edit_others_posts'       => array( 'administrator', 'editor' ),
     111            'edit_pages'              => array( 'administrator', 'editor' ),
     112            'edit_others_pages'       => array( 'administrator', 'editor' ),
     113            'edit_published_pages'    => array( 'administrator', 'editor' ),
     114            'publish_pages'           => array( 'administrator', 'editor' ),
     115            'delete_pages'            => array( 'administrator', 'editor' ),
     116            'delete_others_pages'     => array( 'administrator', 'editor' ),
     117            'delete_published_pages'  => array( 'administrator', 'editor' ),
     118            'delete_others_posts'     => array( 'administrator', 'editor' ),
     119            'delete_private_posts'    => array( 'administrator', 'editor' ),
     120            'edit_private_posts'      => array( 'administrator', 'editor' ),
     121            'read_private_posts'      => array( 'administrator', 'editor' ),
     122            'delete_private_pages'    => array( 'administrator', 'editor' ),
     123            'edit_private_pages'      => array( 'administrator', 'editor' ),
     124            'read_private_pages'      => array( 'administrator', 'editor' ),
     125
     126            'edit_published_posts'    => array( 'administrator', 'editor', 'author' ),
     127            'upload_files'            => array( 'administrator', 'editor', 'author' ),
     128            'publish_posts'           => array( 'administrator', 'editor', 'author' ),
     129            'delete_published_posts'  => array( 'administrator', 'editor', 'author' ),
     130
     131            'edit_posts'              => array( 'administrator', 'editor', 'author', 'contributor' ),
     132            'delete_posts'            => array( 'administrator', 'editor', 'author', 'contributor' ),
     133
     134            'read'                    => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
     135
     136            'level_10'                => array( 'administrator' ),
     137            'level_9'                 => array( 'administrator' ),
     138            'level_8'                 => array( 'administrator' ),
     139            'level_7'                 => array( 'administrator', 'editor' ),
     140            'level_6'                 => array( 'administrator', 'editor' ),
     141            'level_5'                 => array( 'administrator', 'editor' ),
     142            'level_4'                 => array( 'administrator', 'editor' ),
     143            'level_3'                 => array( 'administrator', 'editor' ),
     144            'level_2'                 => array( 'administrator', 'editor', 'author' ),
     145            'level_1'                 => array( 'administrator', 'editor', 'author', 'contributor' ),
     146            'level_0'                 => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
     147
     148            'administrator'           => array( 'administrator' ),
     149            'editor'                  => array( 'editor' ),
     150            'author'                  => array( 'author' ),
     151            'contributor'             => array( 'contributor' ),
     152            'subscriber'              => array( 'subscriber' ),
    152153
    153154        );
     
    158159        return array(
    159160
    160             'unfiltered_html'        => array(),
    161 
    162             'activate_plugins'       => array(),
    163             'create_users'           => array(),
    164             'delete_plugins'         => array(),
    165             'delete_themes'          => array(),
    166             'delete_users'           => array(),
    167             'edit_files'             => array(),
    168             'edit_plugins'           => array(),
    169             'edit_themes'            => array(),
    170             'edit_users'             => array(),
    171             'install_plugins'        => array(),
    172             'install_themes'         => array(),
    173             'update_core'            => array(),
    174             'update_plugins'         => array(),
    175             'update_themes'          => array(),
    176 
    177             'edit_theme_options'     => array( 'administrator' ),
    178             'export'                 => array( 'administrator' ),
    179             'import'                 => array( 'administrator' ),
    180             'list_users'             => array( 'administrator' ),
    181             'manage_options'         => array( 'administrator' ),
    182             'promote_users'          => array( 'administrator' ),
    183             'remove_users'           => array( 'administrator' ),
    184             'switch_themes'          => array( 'administrator' ),
    185             'edit_dashboard'         => array( 'administrator' ),
    186             'resume_plugins'         => array( 'administrator' ),
    187             'resume_themes'          => array( 'administrator' ),
    188 
    189             'moderate_comments'      => array( 'administrator', 'editor' ),
    190             'manage_categories'      => array( 'administrator', 'editor' ),
    191             'edit_others_posts'      => array( 'administrator', 'editor' ),
    192             'edit_pages'             => array( 'administrator', 'editor' ),
    193             'edit_others_pages'      => array( 'administrator', 'editor' ),
    194             'edit_published_pages'   => array( 'administrator', 'editor' ),
    195             'publish_pages'          => array( 'administrator', 'editor' ),
    196             'delete_pages'           => array( 'administrator', 'editor' ),
    197             'delete_others_pages'    => array( 'administrator', 'editor' ),
    198             'delete_published_pages' => array( 'administrator', 'editor' ),
    199             'delete_others_posts'    => array( 'administrator', 'editor' ),
    200             'delete_private_posts'   => array( 'administrator', 'editor' ),
    201             'edit_private_posts'     => array( 'administrator', 'editor' ),
    202             'read_private_posts'     => array( 'administrator', 'editor' ),
    203             'delete_private_pages'   => array( 'administrator', 'editor' ),
    204             'edit_private_pages'     => array( 'administrator', 'editor' ),
    205             'read_private_pages'     => array( 'administrator', 'editor' ),
    206 
    207             'edit_published_posts'   => array( 'administrator', 'editor', 'author' ),
    208             'upload_files'           => array( 'administrator', 'editor', 'author' ),
    209             'publish_posts'          => array( 'administrator', 'editor', 'author' ),
    210             'delete_published_posts' => array( 'administrator', 'editor', 'author' ),
    211 
    212             'edit_posts'             => array( 'administrator', 'editor', 'author', 'contributor' ),
    213             'delete_posts'           => array( 'administrator', 'editor', 'author', 'contributor' ),
    214 
    215             'read'                   => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
    216 
    217             'level_10'               => array( 'administrator' ),
    218             'level_9'                => array( 'administrator' ),
    219             'level_8'                => array( 'administrator' ),
    220             'level_7'                => array( 'administrator', 'editor' ),
    221             'level_6'                => array( 'administrator', 'editor' ),
    222             'level_5'                => array( 'administrator', 'editor' ),
    223             'level_4'                => array( 'administrator', 'editor' ),
    224             'level_3'                => array( 'administrator', 'editor' ),
    225             'level_2'                => array( 'administrator', 'editor', 'author' ),
    226             'level_1'                => array( 'administrator', 'editor', 'author', 'contributor' ),
    227             'level_0'                => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
    228 
    229             'administrator'          => array( 'administrator' ),
    230             'editor'                 => array( 'editor' ),
    231             'author'                 => array( 'author' ),
    232             'contributor'            => array( 'contributor' ),
    233             'subscriber'             => array( 'subscriber' ),
     161            'unfiltered_html'         => array(),
     162
     163            'activate_plugins'        => array(),
     164            'create_users'            => array(),
     165            'delete_plugins'          => array(),
     166            'delete_themes'           => array(),
     167            'delete_users'            => array(),
     168            'edit_files'              => array(),
     169            'edit_plugins'            => array(),
     170            'edit_themes'             => array(),
     171            'edit_users'              => array(),
     172            'install_plugins'         => array(),
     173            'install_themes'          => array(),
     174            'update_core'             => array(),
     175            'update_plugins'          => array(),
     176            'update_themes'           => array(),
     177            'view_site_health_checks' => array(),
     178
     179            'edit_theme_options'      => array( 'administrator' ),
     180            'export'                  => array( 'administrator' ),
     181            'import'                  => array( 'administrator' ),
     182            'list_users'              => array( 'administrator' ),
     183            'manage_options'          => array( 'administrator' ),
     184            'promote_users'           => array( 'administrator' ),
     185            'remove_users'            => array( 'administrator' ),
     186            'switch_themes'           => array( 'administrator' ),
     187            'edit_dashboard'          => array( 'administrator' ),
     188            'resume_plugins'          => array( 'administrator' ),
     189            'resume_themes'           => array( 'administrator' ),
     190
     191            'moderate_comments'       => array( 'administrator', 'editor' ),
     192            'manage_categories'       => array( 'administrator', 'editor' ),
     193            'edit_others_posts'       => array( 'administrator', 'editor' ),
     194            'edit_pages'              => array( 'administrator', 'editor' ),
     195            'edit_others_pages'       => array( 'administrator', 'editor' ),
     196            'edit_published_pages'    => array( 'administrator', 'editor' ),
     197            'publish_pages'           => array( 'administrator', 'editor' ),
     198            'delete_pages'            => array( 'administrator', 'editor' ),
     199            'delete_others_pages'     => array( 'administrator', 'editor' ),
     200            'delete_published_pages'  => array( 'administrator', 'editor' ),
     201            'delete_others_posts'     => array( 'administrator', 'editor' ),
     202            'delete_private_posts'    => array( 'administrator', 'editor' ),
     203            'edit_private_posts'      => array( 'administrator', 'editor' ),
     204            'read_private_posts'      => array( 'administrator', 'editor' ),
     205            'delete_private_pages'    => array( 'administrator', 'editor' ),
     206            'edit_private_pages'      => array( 'administrator', 'editor' ),
     207            'read_private_pages'      => array( 'administrator', 'editor' ),
     208
     209            'edit_published_posts'    => array( 'administrator', 'editor', 'author' ),
     210            'upload_files'            => array( 'administrator', 'editor', 'author' ),
     211            'publish_posts'           => array( 'administrator', 'editor', 'author' ),
     212            'delete_published_posts'  => array( 'administrator', 'editor', 'author' ),
     213
     214            'edit_posts'              => array( 'administrator', 'editor', 'author', 'contributor' ),
     215            'delete_posts'            => array( 'administrator', 'editor', 'author', 'contributor' ),
     216
     217            'read'                    => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
     218
     219            'level_10'                => array( 'administrator' ),
     220            'level_9'                 => array( 'administrator' ),
     221            'level_8'                 => array( 'administrator' ),
     222            'level_7'                 => array( 'administrator', 'editor' ),
     223            'level_6'                 => array( 'administrator', 'editor' ),
     224            'level_5'                 => array( 'administrator', 'editor' ),
     225            'level_4'                 => array( 'administrator', 'editor' ),
     226            'level_3'                 => array( 'administrator', 'editor' ),
     227            'level_2'                 => array( 'administrator', 'editor', 'author' ),
     228            'level_1'                 => array( 'administrator', 'editor', 'author', 'contributor' ),
     229            'level_0'                 => array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' ),
     230
     231            'administrator'           => array( 'administrator' ),
     232            'editor'                  => array( 'editor' ),
     233            'author'                  => array( 'author' ),
     234            'contributor'             => array( 'contributor' ),
     235            'subscriber'              => array( 'subscriber' ),
    234236
    235237        );
     
    398400            $actual['subscriber'],
    399401            $actual['contributor'],
    400             // the following two are granted via `user_has_cap`:
     402            // The following are granted via `user_has_cap`:
    401403            $actual['resume_plugins'],
    402             $actual['resume_themes']
     404            $actual['resume_themes'],
     405            $actual['view_site_health_checks']
    403406        );
    404407
     
    12011204        $this->assertFalse( $contributor->has_cap( 'edit_post', $post ) );
    12021205        $this->assertFalse( $contributor->has_cap( 'delete_post', $post ) );
    1203         $this->assertEquals( $status === 'publish', $contributor->has_cap( 'read_post', $post ) );
     1206        $this->assertEquals( 'publish' === $status, $contributor->has_cap( 'read_post', $post ) );
    12041207    }
    12051208
Note: See TracChangeset for help on using the changeset viewer.