WordPress.org

Make WordPress Core

Ticket #5367: auth.diff

File auth.diff, 7.1 KB (added by westi, 8 years ago)

First pass patch for switching to auth cookie

  • wp-admin/includes/misc.php

     
    140140        // Clear cookies for old paths. 
    141141        wp_clearcookie(); 
    142142        // Set cookies for new paths. 
    143         wp_setcookie( $user_login, $user_pass_md5, true, get_option( 'home' ), get_option( 'siteurl' )); 
     143        // TODO: Review this - suspect the user will have to log in again. 
     144        //wp_setcookie( $user_login, $user_pass_md5, true, get_option( 'home' ), get_option( 'siteurl' )); 
    144145} 
    145146 
    146147add_action( 'update_option_home', 'update_home_siteurl', 10, 2 ); 
  • wp-includes/pluggable.php

     
    4646        if ( ! empty($current_user) ) 
    4747                return; 
    4848 
    49         if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) || 
    50                 !wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true) ) { 
     49        if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[AUTH_COOKIE]) || 
     50                !wp_validatecookie($_COOKIE[USER_COOKIE], $_COOKIE[AUTH_COOKIE]) ) { 
    5151                wp_set_current_user(0); 
    5252                return false; 
    5353        } 
     
    293293endif; 
    294294 
    295295if ( !function_exists('wp_login') ) : 
    296 function wp_login($username, $password, $already_md5 = false) { 
    297         global $wpdb, $error; 
     296function wp_login($username, $password, $deprecated) { 
     297        global $error; 
    298298 
    299         $username = sanitize_user($username); 
    300  
    301         if ( '' == $username ) 
    302                 return false; 
    303  
    304299        if ( '' == $password ) { 
    305300                $error = __('<strong>ERROR</strong>: The password field is empty.'); 
    306301                return false; 
    307302        } 
    308303 
    309304        $login = get_userdatabylogin($username); 
    310         //$login = $wpdb->get_row("SELECT ID, user_login, user_pass FROM $wpdb->users WHERE user_login = '$username'"); 
    311305 
    312306        if (!$login) { 
    313307                $error = __('<strong>ERROR</strong>: Invalid username.'); 
    314308                return false; 
    315309        } else { 
    316                 // If the password is already_md5, it has been double hashed. 
    317                 // Otherwise, it is plain text. 
    318                 if ( ($already_md5 && md5($login->user_pass) == $password) || ($login->user_login == $username && $login->user_pass == md5($password)) ) { 
     310                if ( ($login->user_login == $username && $login->user_pass == md5($password)) ) { 
    319311                        return true; 
    320312                } else { 
    321313                        $error = __('<strong>ERROR</strong>: Incorrect password.'); 
     
    340332function auth_redirect() { 
    341333        // Checks if a user is logged in, if not redirects them to the login page 
    342334        if ( (!empty($_COOKIE[USER_COOKIE]) && 
    343                                 !wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) || 
     335                                !wp_validatecookie($_COOKIE[USER_COOKIE], $_COOKIE[AUTH_COOKIE])) || 
    344336                         (empty($_COOKIE[USER_COOKIE])) ) { 
    345337                nocache_headers(); 
    346338 
    347                 wp_redirect(get_option('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI'])); 
     339                wp_redirect(get_option('siteurl') . '/wp-login.php?auth=expired&redirect_to=' . urlencode($_SERVER['REQUEST_URI'])); 
    348340                exit(); 
    349341        } 
    350342} 
     
    376368                foreach ( $cookie as $tasty ) { 
    377369                        if ( false !== strpos($tasty, USER_COOKIE) ) 
    378370                                $user = substr(strstr($tasty, '='), 1); 
    379                         if ( false !== strpos($tasty, PASS_COOKIE) ) 
     371                        if ( false !== strpos($tasty, AUTH_COOKIE) ) 
    380372                                $pass = substr(strstr($tasty, '='), 1); 
    381373                } 
    382374 
    383                 if ( $current_name != $user || !wp_login( $user, $pass, true ) ) 
     375                if ( $current_name != $user || !wp_validatecookie( $user, $pass ) ) 
    384376                        die('-1'); 
    385377        } 
    386378        do_action('check_ajax_referer'); 
     
    473465 
    474466if ( !function_exists('wp_setcookie') ) : 
    475467function wp_setcookie($username, $password, $already_md5 = false, $home = '', $siteurl = '', $remember = false) { 
    476         if ( !$already_md5 ) 
    477                 $password = md5( md5($password) ); // Double hash the password in the cookie. 
    478468 
     469        $user = get_userdatabylogin($username); 
     470        //Generate a new authentication cookie. 
     471        $auth = wp_hash(wp_salt() . $username . uniqid( microtime() )); 
     472        update_usermeta($user->ID, 'wp_authentication_cookie', wp_hash($auth) ) ; 
     473         
    479474        if ( empty($home) ) 
    480475                $cookiepath = COOKIEPATH; 
    481476        else 
     
    495490                $expire = 0; 
    496491 
    497492        setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN); 
    498         setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN); 
     493        setcookie(AUTH_COOKIE, $auth, $expire, $cookiepath, COOKIE_DOMAIN); 
     494        //setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN); 
    499495 
    500496        if ( $cookiepath != $sitecookiepath ) { 
    501497                setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN); 
    502                 setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN); 
     498                setcookie(AUTH_COOKIE, $auth, $expire, $sitecookiepath, COOKIE_DOMAIN); 
     499                //setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN); 
    503500        } 
    504501} 
    505502endif; 
     
    508505function wp_clearcookie() { 
    509506        setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
    510507        setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
     508        setcookie(AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); 
    511509        setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); 
    512510        setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); 
     511        setcookie(AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); 
    513512} 
    514513endif; 
    515514 
     
    700699} 
    701700endif; 
    702701 
     702if ( !function_exists('wp_validatecookie') ) : 
     703function wp_validatecookie($username, $auth_cookie) { 
     704        global $error; 
     705 
     706        $login = get_userdatabylogin($username); 
     707 
     708        if (!$login) { 
     709                $error = __('<strong>ERROR</strong>: Invalid username.'); 
     710                return false; 
     711        } else { 
     712                $auth = get_usermeta($login->ID, "wp_authentication_cookie" ); 
     713                if ( ( '' != $auth ) && ($login->user_login == $username ) && ( wp_hash( $auth_cookie ) == $auth ) ) { 
     714                        return true; 
     715                } else { 
     716                        wp_clearcookie(); 
     717                        $error = __('<strong>ERROR</strong>: Authentication Cookie Invalid.'); 
     718                        return false; 
     719                } 
     720        } 
     721} 
     722endif; 
     723 
     724 
     725 
     726 
     727 
     728 
     729 
    703730?> 
  • wp-login.php

     
    345345        elseif  ( 'confirm' == $_GET['checkemail'] )    $errors['confirm']                      = __('Check your e-mail for the confirmation link.'); 
    346346        elseif  ( 'newpass' == $_GET['checkemail'] )    $errors['newpass']                      = __('Check your e-mail for your new password.'); 
    347347        elseif  ( 'registered' == $_GET['checkemail'] ) $errors['registered']           = __('Registration complete. Please check your e-mail.'); 
     348        elseif  ( 'expired' == $_GET['auth'] )                  $errors['auth']                         = __('Your cookie has expired please log back in.'); 
    348349 
    349350        login_header(__('Login')); 
    350351?> 
  • wp-settings.php

     
    189189        define('USER_COOKIE', 'wordpressuser_'. COOKIEHASH); 
    190190if ( !defined('PASS_COOKIE') ) 
    191191        define('PASS_COOKIE', 'wordpresspass_'. COOKIEHASH); 
    192 if ( !defined('TEST_COOKIE') ) 
     192if ( !defined('AUTH_COOKIE') ) 
     193        define('AUTH_COOKIE', 'wordpressauth_'. COOKIEHASH); 
     194        if ( !defined('TEST_COOKIE') ) 
    193195        define('TEST_COOKIE', 'wordpress_test_cookie'); 
    194196if ( !defined('COOKIEPATH') ) 
    195197        define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) );