WordPress.org

Make WordPress Core

Changeset 30333


Ignore:
Timestamp:
11/13/14 15:20:42 (2 years ago)
Author:
johnbillion
Message:

Introduce a button on the user profile screen which clears all other sessions, and on the user editing screen which clears all sessions. Only appears when there are applicable sessions which can be cleared.

See #30264.
Props jorbin, ocean90, johnbillion

Location:
trunk/src
Files:
6 edited

Legend:

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

    r29178 r30333  
    6262    'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs', 
    6363    'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail', 
    64     'parse-media-shortcode' 
     64    'parse-media-shortcode', 'destroy-sessions' 
    6565); 
    6666 
  • trunk/src/wp-admin/css/forms.css

    r29690 r30333  
    612612} 
    613613 
     614table.form-table td .updated p {  
     615    font-size: 13px;  
     616    margin: 0.3em 0;  
     617} 
     618 
    614619/*------------------------------------------------------------------------------ 
    615620  18.0 - Users 
  • trunk/src/wp-admin/includes/ajax-actions.php

    r30284 r30333  
    27712771    ) ); 
    27722772} 
     2773 
     2774/** 
     2775 * AJAX handler for destroying multiple open sessions for a user. 
     2776 * 
     2777 * @since 4.1.0 
     2778 * 
     2779 */ 
     2780function wp_ajax_destroy_sessions() { 
     2781 
     2782    if ( empty( $_POST['user_id'] ) ) { 
     2783        $user = new WP_Error(); 
     2784    } else { 
     2785        $user = new WP_User( absint( $_POST['user_id'] ) ); 
     2786 
     2787        if ( ! $user->exists() ) { 
     2788            $user = new WP_Error(); 
     2789        } elseif ( ! current_user_can( 'edit_user', $user->ID ) ) { 
     2790            $user = new WP_Error(); 
     2791        } elseif ( ! check_ajax_referer( sprintf( 'destroy_sessions_%d', $user->ID ), false, false ) ) { 
     2792            $user = new WP_Error(); 
     2793        } 
     2794    } 
     2795 
     2796    if ( is_wp_error( $user ) ) { 
     2797        wp_send_json_error( array( 
     2798            'message' => __( 'Could not log out user sessions. Please try again.' ), 
     2799        ) ); 
     2800    } 
     2801 
     2802    if ( isset( $_POST['token'] ) ) { 
     2803        $keep = wp_unslash( $_POST['token'] ); 
     2804    } else { 
     2805        $keep = null; 
     2806    } 
     2807 
     2808    $sessions = WP_Session_Tokens::get_instance( $user->ID ); 
     2809 
     2810    if ( is_string( $keep ) ) { 
     2811        $sessions->destroy_others( $keep ); 
     2812        $message = __( 'You are now logged out everywhere else' ); 
     2813    } else { 
     2814        $sessions->destroy_all(); 
     2815        /* translators: 1: User's display name. */  
     2816        $message = sprintf( __( '%s has been logged out' ), $user->display_name ); 
     2817    } 
     2818 
     2819    wp_send_json_success( array( 
     2820        'message' => $message 
     2821    ) ); 
     2822 
     2823} 
  • trunk/src/wp-admin/js/user-profile.js

    r27111 r30333  
    1 /* global ajaxurl, pwsL10n */ 
     1/* global ajaxurl, pwsL10n, _wpSessionMangager */ 
    22(function($){ 
    33 
     
    125125    }); 
    126126 
     127    $('#destroy-sessions').on('click',function(e){ 
     128 
     129        var $this = $(this); 
     130        var data = { 
     131            action      : 'destroy-sessions', 
     132            _ajax_nonce : _wpSessionMangager.nonce, 
     133            user_id     : _wpSessionMangager.user_id, 
     134            token       : $(this).data('token') 
     135        }; 
     136 
     137        $.post( ajaxurl, data, function( response ) { 
     138 
     139            if ( response.success ) { 
     140                $this.prop( 'disabled', true ); 
     141                $this.before( '<div class="updated inline"><p>' + response.data.message + '</p></div>' ); 
     142            } else { 
     143                $this.before( '<div class="error inline"><p>' + response.data.message + '</p></div>' ); 
     144            } 
     145 
     146        }, 'json' ); 
     147 
     148        e.preventDefault(); 
     149 
     150    }); 
     151 
    127152})(jQuery); 
  • trunk/src/wp-admin/user-edit.php

    r30033 r30333  
    2525 
    2626wp_enqueue_script('user-profile'); 
     27 
     28wp_localize_script( 
     29    'user-profile', 
     30    '_wpSessionMangager', 
     31    array( 
     32        'user_id' => $user_id, 
     33        'nonce'   => wp_create_nonce( sprintf( 'destroy_sessions_%d', $user_id ) ), 
     34    ) 
     35); 
    2736 
    2837$title = IS_PROFILE_PAGE ? __('Profile') : __('Edit User'); 
     
    187196if ( !current_user_can('edit_user', $user_id) ) 
    188197    wp_die(__('You do not have permission to edit this user.')); 
     198 
     199$sessions = WP_Session_Tokens::get_instance( $profileuser->ID ); 
    189200 
    190201include(ABSPATH . 'wp-admin/admin-header.php'); 
     
    290301do_action( 'personal_options', $profileuser ); 
    291302?> 
     303 
    292304</table> 
    293305<?php 
     
    475487</tr> 
    476488<?php endif; ?> 
     489 
     490<?php if ( IS_PROFILE_PAGE && ( count( $sessions->get_all() ) > 1 ) ) { ?> 
     491    <tr> 
     492        <th>&nbsp;</th> 
     493        <td> 
     494            <p><button class="button button-secondary hide-if-no-js" id="destroy-sessions" data-token="<?php echo esc_attr( wp_get_session_token() ); ?>"><?php _e( 'Log Out of All Other Sessions' ); ?></button></p> 
     495            <p class="description hide-if-no-js"> 
     496                <?php _e( 'Left your account logged in at a public computer? Lost your phone? This will log you out everywhere except your current browser.' ); ?> 
     497            </p> 
     498        </td> 
     499    </tr> 
     500<?php } else if ( ! IS_PROFILE_PAGE && ( count( $sessions->get_all() ) > 0 ) ) { ?> 
     501    <tr> 
     502        <th>&nbsp;</th> 
     503        <td> 
     504            <p><button class="button button-secondary hide-if-no-js" id="destroy-sessions"><?php _e( 'Log Out of All Sessions' ); ?></button></p> 
     505            <p class="description hide-if-no-js"> 
     506                <?php printf( __( 'Log %s out of all sessions' ), $profileuser->display_name ); ?> 
     507            </p> 
     508        </td> 
     509    </tr> 
     510<?php } ?> 
     511 
    477512</table> 
    478513 
  • trunk/src/wp-includes/session.php

    r29751 r30333  
    132132        $session['expiration'] = $expiration; 
    133133 
     134        // IP address. 
     135        if ( !empty( $_SERVER['REMOTE_ADDR'] ) ) { 
     136            $session['ip'] = $_SERVER['REMOTE_ADDR']; 
     137        } 
     138 
     139        // User-agent. 
     140        if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { 
     141            $session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] ); 
     142        } 
     143 
     144        // Timestamp 
     145        $session['login'] = time(); 
     146 
    134147        $token = wp_generate_password( 43, false, false ); 
    135148 
     
    384397     */ 
    385398    protected function update_sessions( $sessions ) { 
    386         if ( ! has_filter( 'attach_session_information' ) ) { 
    387             $sessions = wp_list_pluck( $sessions, 'expiration' ); 
    388         } 
    389  
    390399        if ( $sessions ) { 
    391400            update_user_meta( $this->user_id, 'session_tokens', $sessions ); 
Note: See TracChangeset for help on using the changeset viewer.