From: Aaron Schulz Date: Thu, 14 Jan 2016 22:35:31 +0000 (-0800) Subject: Define which SpecialPage classes expect write vs read mode X-Git-Tag: 1.31.0-rc.0~8332 X-Git-Url: http://git.cyclocoop.org/%24action?a=commitdiff_plain;h=7798b70e7e66b5a2e228f13714dd82d3b40a4573;p=lhc%2Fweb%2Fwiklou.git Define which SpecialPage classes expect write vs read mode Bug: T123591 Change-Id: I521ebdd5e8eb8f7f4df927dc38732170aef2ac19 --- diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php index 65a4eb9abf..04171466e6 100644 --- a/includes/specialpage/SpecialPage.php +++ b/includes/specialpage/SpecialPage.php @@ -675,6 +675,16 @@ class SpecialPage { return $group; } + /** + * Indicates whether this special page may perform database writes + * + * @return bool + * @since 1.27 + */ + public function doesWrites() { + return false; + } + /** * Under which header this special page is listed in Special:SpecialPages * See messages 'specialpages-group-*' for valid names diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 4bfe06de60..2bb92bc942 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -500,7 +500,6 @@ class SpecialPageFactory { * @return bool */ public static function executePath( Title &$title, IContextSource &$context, $including = false ) { - // @todo FIXME: Redirects broken due to this call $bits = explode( '/', $title->getDBkey(), 2 ); $name = $bits[0]; @@ -509,8 +508,8 @@ class SpecialPageFactory { } else { $par = $bits[1]; } + $page = self::getPage( $name ); - // Nonexistent? if ( !$page ) { $context->getOutput()->setArticleRelated( false ); $context->getOutput()->setRobotPolicy( 'noindex,nofollow' ); @@ -525,6 +524,15 @@ class SpecialPageFactory { return false; } + if ( !$including ) { + // Narrow DB query expectations for this HTTP request + $trxLimits = $context->getConfig()->get( 'TrxProfilerLimits' ); + $trxProfiler = Profiler::instance()->getTransactionProfiler(); + if ( $context->getRequest()->wasPosted() && !$page->doesWrites() ) { + $trxProfiler->setExpectations( $trxLimits['POST-nonwrite'], __METHOD__ ); + } + } + // Page exists, set the context $page->setContext( $context ); diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index f10c6e161c..d198ea1cd2 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -51,6 +51,10 @@ class SpecialBlock extends FormSpecialPage { parent::__construct( 'Block', 'block' ); } + public function doesWrites() { + return true; + } + /** * Checks that the user can unblock themselves if they are trying to do so * diff --git a/includes/specials/SpecialChangeContentModel.php b/includes/specials/SpecialChangeContentModel.php index 4812c9d6a0..a9a7f97faf 100644 --- a/includes/specials/SpecialChangeContentModel.php +++ b/includes/specials/SpecialChangeContentModel.php @@ -6,6 +6,10 @@ class SpecialChangeContentModel extends FormSpecialPage { parent::__construct( 'ChangeContentModel', 'editcontentmodel' ); } + public function doesWrites() { + return true; + } + /** * @var Title|null */ diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php index 51b08f9725..989bae9945 100644 --- a/includes/specials/SpecialChangeEmail.php +++ b/includes/specials/SpecialChangeEmail.php @@ -36,6 +36,10 @@ class SpecialChangeEmail extends FormSpecialPage { parent::__construct( 'ChangeEmail', 'editmyprivateinfo' ); } + public function doesWrites() { + return true; + } + /** * @return bool */ diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php index 371ad190cd..8656798915 100644 --- a/includes/specials/SpecialChangePassword.php +++ b/includes/specials/SpecialChangePassword.php @@ -41,6 +41,10 @@ class SpecialChangePassword extends FormSpecialPage { $this->listed( false ); } + public function doesWrites() { + return true; + } + /** * Main execution point * @param string|null $par diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php index 37d36368ef..5ed33e052c 100644 --- a/includes/specials/SpecialConfirmemail.php +++ b/includes/specials/SpecialConfirmemail.php @@ -34,6 +34,10 @@ class EmailConfirmation extends UnlistedSpecialPage { parent::__construct( 'Confirmemail', 'editmyprivateinfo' ); } + public function doesWrites() { + return true; + } + /** * Main execution point * diff --git a/includes/specials/SpecialCreateAccount.php b/includes/specials/SpecialCreateAccount.php index 30e3833c85..f8c683207f 100644 --- a/includes/specials/SpecialCreateAccount.php +++ b/includes/specials/SpecialCreateAccount.php @@ -37,6 +37,10 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial { ); } + public function doesWrites() { + return true; + } + // No reason to hide this link on Special:Specialpages public function isListed() { return true; diff --git a/includes/specials/SpecialEditTags.php b/includes/specials/SpecialEditTags.php index 97b04c23f5..916ba6b7bb 100644 --- a/includes/specials/SpecialEditTags.php +++ b/includes/specials/SpecialEditTags.php @@ -55,6 +55,10 @@ class SpecialEditTags extends UnlistedSpecialPage { parent::__construct( 'EditTags', 'changetags' ); } + public function doesWrites() { + return true; + } + public function execute( $par ) { $this->checkPermissions(); $this->checkReadOnly(); diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php index 952ae0e7ad..13ee8b3ac4 100644 --- a/includes/specials/SpecialEditWatchlist.php +++ b/includes/specials/SpecialEditWatchlist.php @@ -53,6 +53,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { parent::__construct( 'EditWatchlist', 'editmywatchlist' ); } + public function doesWrites() { + return true; + } + /** * Main execution point * diff --git a/includes/specials/SpecialEmailInvalidate.php b/includes/specials/SpecialEmailInvalidate.php index 30f9d2e8a9..b5c66ff6dc 100644 --- a/includes/specials/SpecialEmailInvalidate.php +++ b/includes/specials/SpecialEmailInvalidate.php @@ -32,6 +32,10 @@ class EmailInvalidation extends UnlistedSpecialPage { parent::__construct( 'Invalidateemail', 'editmyprivateinfo' ); } + public function doesWrites() { + return true; + } + function execute( $code ) { // Ignore things like master queries/connections on GET requests. // It's very convenient to just allow formless link usage. diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php index 618e7007c9..c036d3d2cf 100644 --- a/includes/specials/SpecialEmailuser.php +++ b/includes/specials/SpecialEmailuser.php @@ -38,6 +38,10 @@ class SpecialEmailUser extends UnlistedSpecialPage { parent::__construct( 'Emailuser' ); } + public function doesWrites() { + return true; + } + public function getDescription() { $target = self::getTarget( $this->mTarget ); if ( !$target instanceof User ) { diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php index 5ca90ed786..97e093b8bd 100644 --- a/includes/specials/SpecialImport.php +++ b/includes/specials/SpecialImport.php @@ -51,6 +51,10 @@ class SpecialImport extends SpecialPage { parent::__construct( 'Import', 'import' ); } + public function doesWrites() { + return true; + } + /** * Execute * @param string|null $par diff --git a/includes/specials/SpecialLockdb.php b/includes/specials/SpecialLockdb.php index a276197d4d..0d495a00cf 100644 --- a/includes/specials/SpecialLockdb.php +++ b/includes/specials/SpecialLockdb.php @@ -33,6 +33,10 @@ class SpecialLockdb extends FormSpecialPage { parent::__construct( 'Lockdb', 'siteadmin' ); } + public function doesWrites() { + return true; + } + public function requiresWrite() { return false; } diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php index f11ed9a362..2607330592 100644 --- a/includes/specials/SpecialMergeHistory.php +++ b/includes/specials/SpecialMergeHistory.php @@ -68,6 +68,10 @@ class SpecialMergeHistory extends SpecialPage { parent::__construct( 'MergeHistory', 'mergehistory' ); } + public function doesWrites() { + return true; + } + /** * @return void */ diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 0c0d929ddb..4bdad79f7e 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -62,6 +62,10 @@ class MovePageForm extends UnlistedSpecialPage { parent::__construct( 'Movepage' ); } + public function doesWrites() { + return true; + } + public function execute( $par ) { $this->useTransactionalTimeLimit(); diff --git a/includes/specials/SpecialPageLanguage.php b/includes/specials/SpecialPageLanguage.php index 7509bbcb02..69a9d486b3 100644 --- a/includes/specials/SpecialPageLanguage.php +++ b/includes/specials/SpecialPageLanguage.php @@ -38,6 +38,10 @@ class SpecialPageLanguage extends FormSpecialPage { parent::__construct( 'PageLanguage', 'pagelang' ); } + public function doesWrites() { + return true; + } + protected function preText() { $this->getOutput()->addModules( 'mediawiki.special.pageLanguage' ); } diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php index 292b575396..21ce1e1016 100644 --- a/includes/specials/SpecialPasswordReset.php +++ b/includes/specials/SpecialPasswordReset.php @@ -51,6 +51,10 @@ class SpecialPasswordReset extends FormSpecialPage { parent::__construct( 'PasswordReset', 'editmyprivateinfo' ); } + public function doesWrites() { + return true; + } + public function userCanExecute( User $user ) { return $this->canChangePassword( $user ) === true && parent::userCanExecute( $user ); } diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php index 3fa5fd526c..965a36e703 100644 --- a/includes/specials/SpecialPreferences.php +++ b/includes/specials/SpecialPreferences.php @@ -31,6 +31,10 @@ class SpecialPreferences extends SpecialPage { parent::__construct( 'Preferences' ); } + public function doesWrites() { + return true; + } + public function execute( $par ) { $this->setHeaders(); $this->outputHeader(); diff --git a/includes/specials/SpecialResetTokens.php b/includes/specials/SpecialResetTokens.php index cba5a44930..38e977b6e1 100644 --- a/includes/specials/SpecialResetTokens.php +++ b/includes/specials/SpecialResetTokens.php @@ -34,6 +34,10 @@ class SpecialResetTokens extends FormSpecialPage { parent::__construct( 'ResetTokens' ); } + public function doesWrites() { + return true; + } + /** * Returns the token information list for this page after running * the hook and filtering out disabled preferences. diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php index 6dcbcb1912..44e44baf9e 100644 --- a/includes/specials/SpecialRevisiondelete.php +++ b/includes/specials/SpecialRevisiondelete.php @@ -109,6 +109,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage { parent::__construct( 'Revisiondelete', 'deletedhistory' ); } + public function doesWrites() { + return true; + } + public function execute( $par ) { $this->useTransactionalTimeLimit(); diff --git a/includes/specials/SpecialRunJobs.php b/includes/specials/SpecialRunJobs.php index 4217553764..eeaf2d37d0 100644 --- a/includes/specials/SpecialRunJobs.php +++ b/includes/specials/SpecialRunJobs.php @@ -34,6 +34,10 @@ class SpecialRunJobs extends UnlistedSpecialPage { parent::__construct( 'RunJobs' ); } + public function doesWrites() { + return true; + } + public function execute( $par = '' ) { $this->getOutput()->disable(); diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php index f776832ce0..cf807ef7cd 100644 --- a/includes/specials/SpecialUnblock.php +++ b/includes/specials/SpecialUnblock.php @@ -36,6 +36,10 @@ class SpecialUnblock extends SpecialPage { parent::__construct( 'Unblock', 'block' ); } + public function doesWrites() { + return true; + } + public function execute( $par ) { $this->checkPermissions(); $this->checkReadOnly(); diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index 744a0909cf..f99a52dc76 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -51,6 +51,10 @@ class PageArchive { $this->config = $config; } + public function doesWrites() { + return true; + } + /** * List all deleted pages recorded in the archive table. Returns result * wrapper with (ar_namespace, ar_title, count) fields, ordered by page diff --git a/includes/specials/SpecialUnlockdb.php b/includes/specials/SpecialUnlockdb.php index dc03a4a786..b73e3c597e 100644 --- a/includes/specials/SpecialUnlockdb.php +++ b/includes/specials/SpecialUnlockdb.php @@ -32,6 +32,10 @@ class SpecialUnlockdb extends FormSpecialPage { parent::__construct( 'Unlockdb', 'siteadmin' ); } + public function doesWrites() { + return true; + } + public function requiresWrite() { return false; } diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php index b4470f5bfb..5b3c43e698 100644 --- a/includes/specials/SpecialUpload.php +++ b/includes/specials/SpecialUpload.php @@ -38,6 +38,10 @@ class SpecialUpload extends SpecialPage { parent::__construct( 'Upload', 'upload' ); } + public function doesWrites() { + return true; + } + /** Misc variables **/ /** @var WebRequest|FauxRequest The request this form is supposed to handle */ diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php index eb34008d91..1cec1164b5 100644 --- a/includes/specials/SpecialUploadStash.php +++ b/includes/specials/SpecialUploadStash.php @@ -52,6 +52,10 @@ class SpecialUploadStash extends UnlistedSpecialPage { parent::__construct( 'UploadStash', 'upload' ); } + public function doesWrites() { + return true; + } + /** * Execute page -- can output a file directly or show a listing of them. * diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php index 620b55da15..24e167599f 100644 --- a/includes/specials/SpecialUserlogin.php +++ b/includes/specials/SpecialUserlogin.php @@ -133,6 +133,10 @@ class LoginForm extends SpecialPage { $wgUseMediaWikiUIEverywhere = true; } + public function doesWrites() { + return true; + } + /** * Returns an array of all valid error messages. * diff --git a/includes/specials/SpecialUserlogout.php b/includes/specials/SpecialUserlogout.php index b79bf0926b..6e34690529 100644 --- a/includes/specials/SpecialUserlogout.php +++ b/includes/specials/SpecialUserlogout.php @@ -31,6 +31,10 @@ class SpecialUserlogout extends UnlistedSpecialPage { parent::__construct( 'Userlogout' ); } + public function doesWrites() { + return true; + } + function execute( $par ) { /** * Some satellite ISPs use broken precaching schemes that log people out straight after diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index cf94e50581..01b1f8e49d 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -41,6 +41,10 @@ class UserrightsPage extends SpecialPage { parent::__construct( 'Userrights' ); } + public function doesWrites() { + return true; + } + public function isRestricted() { return true; }