Make WordPress Core

Ticket #38652: 38652.activate-deactivate.diff

File 38652.activate-deactivate.diff, 10.3 KB (added by johnbillion, 7 years ago)
  • src/wp-admin/includes/ajax-actions.php

    diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php
    index 90a9dd1..034ec2f 100644
    a b function wp_ajax_install_plugin() { 
    36433643        // If install request is coming from import page, do not return network activation link.
    36443644        $plugins_url = ( 'import' === $pagenow ) ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' );
    36453645
    3646         if ( current_user_can( 'activate_plugins' ) && is_plugin_inactive( $install_status['file'] ) ) {
     3646        if ( current_user_can( 'activate_plugin', $install_status['file'] ) && is_plugin_inactive( $install_status['file'] ) ) {
    36473647                $status['activateUrl'] = add_query_arg( array(
    36483648                        '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $install_status['file'] ),
    36493649                        'action'   => 'activate',
  • src/wp-admin/includes/class-plugin-installer-skin.php

    diff --git a/src/wp-admin/includes/class-plugin-installer-skin.php b/src/wp-admin/includes/class-plugin-installer-skin.php
    index 6c55455..247387e 100644
    a b class Plugin_Installer_Skin extends WP_Upgrader_Skin { 
    7373
    7474                if ( ! $this->result || is_wp_error($this->result) ) {
    7575                        unset( $install_actions['activate_plugin'], $install_actions['network_activate'] );
    76                 } elseif ( ! current_user_can( 'activate_plugins' ) ) {
     76                } elseif ( ! current_user_can( 'activate_plugin', $plugin_file ) ) {
    7777                        unset( $install_actions['activate_plugin'] );
    7878                }
    7979
  • src/wp-admin/includes/class-plugin-upgrader-skin.php

    diff --git a/src/wp-admin/includes/class-plugin-upgrader-skin.php b/src/wp-admin/includes/class-plugin-upgrader-skin.php
    index 1c4da87..b685bca 100644
    a b class Plugin_Upgrader_Skin extends WP_Upgrader_Skin { 
    5252                        'activate_plugin' => '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin) . '" target="_parent">' . __( 'Activate Plugin' ) . '</a>',
    5353                        'plugins_page' => '<a href="' . self_admin_url( 'plugins.php' ) . '" target="_parent">' . __( 'Return to Plugins page' ) . '</a>'
    5454                );
    55                 if ( $this->plugin_active || ! $this->result || is_wp_error( $this->result ) || ! current_user_can( 'activate_plugins' ) )
     55                if ( $this->plugin_active || ! $this->result || is_wp_error( $this->result ) || ! current_user_can( 'activate_plugin', $this->plugin ) )
    5656                        unset( $update_actions['activate_plugin'] );
    5757
    5858                /**
  • src/wp-admin/includes/class-wp-plugin-install-list-table.php

    diff --git a/src/wp-admin/includes/class-wp-plugin-install-list-table.php b/src/wp-admin/includes/class-wp-plugin-install-list-table.php
    index cd71836..e67ca54 100644
    a b class WP_Plugin_Install_List_Table extends WP_List_Table { 
    470470                                        case 'newer_installed':
    471471                                                if ( is_plugin_active( $status['file'] ) ) {
    472472                                                        $action_links[] = '<button type="button" class="button button-disabled" disabled="disabled">' . _x( 'Active', 'plugin' ) . '</button>';
    473                                                 } elseif ( current_user_can( 'activate_plugins' ) ) {
     473                                                } elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) {
    474474                                                        $button_text  = __( 'Activate' );
    475475                                                        /* translators: %s: Plugin name */
    476476                                                        $button_label = _x( 'Activate %s', 'plugin' );
  • src/wp-admin/includes/class-wp-plugins-list-table.php

    diff --git a/src/wp-admin/includes/class-wp-plugins-list-table.php b/src/wp-admin/includes/class-wp-plugins-list-table.php
    index 136fbd4..4128edf 100644
    a b class WP_Plugins_List_Table extends WP_List_Table { 
    623623                                                'network_only' => __( 'Network Only' ),
    624624                                        );
    625625                                } elseif ( $is_active ) {
    626                                         /* translators: %s: plugin name */
    627                                         $actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Deactivate' ) . '</a>';
     626                                        if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
     627                                                /* translators: %s: plugin name */
     628                                                $actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Deactivate' ) . '</a>';
     629                                        }
    628630                                } else {
    629                                         /* translators: %s: plugin name */
    630                                         $actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Activate' ) . '</a>';
     631                                        if ( current_user_can( 'activate_plugin', $plugin_file ) ) {
     632                                                /* translators: %s: plugin name */
     633                                                $actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Activate' ) . '</a>';
     634                                        }
    631635
    632636                                        if ( ! is_multisite() && current_user_can( 'delete_plugins' ) ) {
    633637                                                /* translators: %s: plugin name */
  • src/wp-admin/plugins.php

    diff --git a/src/wp-admin/plugins.php b/src/wp-admin/plugins.php
    index 3d7ff01..e19f584 100644
    a b if ( $action ) { 
    2929
    3030        switch ( $action ) {
    3131                case 'activate':
    32                         if ( ! current_user_can('activate_plugins') )
    33                                 wp_die(__('Sorry, you are not allowed to activate plugins for this site.'));
     32                        if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
     33                                wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
     34                        }
    3435
    3536                        if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
    3637                                wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
    if ( $action ) { 
    8889                                        if ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) {
    8990                                                unset( $plugins[ $i ] );
    9091                                        }
     92                                        // Only activate plugins which the user can activate.
     93                                        if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
     94                                                unset( $plugins[ $i ] );
     95                                        }
    9196                                }
    9297                        }
    9398
    if ( $action ) { 
    146151                        exit;
    147152
    148153                case 'error_scrape':
    149                         if ( ! current_user_can('activate_plugins') )
    150                                 wp_die(__('Sorry, you are not allowed to activate plugins for this site.'));
     154                        if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
     155                                wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
     156                        }
    151157
    152158                        check_admin_referer('plugin-activation-error_' . $plugin);
    153159
    if ( $action ) { 
    167173                        exit;
    168174
    169175                case 'deactivate':
    170                         if ( ! current_user_can('activate_plugins') )
    171                                 wp_die(__('Sorry, you are not allowed to deactivate plugins for this site.'));
     176                        if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
     177                                wp_die( __( 'Sorry, you are not allowed to deactivate this plugin.' ) );
     178                        }
    172179
    173180                        check_admin_referer('deactivate-plugin_' . $plugin);
    174181
    if ( $action ) { 
    192199                        exit;
    193200
    194201                case 'deactivate-selected':
    195                         if ( ! current_user_can('activate_plugins') )
     202                        if ( ! current_user_can( 'deactivate_plugins' ) ) {
    196203                                wp_die(__('Sorry, you are not allowed to deactivate plugins for this site.'));
     204                        }
    197205
    198206                        check_admin_referer('bulk-plugins');
    199207
    if ( $action ) { 
    204212                        } else {
    205213                                $plugins = array_filter( $plugins, 'is_plugin_active' );
    206214                                $plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );
     215
     216                                foreach ( $plugins as $i => $plugin ) {
     217                                        // Only deactivate plugins which the user can deactivate.
     218                                        if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) {
     219                                                unset( $plugins[ $i ] );
     220                                        }
     221                                }
     222
    207223                        }
    208224                        if ( empty($plugins) ) {
    209225                                wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
  • src/wp-includes/capabilities.php

    diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php
    index abd8725..387f029 100644
    a b function map_meta_cap( $cap, $user_id ) { 
    393393                }
    394394                break;
    395395        case 'activate_plugins':
    396                 $caps[] = $cap;
     396        case 'deactivate_plugins':
     397        case 'activate_plugin':
     398        case 'deactivate_plugin':
     399                $caps[] = 'activate_plugins';
    397400                if ( is_multisite() ) {
    398401                        // update_, install_, and delete_ are handled above with is_super_admin().
    399402                        $menu_perms = get_site_option( 'menu_items', array() );
  • tests/phpunit/tests/user/capabilities.php

    diff --git a/tests/phpunit/tests/user/capabilities.php b/tests/phpunit/tests/user/capabilities.php
    index a479011..b2eb3f5 100644
    a b class Tests_User_Capabilities extends WP_UnitTestCase { 
    233233                        'upload_themes'          => array( 'administrator' ),
    234234                        'customize'              => array( 'administrator' ),
    235235                        'add_users'              => array( 'administrator' ),
     236                        'deactivate_plugins'     => array( 'administrator' ),
    236237
    237238                        'edit_categories'        => array( 'administrator', 'editor' ),
    238239                        'delete_categories'      => array( 'administrator', 'editor' ),
    class Tests_User_Capabilities extends WP_UnitTestCase { 
    261262                        'upload_themes'          => array(),
    262263                        'edit_css'               => array(),
    263264                        'upgrade_network'        => array(),
     265                        'deactivate_plugins'     => array(),
    264266
    265267                        'customize'              => array( 'administrator' ),
    266268                        'delete_site'            => array( 'administrator' ),
    class Tests_User_Capabilities extends WP_UnitTestCase { 
    421423                        $expected['create_users'],
    422424                        $expected['manage_links'],
    423425                        // Singular object meta capabilities (where an object ID is passed) are not tested:
     426                        $expected['activate_plugin'],
     427                        $expected['deactivate_plugin'],
    424428                        $expected['remove_user'],
    425429                        $expected['promote_user'],
    426430                        $expected['edit_user'],