WordPress.org

Make WordPress Core

Ticket #30264: 30264.5.diff

File 30264.5.diff, 6.7 KB (added by johnbillion, 5 years ago)
  • src/wp-admin/admin-ajax.php

     
    6161        'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
    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
    6767// Register core Ajax calls.
  • src/wp-admin/css/forms.css

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

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

     
    1 /* global ajaxurl, pwsL10n */
     1/* global ajaxurl, pwsL10n, _wpSessionMangager */
    22(function($){
    33
    44        function check_pass_strength() {
     
    124124                });
    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);
  • src/wp-admin/user-edit.php

     
    2525
    2626wp_enqueue_script('user-profile');
    2727
     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);
     36
    2837$title = IS_PROFILE_PAGE ? __('Profile') : __('Edit User');
    2938if ( current_user_can('edit_users') && !IS_PROFILE_PAGE )
    3039        $submenu_file = 'users.php';
     
    187196if ( !current_user_can('edit_user', $user_id) )
    188197        wp_die(__('You do not have permission to edit this user.'));
    189198
     199$sessions = WP_Session_Tokens::get_instance( $profileuser->ID );
     200
    190201include(ABSPATH . 'wp-admin/admin-header.php');
    191202?>
    192203
     
    289300 */
    290301do_action( 'personal_options', $profileuser );
    291302?>
     303
    292304</table>
    293305<?php
    294306        if ( IS_PROFILE_PAGE ) {
     
    474486        </td>
    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
    479514<?php
  • src/wp-includes/session.php

     
    131131                $session = apply_filters( 'attach_session_information', array(), $this->user_id );
    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
    136149                $this->update( $token, $session );
     
    383396         * @param array $sessions Sessions.
    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 );
    392401                } else {