From 38fce189c441a075172eef516f25e81b8d1a5ada Mon Sep 17 00:00:00 2001 From: Florian Schmidt Date: Sat, 19 Aug 2017 18:21:40 +0200 Subject: [PATCH] Consistent behavior of read-only reason Before this commit, the reason set in the global $wgReadOnly was differently handled on different special pages. While on most of them, like Special:Upload, the reason is allowed to have HTML, which can be used in Wikitext, too, Special:CreateAccount always outputted an escaped version of this reason. Most special pages uses the ReadOnlyError exception to print a read-only error, however, AuthManager uses Status objects to communicate between the backend and the frontend. Therefore the same message and parameters were wrapped in a Status object and, in the frontend, directly passed to the constructor of ErrorPageError. Unfortunately, Status::getMessage() escapes the parameters of a message, which is the reason, why the wiki is read-only. To bypass this restriction, AuthManager now creates a Message object directly, does not escape the reason, and uses the resulting object to create a Status object from. Now the reason is not escaped on Special:CreateAccount anymore, like on most other special pages. The read-only message on the protection form is, also before this commit, not escaped and already displayed correctly, as the read-only is checked in the constructor of the protection form already and, if the Wiki is read only, handled as a permission error and already displayed correctly. This commit fixes the behavior of WikiPage in case of it's used somewhere else, subclassed or if the check in the frontend will be removed and the Status of WikiPage will be used. Bug: T157036 Change-Id: Idbfe556fcb90f8bda8fae9d728ca9dee5ea02f67 --- includes/auth/AuthManager.php | 4 ++-- includes/page/WikiPage.php | 2 +- tests/phpunit/includes/auth/AuthManagerTest.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/includes/auth/AuthManager.php b/includes/auth/AuthManager.php index c3f798fd49..818f778301 100644 --- a/includes/auth/AuthManager.php +++ b/includes/auth/AuthManager.php @@ -975,7 +975,7 @@ class AuthManager implements LoggerAwareInterface { public function checkAccountCreatePermissions( User $creator ) { // Wiki is read-only? if ( wfReadOnly() ) { - return Status::newFatal( 'readonlytext', wfReadOnlyReason() ); + return Status::newFatal( wfMessage( 'readonlytext', wfReadOnlyReason() ) ); } // This is awful, this permission check really shouldn't go through Title. @@ -1579,7 +1579,7 @@ class AuthManager implements LoggerAwareInterface { ] ); $user->setId( 0 ); $user->loadFromId(); - return Status::newFatal( 'readonlytext', wfReadOnlyReason() ); + return Status::newFatal( wfMessage( 'readonlytext', wfReadOnlyReason() ) ); } // Check the session, if we tried to create this user already there's diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index e60f103f60..134bb886f8 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -2302,7 +2302,7 @@ class WikiPage implements Page, IDBAccessObject { global $wgCascadingRestrictionLevels, $wgContLang; if ( wfReadOnly() ) { - return Status::newFatal( 'readonlytext', wfReadOnlyReason() ); + return Status::newFatal( wfMessage( 'readonlytext', wfReadOnlyReason() ) ); } $this->loadPageData( 'fromdbmaster' ); diff --git a/tests/phpunit/includes/auth/AuthManagerTest.php b/tests/phpunit/includes/auth/AuthManagerTest.php index a8405992fe..c18af8b346 100644 --- a/tests/phpunit/includes/auth/AuthManagerTest.php +++ b/tests/phpunit/includes/auth/AuthManagerTest.php @@ -1408,7 +1408,7 @@ class AuthManagerTest extends \MediaWikiTestCase { $readOnlyMode = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode(); $readOnlyMode->setReason( 'Because' ); $this->assertEquals( - \Status::newFatal( 'readonlytext', 'Because' ), + \Status::newFatal( wfMessage( 'readonlytext', 'Because' ) ), $this->manager->checkAccountCreatePermissions( new \User ) ); $readOnlyMode->setReason( false ); @@ -2478,7 +2478,7 @@ class AuthManagerTest extends \MediaWikiTestCase { $this->hook( 'LocalUserCreated', $this->never() ); $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true ); $this->unhook( 'LocalUserCreated' ); - $this->assertEquals( \Status::newFatal( 'readonlytext', 'Because' ), $ret ); + $this->assertEquals( \Status::newFatal( wfMessage( 'readonlytext', 'Because' ) ), $ret ); $this->assertEquals( 0, $user->getId() ); $this->assertNotEquals( $username, $user->getName() ); $this->assertEquals( 0, $session->getUser()->getId() ); -- 2.20.1