WordPress.org

Make WordPress Core

Ticket #16001: 16001.diff

File 16001.diff, 17.2 KB (added by garyc40, 7 years ago)

first attempt to patch this bug

  • wp-admin/includes/class-wp-ms-users-list-table.php

    diff --git wp-admin/includes/class-wp-ms-users-list-table.php wp-admin/includes/class-wp-ms-users-list-table.php
    index c3bfec2..bd502ed 100644
    class WP_MS_Users_List_Table extends WP_List_Table { 
    5656
    5757                $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];
    5858
    59                 // Query the user IDs for this page
    60                 $wp_user_search = new WP_User_Query( $args );
     59                if ( $role == 'pending' )
     60                        $wp_user_search = new WP_Pending_User_Query( $args ); // Query for pending users
     61                else
     62                        $wp_user_search = new WP_User_Query( $args ); // Query the user IDs for this page
    6163
    6264                $this->items = $wp_user_search->get_results();
    6365
    class WP_MS_Users_List_Table extends WP_List_Table { 
    6870        }
    6971
    7072        function get_bulk_actions() {
     73                global $role;
     74               
    7175                $actions = array();
    72                 if ( current_user_can( 'delete_users' ) )
    73                         $actions['delete'] = __( 'Delete' );
    74                 $actions['spam'] = _x( 'Mark as Spam', 'user' );
    75                 $actions['notspam'] = _x( 'Not Spam', 'user' );
     76               
     77                if ( $role == 'pending' ) {
     78                        if ( current_user_can( 'delete_users' ) )
     79                                $actions['deletesignup'] = __( 'Delete' );
     80                        $actions['activate'] = _x( 'Activate', 'user' );
     81                        $actions['resend'] = __( 'Resend Email' );
     82                } else {
     83                        if ( current_user_can( 'delete_users' ) )
     84                                $actions['delete'] = __( 'Delete' );
     85                        $actions['spam'] = _x( 'Mark as Spam', 'user' );
     86                        $actions['notspam'] = _x( 'Not Spam', 'user' );
     87                }
    7688
    7789                return $actions;
    7890        }
    class WP_MS_Users_List_Table extends WP_List_Table { 
    8799                $total_users = get_user_count();
    88100                $super_admins = get_super_admins();
    89101                $total_admins = count( $super_admins );
     102                $total_pendings = get_pending_user_count();
    90103
    91                 $current_role = false;
    92                 $class = $role != 'super' ? ' class="current"' : '';
     104                $class = in_array( $role, array( 'super', 'pending' ) ) ? '' : ' class="current"';
    93105                $role_links = array();
    94106                $role_links['all'] = "<a href='" . network_admin_url('users.php') . "'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';
    95107                $class = $role == 'super' ? ' class="current"' : '';
    96108                $role_links['super'] = "<a href='" . network_admin_url('users.php?role=super') . "'$class>" . sprintf( _n( 'Super Admin <span class="count">(%s)</span>', 'Super Admins <span class="count">(%s)</span>', $total_admins ), number_format_i18n( $total_admins ) ) . '</a>';
     109                $class = $role == 'pending' ? ' class="current"' : '';
     110                $role_links['pending'] = "<a href='" . network_admin_url('users.php?role=pending') . "'$class>" . sprintf( _n( 'Pending Confirmation <span class="count">(%s)</span>', 'Pending Confirmation <span class="count">(%s)</span>', $total_pendings ), number_format_i18n( $total_pendings ) ) . '</a>';
    97111
    98112                return $role_links;
    99113        }
    class WP_MS_Users_List_Table extends WP_List_Table { 
    108122        }
    109123
    110124        function get_columns() {
     125                global $role;
     126               
    111127                $users_columns = array(
    112128                        'cb'         => '<input type="checkbox" />',
    113129                        'username'   => __( 'Username' ),
    114                         'name'       => __( 'Name' ),
    115130                        'email'      => __( 'E-mail' ),
    116131                        'registered' => _x( 'Registered', 'user' ),
    117                         'blogs'      => __( 'Sites' )
    118132                );
     133               
     134                if ( $role != 'pending' ) {
     135                        $users_columns['name'] = __( 'Name' );
     136                        $users_columns['blogs'] = __( 'Sites' );
     137                }
     138               
    119139                $users_columns = apply_filters( 'wpmu_users_columns', $users_columns );
    120140
    121141                return $users_columns;
    122142        }
    123143
    124144        function get_sortable_columns() {
    125                 return array(
     145                global $role;
     146               
     147                $sortables = array(
    126148                        'username'   => 'login',
    127                         'name'       => 'name',
    128149                        'email'      => 'email',
    129150                        'registered' => 'id',
    130151                );
     152               
     153                if ( $role != 'pending' ) {
     154                        $sortables['name'] = 'name';
     155                }
     156               
     157                return $sortables;
    131158        }
    132159
    133160        function display_rows() {
    134                 global $current_site, $mode;
     161                global $current_site, $mode, $role;
    135162
    136163                $alt = '';
    137164                $super_admins = get_super_admins();
    class WP_MS_Users_List_Table extends WP_List_Table { 
    140167
    141168                        $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );
    142169
    143                         foreach ( $status_list as $status => $col ) {
    144                                 if ( $user->$status )
    145                                         $alt .= " $col";
     170                        if ( $role == 'pending' ) {                             
     171                                $user->ID = $user->user_login;
     172                                $user->user_registered = $user->registered;
     173                        } else {
     174                                foreach ( $status_list as $status => $col ) {
     175                                        if ( $user->$status )
     176                                                $alt .= " $col";
     177                                }
    146178                        }
    147179
    148180                        ?>
    class WP_MS_Users_List_Table extends WP_List_Table { 
    171203
    172204                                        case 'username':
    173205                                                $avatar = get_avatar( $user->user_email, 32 );
    174                                                 if ( get_current_user_id() == $user->ID ) {
    175                                                         $edit_link = esc_url( network_admin_url( 'profile.php' ) );
     206                                                if ( $role == 'pending' ) {
     207                                                        $activate_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'activatesignup' ) . '&amp;action=activatesignup&amp;user_login=' . $user->user_login ) ) );
     208                                                        $resend_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'resendsignup' ) . '&amp;action=resendsignup&amp;user_login=' . $user->user_login ) ) );
    176209                                                } else {
    177                                                         $edit_link = esc_url( network_admin_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), 'user-edit.php?user_id=' . $user->ID ) ) );
     210                                                        if ( get_current_user_id() == $user->ID ) {
     211                                                                $edit_link = esc_url( network_admin_url( 'profile.php' ) );
     212                                                        } else {
     213                                                                $edit_link = esc_url( network_admin_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), 'user-edit.php?user_id=' . $user->ID ) ) );
     214                                                        }
    178215                                                }
    179216
    180217                                                echo "<td $attributes>"; ?>
    181                                                         <?php echo $avatar; ?><strong><a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php
     218                                                        <?php echo $avatar; ?><strong>
     219                                                                <?php if ( $role == 'pending' ): ?>
     220                                                                        <?php echo stripslashes( $user->user_login ); ?>
     221                                                                <?php else: ?>
     222                                                                        <a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a>   
     223                                                                <?php endif ?>
     224                                                                <?php
    182225                                                        if ( in_array( $user->user_login, $super_admins ) )
    183226                                                                echo ' - ' . __( 'Super Admin' );
    184227                                                        ?></strong>
    185228                                                        <br/>
    186229                                                        <?php
    187230                                                                $actions = array();
    188                                                                 $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
     231                                                                if ( $role == 'pending' ) {
     232                                                                        $actions['activate'] = '<a href="' . $activate_link . '">' . __( 'Activate' ) . '</a>';
     233                                                                        $actions['resend'] = '<a href="' . $resend_link . '">' . __( 'Resend Email' ) . '</a>';
     234                                                                } else {
     235                                                                        $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
     236                                                                }
    189237
    190238                                                                if ( current_user_can( 'delete_user', $user->ID) && ! in_array( $user->user_login, $super_admins ) ) {
    191                                                                         $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     239                                                                        if ( $role == 'pending' ) {
     240                                                                                $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deletesignup' ) . '&amp;action=deletesignup&amp;user_login=' . $user->user_login ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     241                                                                        } else {
     242                                                                                $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
     243                                                                        }
    192244                                                                }
    193245
    194246                                                                echo $this->row_actions( $actions );
  • wp-admin/network/edit.php

    diff --git wp-admin/network/edit.php wp-admin/network/edit.php
    index e785d38..5cadac7 100644
    if ( empty( $_GET['action'] ) ) { 
    1818        exit;
    1919}
    2020
     21function _wp_activate_by_user_login( $user_login ) {
     22        global $wpdb;
     23       
     24        $key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE active != 1 AND user_login = %s", $user_login ) );
     25        if ( $key ) {
     26                wpmu_activate_signup( $key );
     27        }
     28}
     29
     30function _wp_resend_by_user_login( $user_login ) {
     31        global $wpdb;
     32       
     33        $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->signups} WHERE active !=1 AND user_login = %s", $user_login ) );
     34       
     35        if ( $user ) {
     36                wpmu_signup_user_notification($user->user_login, $user->user_email, $user->activation_key, $user->meta);
     37        }
     38}
     39
     40function confirm_delete_signups( $signups ) {
     41        global $wpdb;
     42       
     43        $current_user = wp_get_current_user();
     44        if ( ! is_array( $signups ) ) {
     45                return false;
     46        }
     47       
     48        screen_icon();
     49        ?>
     50        <h2><?php esc_html_e( 'Users' ); ?></h2>
     51        <p><?php _e( 'Are you sure you want to delete the following users?' ); ?></p>
     52        <form action="edit.php?action=dodeletesignup" method="post">
     53        <input type="hidden" name="dodeletesignup" />
     54        <?php
     55        wp_nonce_field( 'ms-signups-delete' );
     56        echo '<ul>';
     57        foreach ( $signups as $delete_signup ) {
     58                echo "<li><input type='hidden' name='user[]' value='{$delete_signup}'/>{$delete_signup}</li>\n";
     59        }
     60        echo '</ul>';
     61
     62        submit_button( __('Confirm Deletion'), 'delete' );
     63        ?>
     64        </form>
     65    <?php
     66        return true;
     67}
     68
    2169function confirm_delete_users( $users ) {
    2270        $current_user = wp_get_current_user();
    2371        if ( !is_array( $users ) )
    switch ( $_GET['action'] ) { 
    421469
    422470                                                        update_user_status( $val, 'spam', '0', 1 );
    423471                                                break;
     472                                               
     473                                                case 'activate':
     474                                                        $userfunction = 'all_activate';
     475                                                        _wp_activate_by_user_login( $val );
     476                                                break;
     477                                               
     478                                                case 'resend':
     479                                                        $userfunction = 'all_resend';
     480                                                        _wp_resend_by_user_login( $val );
     481                                                break;
     482                                               
     483                                                case 'deletesignup':
     484                                                        if ( ! current_user_can( 'delete_users' ) )
     485                                                                wp_die( __( 'You do not have permission to access this page.' ) );
     486                                                               
     487                                                        $title = __( 'Users' );
     488                                                        $parent_file = 'users.php';
     489                                                        require_once( '../admin-header.php' );
     490                                                        echo '<div class="wrap">';
     491                                                        confirm_delete_signups( $_POST['allusers'] );
     492                                                        echo '</div>';
     493                                            require_once( '../admin-footer.php' );
     494                                            exit();
     495                                                break;
    424496                                        }
    425497                                }
    426498                        }
    switch ( $_GET['action'] ) { 
    467539                wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $deletefunction ), network_admin_url( 'users.php' ) ) );
    468540                exit();
    469541        break;
     542       
     543        case 'activatesignup':
     544                if ( ! current_user_can( 'manage_network_users' ) )
     545                        wp_die( __( 'You do not have permission to access this page.' ) );
     546
     547                check_admin_referer( 'activatesignup' );
     548               
     549                _wp_activate_by_user_login( $_GET['user_login'] );
     550               
     551                wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'activate' ), network_admin_url( 'users.php' ) ) );
     552                exit();
     553        break;
     554       
     555        case 'resendsignup':
     556                if ( ! current_user_can( 'manage_network_users' ) )
     557                        wp_die( __( 'You do not have permission to access this page.' ) );
     558
     559                check_admin_referer( 'resendsignup' );
     560               
     561                _wp_resend_by_user_login( $_GET['user_login'] );
     562       
     563                wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'resend' ), network_admin_url( 'users.php' ) ) );
     564                exit();
     565        break;
     566       
     567        case 'deletesignup':
     568                if ( ! current_user_can( 'manage_network_users' ) )
     569                        wp_die( __( 'You do not have permission to access this page.' ) );
     570
     571                check_admin_referer( 'deletesignup' );
     572               
     573                if ( ! empty( $_GET['user_login'] ) ) {
     574                        $title = __( 'Users' );
     575                        $parent_file = 'users.php';
     576                        require_once( '../admin-header.php' );
     577                        echo '<div class="wrap">';
     578                        confirm_delete_signups( array( $_GET['user_login'] ) );
     579                        echo '</div>';
     580            require_once( '../admin-footer.php' );
     581                } else {
     582                        wp_redirect( add_query_arg( array( 'role' => 'pending' ), network_admin_url( 'users.php' ) ) );
     583                }
     584                exit();
     585        break;
     586       
     587        case 'dodeletesignup':
     588                if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) )
     589                        wp_die( __( 'You do not have permission to access this page.' ) );
     590
     591                check_admin_referer( 'ms-signups-delete' );
     592               
     593                if ( ! empty( $_POST['user'] ) ) {
     594                        array_walk( $_POST['user'], array( &$wpdb, 'escape_by_ref' ) );
     595                        $wpdb->query( "DELETE FROM {$wpdb->signups} WHERE active != 1 AND user_login IN ('" . implode( "','", $_POST['user'] ) . "')" );
     596                }
     597
     598                if ( count( $_POST['user'] ) > 1 ) {
     599                        $delete_action = 'all_delete';
     600                } else {
     601                        $delete_action = 'delete';
     602                }
     603
     604                wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => $delete_action ), network_admin_url( 'users.php' ) ) );
     605                exit();
     606        break;
    470607
    471608        default:
    472609                // Let plugins use us as a post handler easily
  • wp-admin/network/users.php

    diff --git wp-admin/network/users.php wp-admin/network/users.php
    index 15853dd..87eb130 100644
    if ( isset( $_REQUEST['updated'] ) && $_REQUEST['updated'] == 'true' && ! empty( 
    5858                        case 'add':
    5959                                _e( 'User added.' );
    6060                        break;
     61                        case 'activate':
     62                                _e( 'User activated.' );
     63                        break;
     64                        case 'resend':
     65                                _e( 'Activation instruction resent to user.');
     66                        break;
     67                        case 'all_activate':
     68                                _e( 'Users activated.' );
     69                        break;
     70                        case 'all_resend':
     71                                _e( 'Activation instruction resent to users.');
     72                        break;
    6173                }
    6274                ?>
    6375        </p></div>
  • wp-includes/ms-functions.php

    diff --git wp-includes/ms-functions.php wp-includes/ms-functions.php
    index b3b21df..5622a56 100644
    function get_user_count() { 
    156156}
    157157
    158158/**
     159 * The number of pending users in your installation.
     160 *
     161 * The count is cached and updated twice daily. This is not a live count.
     162 *
     163 * @since 3.2
     164 *
     165 * @return int
     166 */
     167function get_pending_user_count() {
     168        return get_site_option( 'pending_user_count' );
     169}
     170
     171/**
    159172 * The number of active sites on your installation.
    160173 *
    161174 * The count is cached and updated twice daily. This is not a live count.
    function wp_update_network_counts() { 
    20672080
    20682081        $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'") );
    20692082        update_site_option( 'user_count', $count );
     2083       
     2084        $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(user_login) AS c FROM $wpdb->signups WHERE active != 1" ) );
     2085        update_site_option( 'pending_user_count', $count );
    20702086}
    20712087
    20722088?>
     2089 No newline at end of file
  • wp-includes/user.php

    diff --git wp-includes/user.php wp-includes/user.php
    index c30f7be..5e792a6 100644
    class WP_User_Query { 
    617617        }
    618618}
    619619
     620class WP_Pending_User_Query extends WP_User_Query {
     621        function prepare_query() {
     622                global $wpdb;
     623
     624                $qv = &$this->query_vars;
     625                $this->query_fields = "{$wpdb->signups}.*";
     626
     627                $this->query_from = "FROM {$wpdb->signups}";
     628                $this->query_where = "WHERE 1=1 AND active != 1";
     629
     630                // sorting
     631                if ( in_array( $qv['orderby'], array( 'nicename', 'email' ) ) ) {
     632                        $orderby = 'user_' . $qv['orderby'];
     633                } elseif ( in_array( $qv['orderby'], array( 'user_email', 'registered' ) ) ) {
     634                        $orderby = $qv['orderby'];
     635                } else {
     636                        $orderby = 'user_login';
     637                }
     638
     639                $qv['order'] = strtoupper( $qv['order'] );
     640                if ( 'ASC' == $qv['order'] )
     641                        $order = 'ASC';
     642                else
     643                        $order = 'DESC';
     644                $this->query_orderby = "ORDER BY $orderby $order";
     645
     646                // limit
     647                if ( $qv['number'] ) {
     648                        if ( $qv['offset'] )
     649                                $this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']);
     650                        else
     651                                $this->query_limit = $wpdb->prepare("LIMIT %d", $qv['number']);
     652                }
     653
     654                $search = trim( $qv['search'] );
     655                if ( $search ) {
     656                        $leading_wild = ( ltrim($search, '*') != $search );
     657                        $trailing_wild = ( rtrim($search, '*') != $search );
     658                        if ( $leading_wild && $trailing_wild )
     659                                $wild = 'both';
     660                        elseif ( $leading_wild )
     661                                $wild = 'leading';
     662                        elseif ( $trailing_wild )
     663                                $wild = 'trailing';
     664                        else
     665                                $wild = false;
     666                        if ( $wild )
     667                                $search = trim($search, '*');
     668
     669                        if ( false !== strpos( $search, '@') )
     670                                $search_columns = array('user_email');
     671                        else
     672                                $search_columns = array('user_login');
     673
     674                        $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
     675                }
     676
     677                $blog_id = absint( $qv['blog_id'] );
     678
     679                do_action_ref_array( 'pre_user_query', array( &$this ) );
     680        }
     681       
     682        /**
     683         * Execute the query, with the current variables
     684         *
     685         * @since 3.2.0
     686         * @access private
     687         */
     688        function query() {
     689                global $wpdb;
     690               
     691                $this->results = $wpdb->get_results("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit");
     692
     693                if ( !$this->results )
     694                        return;
     695
     696                if ( $this->query_vars['count_total'] )
     697                        $this->total_users = $wpdb->get_var("SELECT COUNT(*) $this->query_from $this->query_where");
     698        }
     699}
     700
    620701/**
    621702 * Retrieve list of users matching criteria.
    622703 *