From 34f78a69ef058c19ecdac7290a174624ef8212ee Mon Sep 17 00:00:00 2001 From: Derick Alangi Date: Fri, 25 Jan 2019 22:50:34 +0100 Subject: [PATCH] specialpage: Fix login crash caused by unknown language via ?uselang Per Krinkle's comments here: T198054#4598447, it's exactly what is happening. @Fomafix suggests we handle the exception that is been thrown by Language::factory() when there is an invalid language code provided. The attempt is to fix this in the central way of ever request whether POST or GET. We're working within a particular context, and within this request context, we can create a language user's language object then generate a language object. If uselang parameter is provided an invalid language code, getLanguage in this request context will default to $wgLanguageCode then use this code to create the user's language object. In addition, getLanguage() invalidates cached user interface language. Bug: T198054 Change-Id: I825fdfa882a4243ffc63c9de0d7f482e2cfb9862 --- includes/context/RequestContext.php | 2 ++ includes/specialpage/LoginSignupSpecialPage.php | 5 +---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php index 16c304c015..2cbe67c525 100644 --- a/includes/context/RequestContext.php +++ b/includes/context/RequestContext.php @@ -257,6 +257,8 @@ class RequestContext implements IContextSource, MutableContext { */ public function setUser( User $user ) { $this->user = $user; + // Invalidate cached user interface language + $this->lang = null; } /** diff --git a/includes/specialpage/LoginSignupSpecialPage.php b/includes/specialpage/LoginSignupSpecialPage.php index 48dd405a13..743a5a5df0 100644 --- a/includes/specialpage/LoginSignupSpecialPage.php +++ b/includes/specialpage/LoginSignupSpecialPage.php @@ -491,10 +491,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { $wgUser = $user; $context->setUser( $user ); - $code = $this->getRequest()->getVal( 'uselang', $user->getOption( 'language' ) ); - $userLang = Language::factory( $code ); - $wgLang = $userLang; - $context->setLanguage( $userLang ); + $wgLang = $context->getLanguage(); } /** -- 2.20.1