Aaron Schulz has uploaded a new change for review.
https://gerrit.wikimedia.org/r/264200
Change subject: Define which SpecialPage classes expect write vs read mode
......................................................................
Define which SpecialPage classes expect write vs read mode
Bug: T123591
Change-Id: I521ebdd5e8eb8f7f4df927dc38732170aef2ac19
---
M includes/specialpage/SpecialPage.php
M includes/specialpage/SpecialPageFactory.php
M includes/specials/SpecialBlock.php
M includes/specials/SpecialChangeContentModel.php
M includes/specials/SpecialChangeEmail.php
M includes/specials/SpecialChangePassword.php
M includes/specials/SpecialConfirmemail.php
M includes/specials/SpecialCreateAccount.php
M includes/specials/SpecialEditTags.php
M includes/specials/SpecialEditWatchlist.php
M includes/specials/SpecialEmailInvalidate.php
M includes/specials/SpecialEmailuser.php
M includes/specials/SpecialImport.php
M includes/specials/SpecialLockdb.php
M includes/specials/SpecialMergeHistory.php
M includes/specials/SpecialMovepage.php
M includes/specials/SpecialPageLanguage.php
M includes/specials/SpecialPasswordReset.php
M includes/specials/SpecialPreferences.php
M includes/specials/SpecialResetTokens.php
M includes/specials/SpecialRevisiondelete.php
M includes/specials/SpecialRunJobs.php
M includes/specials/SpecialUnblock.php
M includes/specials/SpecialUndelete.php
M includes/specials/SpecialUnlockdb.php
M includes/specials/SpecialUpload.php
M includes/specials/SpecialUploadStash.php
M includes/specials/SpecialUserlogin.php
M includes/specials/SpecialUserlogout.php
M includes/specials/SpecialUserrights.php
30 files changed, 132 insertions(+), 2 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/00/264200/1
diff --git a/includes/specialpage/SpecialPage.php
b/includes/specialpage/SpecialPage.php
index 65a4eb9..0417146 100644
--- a/includes/specialpage/SpecialPage.php
+++ b/includes/specialpage/SpecialPage.php
@@ -676,6 +676,16 @@
}
/**
+ * 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
* This method defaults to group 'other'
diff --git a/includes/specialpage/SpecialPageFactory.php
b/includes/specialpage/SpecialPageFactory.php
index 4bfe06d..2bb92bc 100644
--- a/includes/specialpage/SpecialPageFactory.php
+++ b/includes/specialpage/SpecialPageFactory.php
@@ -500,7 +500,6 @@
* @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 @@
} else {
$par = $bits[1];
}
+
$page = self::getPage( $name );
- // Nonexistent?
if ( !$page ) {
$context->getOutput()->setArticleRelated( false );
$context->getOutput()->setRobotPolicy(
'noindex,nofollow' );
@@ -525,6 +524,15 @@
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 f10c6e1..d198ea1 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -51,6 +51,10 @@
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 4812c9d..a9a7f97 100644
--- a/includes/specials/SpecialChangeContentModel.php
+++ b/includes/specials/SpecialChangeContentModel.php
@@ -6,6 +6,10 @@
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 51b08f9..989bae9 100644
--- a/includes/specials/SpecialChangeEmail.php
+++ b/includes/specials/SpecialChangeEmail.php
@@ -36,6 +36,10 @@
parent::__construct( 'ChangeEmail', 'editmyprivateinfo' );
}
+ public function doesWrites() {
+ return true;
+ }
+
/**
* @return bool
*/
diff --git a/includes/specials/SpecialChangePassword.php
b/includes/specials/SpecialChangePassword.php
index 371ad19..8656798 100644
--- a/includes/specials/SpecialChangePassword.php
+++ b/includes/specials/SpecialChangePassword.php
@@ -41,6 +41,10 @@
$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 37d3636..5ed33e0 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -34,6 +34,10 @@
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 30e3833..f8c6832 100644
--- a/includes/specials/SpecialCreateAccount.php
+++ b/includes/specials/SpecialCreateAccount.php
@@ -37,6 +37,10 @@
);
}
+ 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 97b04c2..916ba6b 100644
--- a/includes/specials/SpecialEditTags.php
+++ b/includes/specials/SpecialEditTags.php
@@ -55,6 +55,10 @@
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 952ae0e..13ee8b3 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -53,6 +53,10 @@
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 30f9d2e..b5c66ff 100644
--- a/includes/specials/SpecialEmailInvalidate.php
+++ b/includes/specials/SpecialEmailInvalidate.php
@@ -32,6 +32,10 @@
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 618e700..c036d3d 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -38,6 +38,10 @@
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 5ca90ed..97e093b 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -51,6 +51,10 @@
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 a276197..0d495a0 100644
--- a/includes/specials/SpecialLockdb.php
+++ b/includes/specials/SpecialLockdb.php
@@ -33,6 +33,10 @@
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 f11ed9a..2607330 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -68,6 +68,10 @@
parent::__construct( 'MergeHistory', 'mergehistory' );
}
+ public function doesWrites() {
+ return true;
+ }
+
/**
* @return void
*/
diff --git a/includes/specials/SpecialMovepage.php
b/includes/specials/SpecialMovepage.php
index 0c0d929..4bdad79 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -62,6 +62,10 @@
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 7509bbc..69a9d48 100644
--- a/includes/specials/SpecialPageLanguage.php
+++ b/includes/specials/SpecialPageLanguage.php
@@ -38,6 +38,10 @@
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 292b575..21ce1e1 100644
--- a/includes/specials/SpecialPasswordReset.php
+++ b/includes/specials/SpecialPasswordReset.php
@@ -51,6 +51,10 @@
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 3fa5fd5..965a36e 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -31,6 +31,10 @@
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 cba5a44..38e977b 100644
--- a/includes/specials/SpecialResetTokens.php
+++ b/includes/specials/SpecialResetTokens.php
@@ -34,6 +34,10 @@
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 6dcbcb1..44e44ba 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -109,6 +109,10 @@
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 4217553..eeaf2d3 100644
--- a/includes/specials/SpecialRunJobs.php
+++ b/includes/specials/SpecialRunJobs.php
@@ -34,6 +34,10 @@
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 f776832..cf807ef 100644
--- a/includes/specials/SpecialUnblock.php
+++ b/includes/specials/SpecialUnblock.php
@@ -36,6 +36,10 @@
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 744a090..f99a52d 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -51,6 +51,10 @@
$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 dc03a4a..b73e3c5 100644
--- a/includes/specials/SpecialUnlockdb.php
+++ b/includes/specials/SpecialUnlockdb.php
@@ -32,6 +32,10 @@
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 b4470f5..5b3c43e 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -38,6 +38,10 @@
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 eb34008..1cec116 100644
--- a/includes/specials/SpecialUploadStash.php
+++ b/includes/specials/SpecialUploadStash.php
@@ -52,6 +52,10 @@
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 620b55d..24e1675 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -133,6 +133,10 @@
$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 b79bf09..6e34690 100644
--- a/includes/specials/SpecialUserlogout.php
+++ b/includes/specials/SpecialUserlogout.php
@@ -31,6 +31,10 @@
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 cf94e50..01b1f8e 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -41,6 +41,10 @@
parent::__construct( 'Userrights' );
}
+ public function doesWrites() {
+ return true;
+ }
+
public function isRestricted() {
return true;
}
--
To view, visit https://gerrit.wikimedia.org/r/264200
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I521ebdd5e8eb8f7f4df927dc38732170aef2ac19
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits