From 3f24d1e348f23f331ad0a85d2e83876830e83df6 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Mon, 3 Aug 2015 16:20:39 -0700 Subject: [PATCH] Make Special:ConfirmEmail load the user from the master * This can help guard against stale reads if the user was created or changed a second ago. Bug: T105896 Change-Id: Ib2a59762cd8f4a4b7ad86d0700f186bee1d5b2d1 --- includes/User.php | 27 ++++++++++++++--------- includes/specials/SpecialConfirmemail.php | 4 ++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/includes/User.php b/includes/User.php index cefbe622f3..665a68955c 100644 --- a/includes/User.php +++ b/includes/User.php @@ -519,19 +519,24 @@ class User implements IDBAccessObject { * If the code is invalid or has expired, returns NULL. * * @param string $code Confirmation code + * @param int $flags User::READ_* bitfield * @return User|null */ - public static function newFromConfirmationCode( $code ) { - $dbr = wfGetDB( DB_SLAVE ); - $id = $dbr->selectField( 'user', 'user_id', array( - 'user_email_token' => md5( $code ), - 'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ), - ) ); - if ( $id !== false ) { - return User::newFromId( $id ); - } else { - return null; - } + public static function newFromConfirmationCode( $code, $flags = 0 ) { + $db = ( $flags & self::READ_LATEST ) == self::READ_LATEST + ? wfGetDB( DB_MASTER ) + : wfGetDB( DB_SLAVE ); + + $id = $db->selectField( + 'user', + 'user_id', + array( + 'user_email_token' => md5( $code ), + 'user_email_token_expires > ' . $db->addQuotes( $db->timestamp() ), + ) + ); + + return $id ? User::newFromId( $id ) : null; } /** diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php index b6ab112b34..63561552a4 100644 --- a/includes/specials/SpecialConfirmemail.php +++ b/includes/specials/SpecialConfirmemail.php @@ -120,7 +120,7 @@ class EmailConfirmation extends UnlistedSpecialPage { * @param string $code Confirmation code */ function attemptConfirm( $code ) { - $user = User::newFromConfirmationCode( $code ); + $user = User::newFromConfirmationCode( $code, User::READ_LATEST ); if ( !is_object( $user ) ) { $this->getOutput()->addWikiMsg( 'confirmemail_invalid' ); @@ -164,7 +164,7 @@ class EmailInvalidation extends UnlistedSpecialPage { * @param string $code Confirmation code */ function attemptInvalidate( $code ) { - $user = User::newFromConfirmationCode( $code ); + $user = User::newFromConfirmationCode( $code, User::READ_LATEST ); if ( !is_object( $user ) ) { $this->getOutput()->addWikiMsg( 'confirmemail_invalid' ); -- 2.20.1