Make WordPress Core

Changeset 60977


Ignore:
Timestamp:
10/19/2025 05:40:13 PM (12 months ago)
Author:
johnjamesjacoby
Message:

Networks and Sites: remove email address check when attempting to demote a Super Admin.

This change ensures that a capable Super Admin is allowed to manage global Users as intended, and removes an invisible & undocumented restriction (that was easily bypassed anyways).

It also adds 1 multisite unit test to confirm the intended behavior

Props flixos90, johnjamesjacoby, Mista-Flo.

Fixes #39170.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/user-edit.php

    r60679 r60977  
    472472                                        <?php endif; // End if ! IS_PROFILE_PAGE. ?>
    473473
    474                                         <?php if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) ) : ?>
     474                                        <?php if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && ! isset( $super_admins ) ) : ?>
    475475                                                <tr class="user-super-admin-wrap">
    476476                                                        <th><?php _e( 'Super Admin' ); ?></th>
    477477                                                        <td>
    478                                                                 <?php if ( 0 !== strcasecmp( $profile_user->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profile_user->ID ) ) : ?>
    479                                                                         <p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>
    480                                                                 <?php else : ?>
    481                                                                         <p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p>
    482                                                                 <?php endif; ?>
     478                                                                <p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>
    483479                                                        </td>
    484480                                                </tr>
  • trunk/src/wp-includes/capabilities.php

    r60491 r60977  
    12531253 *
    12541254 * @since 3.0.0
     1255 * @since 6.9.0 Super admin privileges can be revoked regardless of email address.
    12551256 *
    12561257 * @global array $super_admins
    … …  
    12791280
    12801281        $user = get_userdata( $user_id );
    1281         if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) {
     1282        if ( $user ) {
    12821283                $key = array_search( $user->user_login, $super_admins, true );
    12831284                if ( false !== $key ) {
  • trunk/tests/phpunit/tests/user/multisite.php

    r60915 r60977  
    449449                $wp_roles->remove_role( $role );
    450450        }
     451
     452        /**
     453         * @ticket 39170
     454         */
     455        public function test_revoke_super_admin_with_network_email() {
     456                if ( isset( $GLOBALS['super_admins'] ) ) {
     457                        $old_global = $GLOBALS['super_admins'];
     458                        unset( $GLOBALS['super_admins'] );
     459                }
     460
     461                $old_network_email = get_site_option( 'admin_email' );
     462                $email_address     = 'superadmin333@example.org';
     463
     464                $user_id = self::factory()->user->create(
     465                        array(
     466                                'user_email' => $email_address,
     467                        )
     468                );
     469
     470                grant_super_admin( $user_id );
     471                update_site_option( 'admin_email', $email_address );
     472
     473                $result = revoke_super_admin( $user_id );
     474
     475                update_site_option( 'admin_email', $old_network_email );
     476
     477                if ( isset( $old_global ) ) {
     478                        $GLOBALS['super_admins'] = $old_global;
     479                }
     480
     481                $this->assertTrue( $result );
     482        }
    451483}
Note: See TracChangeset for help on using the changeset viewer.