WordPress.org

Make WordPress Core

Ticket #23295: 23295-10.patch

File 23295-10.patch, 8.2 KB (added by azaozz, 10 months ago)
  • wp-admin/includes/ajax-actions.php

     
    20542054} 
    20552055 
    20562056function wp_ajax_heartbeat() { 
    2057         check_ajax_referer( 'heartbeat-nonce', '_nonce' ); 
     2057        if ( empty( $_POST['_nonce'] ) ) 
     2058                wp_send_json_error(); 
     2059 
    20582060        $response = array(); 
    20592061 
     2062        if ( false === wp_verify_nonce( $_POST['_nonce'], 'heartbeat-nonce' ) ) { 
     2063                // User is logged in but nonces have expired. 
     2064                $response['nonces_expired'] = true; 
     2065                wp_send_json($response); 
     2066        } 
     2067 
    20602068        // screen_id is the same as $current_screen->id and the JS global 'pagenow' 
    20612069        if ( ! empty($_POST['screen_id']) ) 
    20622070                $screen_id = sanitize_key($_POST['screen_id']); 
     
    20762084        // Allow the transport to be replaced with long-polling easily 
    20772085        do_action( 'heartbeat_tick', $response, $screen_id ); 
    20782086 
    2079         // send the current time acording to the server 
     2087        // Send the current time acording to the server 
    20802088        $response['server_time'] = time(); 
    20812089 
    20822090        wp_send_json($response); 
  • wp-admin/includes/misc.php

     
    639639function wp_refresh_post_nonces( $response, $data, $screen_id ) { 
    640640        if ( array_key_exists( 'wp-refresh-post-nonces', $data ) ) { 
    641641                $received = $data['wp-refresh-post-nonces']; 
     642                $response['wp-refresh-post-nonces'] = array( 'check' => 1 ); 
    642643 
    643644                if ( ! $post_id = absint( $received['post_id'] ) ) 
    644645                        return $response; 
    645646 
    646                 if ( ! current_user_can('edit_post', $post_id) ) 
     647                if ( ! current_user_can( 'edit_post', $post_id ) || empty( $received['post_nonce'] ) ) 
    647648                        return $response; 
    648649 
    649                 if ( ! empty( $received['post_nonce'] ) && 2 === wp_verify_nonce( $received['post_nonce'], 'update-post_' . $post_id ) ) { 
     650                if ( 2 === wp_verify_nonce( $received['post_nonce'], 'update-post_' . $post_id ) ) { 
    650651                        $response['wp-refresh-post-nonces'] = array( 
    651                                 'replace-autosavenonce' => wp_create_nonce('autosave'), 
    652                                 'replace-getpermalinknonce' => wp_create_nonce('getpermalink'), 
    653                                 'replace-samplepermalinknonce' => wp_create_nonce('samplepermalink'), 
    654                                 'replace-closedpostboxesnonce' => wp_create_nonce('closedpostboxes'), 
    655                                 'replace-_ajax_linking_nonce' => wp_create_nonce( 'internal-linking' ), 
    656                                 'replace-_wpnonce' => wp_create_nonce( 'update-post_' . $post_id ), 
     652                                'replace' => array( 
     653                                        'autosavenonce' => wp_create_nonce('autosave'), 
     654                                        'getpermalinknonce' => wp_create_nonce('getpermalink'), 
     655                                        'samplepermalinknonce' => wp_create_nonce('samplepermalink'), 
     656                                        'closedpostboxesnonce' => wp_create_nonce('closedpostboxes'), 
     657                                        '_ajax_linking_nonce' => wp_create_nonce( 'internal-linking' ), 
     658                                        '_wpnonce' => wp_create_nonce( 'update-post_' . $post_id ), 
     659                                ), 
     660                                'heartbeatNonce' => wp_create_nonce( 'heartbeat-nonce' ), 
    657661                        ); 
    658662                } 
    659663        } 
  • wp-admin/js/post.js

     
    316316        function schedule() { 
    317317                check = false; 
    318318                window.clearTimeout( timeout ); 
    319                 timeout = window.setTimeout( function(){ check = 1; }, 3600000 ); 
     319                timeout = window.setTimeout( function(){ check = true; }, 300000 ); 
    320320        } 
    321321 
    322322        $(document).on( 'heartbeat-send.wp-refresh-nonces', function( e, data ) { 
     
    329329                                        post_nonce: nonce 
    330330                                }; 
    331331                        } 
    332                         check = 2; 
    333332                } 
    334333        }).on( 'heartbeat-tick.wp-refresh-nonces', function( e, data ) { 
    335                 if ( check === 2 ) 
     334                var nonces = data['wp-refresh-post-nonces']; 
     335 
     336                if ( nonces ) { 
    336337                        schedule(); 
    337338 
    338                 if ( data['wp-refresh-post-nonces'] ) { 
    339                         $.each( data['wp-refresh-post-nonces'], function( selector, value ) { 
    340                                 if ( selector.match(/^replace-/) ) 
    341                                         $( '#' + selector.replace('replace-', '') ).val( value ); 
    342                         }); 
     339                        if ( nonces.replace ) { 
     340                                $.each( nonces.replace, function( selector, value ) { 
     341                                        $( '#' + selector ).val( value ); 
     342                                }); 
     343                        } 
     344 
     345                        if ( nonces.heartbeatNonce ) 
     346                                window.heartbeatSettings.nonce = nonces.heartbeatNonce; 
    343347                } 
    344348        }).ready( function() { 
    345349                schedule(); 
  • wp-includes/js/heartbeat.js

     
    1010                var self = this, 
    1111                        running, 
    1212                        beat, 
    13                         nonce, 
    1413                        screenId = typeof pagenow != 'undefined' ? pagenow : '', 
    1514                        url = typeof ajaxurl != 'undefined' ? ajaxurl : '', 
    1615                        settings, 
     
    3029                this.autostart = true; 
    3130                this.connectionLost = false; 
    3231 
    33                 if ( typeof( window.heartbeatSettings ) != 'undefined' ) { 
    34                         settings = window.heartbeatSettings; 
     32                if ( typeof( window.heartbeatSettings ) == 'object' ) { 
     33                        settings = $.extend( {}, window.heartbeatSettings ); 
    3534 
    3635                        // Add private vars 
    37                         nonce = settings.nonce || ''; 
    38                         delete settings.nonce; 
    39  
    4036                        url = settings.ajaxurl || url; 
    4137                        delete settings.ajaxurl; 
     38                        delete settings.nonce; 
    4239 
    4340                        interval = settings.interval || 15; // default interval 
    4441                        delete settings.interval; 
     
    120117                } 
    121118 
    122119                function connect() { 
    123                         var send = {}, data, i, empty = true; 
     120                        var send = {}, data, i, empty = true, 
     121                        nonce = typeof window.heartbeatSettings == 'object' ? window.heartbeatSettings.nonce : ''; 
    124122                        tick = time(); 
    125123 
    126124                        data = $.extend( {}, queue ); 
     
    168166                                if ( self.connectionLost ) 
    169167                                        errorstate(); 
    170168 
     169                                if ( response.nonces_expired ) { 
     170                                        $(document).trigger( 'heartbeat-nonces-expired' ); 
     171                                        return; 
     172                                } 
     173 
    171174                                // Change the interval from PHP 
    172175                                if ( response.heartbeat_interval ) { 
    173176                                        new_interval = response.heartbeat_interval; 
     
    334337                 * If the window doesn't have focus, the interval slows down to 2 min. 
    335338                 * 
    336339                 * @param string speed Interval speed: 'fast' (5sec), 'standard' (15sec) default, 'slow' (60sec) 
     340                 * @param string ticks Used with speed = 'fast', how many ticks before the speed reverts back 
    337341                 * @return int Current interval in seconds 
    338342                 */ 
    339                 this.interval = function( speed ) { 
     343                this.interval = function( speed, ticks ) { 
    340344                        var reset, seconds; 
     345                        ticks = parseInt( ticks, 10 ) || 30; 
     346                        ticks = ticks < 1 || ticks > 30 ? 30 : ticks; 
    341347 
    342348                        if ( speed ) { 
    343349                                switch ( speed ) { 
    344350                                        case 'fast': 
    345351                                                seconds = 5; 
    346                                                 countdown = 30; 
     352                                                countdown = ticks; 
    347353                                                break; 
    348354                                        case 'slow': 
    349355                                                seconds = 60; 
  • wp-includes/js/wp-auth-check.js

     
    11// Interim login dialog 
    22(function($){ 
    3         var wrap, check, timeout; 
     3        var wrap, check, scheduleTimeout, hideTimeout; 
    44 
    55        function show() { 
    66                var parent = $('#wp-auth-check'), form = $('#wp-auth-check-form'), noframe = wrap.find('.wp-auth-fallback-expired'), frame, loaded = false; 
     
    3232                                                height += 35; 
    3333                                                parent.find('.wp-auth-check-close').show(); 
    3434                                                wrap.data('logged-in', 1); 
    35                                                 setTimeout( function() { hide(); }, 3000 ); 
     35                                                hideTimeout = setTimeout( function() { hide(); }, 3000 ); 
    3636                                        } 
    3737 
    3838                                        parent.css( 'max-height', height + 60 + 'px' ); 
     
    6262 
    6363        function hide() { 
    6464                $(window).off( 'beforeunload.wp-auth-check' ); 
     65                window.clearTimeout( hideTimeout ); 
    6566 
     67                // When on the Edit Post screen, speed up heartbeat after the user logs in to quickly refresh nonces 
     68                if ( typeof adminpage != 'undefined' && ( adminpage == 'post-php' || adminpage == 'post-new-php' ) 
     69                         && typeof wp != 'undefined' && wp.heartbeat ) { 
     70 
     71                        wp.heartbeat.interval( 'fast', 1 ); 
     72                } 
     73 
    6674                wrap.fadeOut( 200, function() { 
    6775                        wrap.addClass('hidden').css('display', '').find('.wp-auth-check-close').css('display', ''); 
    6876                        $('#wp-auth-check-frame').remove(); 
     
    7179 
    7280        function schedule() { 
    7381                check = false; 
    74                 window.clearTimeout( timeout ); 
    75                 timeout = window.setTimeout( function(){ check = 1; }, 180000 ); // 3 min. 
     82                window.clearTimeout( scheduleTimeout ); 
     83                scheduleTimeout = window.setTimeout( function(){ check = 1; }, 300000 ); // 5 min. 
    7684        } 
    7785 
    7886        $( document ).on( 'heartbeat-tick.wp-auth-check', function( e, data ) {