LanguageConverter: stop reading from $wgUser

Use RequestContext::getMain()->getUser() instead.
Given that there is an explicit check if the user is safe
to load, this should be fine - if the RequestContext
doesn't already have a user, it'll create one via
User::newFromSession() and then the isSafeToLoad()
call will fail.

Bug: T243708
Change-Id: I06906681e1c1e9ea3ef3c6e4fddcea7871bf164f
This commit is contained in:
DannyS712 2021-06-24 08:36:50 +00:00
parent 709a5add82
commit 2696c06a2b
2 changed files with 10 additions and 9 deletions

View file

@ -286,17 +286,19 @@ abstract class LanguageConverter implements ILanguageConverter {
* @return string The preferred language code
*/
public function getPreferredVariant() {
global $wgDefaultLanguageVariant, $wgUser;
global $wgDefaultLanguageVariant;
$req = $this->getURLVariant();
Hooks::runner()->onGetLangPreferredVariant( $req );
// NOTE: For calls from Setup.php, wgUser or the session might not be set yet (T235360)
$user = RequestContext::getMain()->getUser();
// NOTE: For some calls there may not be a context user or session that is safe
// to use, see (T235360)
// Use case: During autocreation, UserNameUtils::isUsable is called which uses interface
// messages for reserved usernames.
if ( $wgUser && $wgUser->isSafeToLoad() && $wgUser->isRegistered() && !$req ) {
$req = $this->getUserVariant( $wgUser );
if ( $user->isSafeToLoad() && $user->isRegistered() && !$req ) {
$req = $this->getUserVariant( $user );
} elseif ( !$req ) {
$req = $this->getHeaderVariant();
}

View file

@ -19,10 +19,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
* @param User $user
*/
private function setContextUser( User $user ) {
// TODO stop using the deprecated global here, and convert
// LanguageConverter to use RequestContext or dependency injection
global $wgUser;
$wgUser = $user;
// LanguageConverter::getPreferredVariant() reads the user from
// RequestContext::getMain(), so set it occordingly
RequestContext::getMain()->setUser( $user );
}
protected function setUp() : void {
@ -31,8 +30,8 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
$this->setMwGlobals( [
'wgDefaultLanguageVariant' => false,
'wgUser' => new User,
] );
$this->setContextUser( new User );
$this->lang = $this->createMock( Language::class );
$this->lang->method( 'getNsText' )->with( NS_MEDIAWIKI )->willReturn( 'MediaWiki' );