From 76d790623cc09dfbf51cbf45877f5f81af773303 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Thu, 28 Jan 2016 13:46:22 -0500 Subject: [PATCH] User: Fix loading of user_token Similar to T124414, we should always load user_token from the row even if user_email is unset. Also, I notice that maintenance/tables.sql defines the column as "binary(32)", which is going to append ASCII NUL bytes to the default empty-string. And before that it was "char(32)", which will append spaces. So trim both of those off when reading the field so the following check for === '' actually works. The latter doesn't seem to affect *most* WMF wikis, since they have the column defined as "varbinary(32)" for some reason. But there are a few with "binary(32)", I have no idea why. Change-Id: I50a813bb530639275628d9560c79a773676aa36d --- includes/user/User.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/includes/user/User.php b/includes/user/User.php index a2681170ce..7c2924240c 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -1261,12 +1261,20 @@ class User implements IDBAccessObject { $all = false; } - if ( isset( $row->user_email ) ) { - $this->mEmail = $row->user_email; - $this->mToken = $row->user_token; - if ( $this->mToken == '' ) { + if ( isset( $row->user_token ) ) { + // The definition for the column is binary(32), so trim the NULs + // that appends. The previous definition was char(32), so trim + // spaces too. + $this->mToken = rtrim( $row->user_token, " \0" ); + if ( $this->mToken === '' ) { $this->mToken = null; } + } else { + $all = false; + } + + if ( isset( $row->user_email ) ) { + $this->mEmail = $row->user_email; $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated ); $this->mEmailToken = $row->user_email_token; $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires ); -- 2.20.1