WordPress.org

Make WordPress Core

Ticket #5367: auth.diff

File auth.diff, 7.1 KB (added by westi, 10 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') . '/' ) );