summaryrefslogtreecommitdiff
path: root/includes/SpecialPage.php
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2013-01-18 16:46:04 +0100
committerPierre Schmitz <pierre@archlinux.de>2013-01-18 16:46:04 +0100
commit63601400e476c6cf43d985f3e7b9864681695ed4 (patch)
treef7846203a952e38aaf66989d0a4702779f549962 /includes/SpecialPage.php
parent8ff01378c9e0207f9169b81966a51def645b6a51 (diff)
Update to MediaWiki 1.20.2
this update includes: * adjusted Arch Linux skin * updated FluxBBAuthPlugin * patch for https://bugzilla.wikimedia.org/show_bug.cgi?id=44024
Diffstat (limited to 'includes/SpecialPage.php')
-rw-r--r--includes/SpecialPage.php217
1 files changed, 181 insertions, 36 deletions
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 17a36ecf..2e5e02b0 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -1,25 +1,24 @@
<?php
/**
- * SpecialPage: handling special pages and lists thereof.
+ * Parent class for all special pages.
*
- * To add a special page in an extension, add to $wgSpecialPages either
- * an object instance or an array containing the name and constructor
- * parameters. The latter is preferred for performance reasons.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * The object instantiated must be either an instance of SpecialPage or a
- * sub-class thereof. It must have an execute() method, which sends the HTML
- * for the special page to $wgOut. The parent class has an execute() method
- * which distributes the call to the historical global functions. Additionally,
- * execute() also checks if the user has the necessary access privileges
- * and bails out if not.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * To add a core special page, use the similar static list in
- * SpecialPage::$mList. To remove a core static special page at runtime, use
- * a SpecialPage_initList hook.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup SpecialPage
- * @defgroup SpecialPage SpecialPage
*/
/**
@@ -124,19 +123,18 @@ class SpecialPage {
*
* @param $page Mixed: SpecialPage or string
* @param $group String
- * @return null
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function setGroup( $page, $group ) {
wfDeprecated( __METHOD__, '1.18' );
- return SpecialPageFactory::setGroup( $page, $group );
+ SpecialPageFactory::setGroup( $page, $group );
}
/**
* Get the group that the special page belongs in on Special:SpecialPage
*
* @param $page SpecialPage
- * @return null
+ * @return string
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getGroup( &$page ) {
@@ -200,7 +198,7 @@ class SpecialPage {
*
* @param $user User object to check permissions, $wgUser will be used
* if not provided
- * @return Associative array mapping page's name to its SpecialPage object
+ * @return array Associative array mapping page's name to its SpecialPage object
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getUsablePages( User $user = null ) {
@@ -211,7 +209,7 @@ class SpecialPage {
/**
* Return categorised listable special pages for all users
*
- * @return Associative array mapping page's name to its SpecialPage object
+ * @return array Associative array mapping page's name to its SpecialPage object
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getRegularPages() {
@@ -223,7 +221,7 @@ class SpecialPage {
* Return categorised listable special pages which are available
* for the current user, but not for everyone
*
- * @return Associative array mapping page's name to its SpecialPage object
+ * @return array Associative array mapping page's name to its SpecialPage object
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getRestrictedPages() {
@@ -353,7 +351,7 @@ class SpecialPage {
$this->mFunction = $function;
}
if ( $file === 'default' ) {
- $this->mFile = dirname( __FILE__ ) . "/specials/Special$name.php";
+ $this->mFile = __DIR__ . "/specials/Special$name.php";
} else {
$this->mFile = $file;
}
@@ -592,14 +590,69 @@ class SpecialPage {
}
/**
+ * Entry point.
+ *
+ * @since 1.20
+ *
+ * @param $subPage string|null
+ */
+ public final function run( $subPage ) {
+ /**
+ * Gets called before @see SpecialPage::execute.
+ *
+ * @since 1.20
+ *
+ * @param $special SpecialPage
+ * @param $subPage string|null
+ */
+ wfRunHooks( 'SpecialPageBeforeExecute', array( $this, $subPage ) );
+
+ $this->beforeExecute( $subPage );
+ $this->execute( $subPage );
+ $this->afterExecute( $subPage );
+
+ /**
+ * Gets called after @see SpecialPage::execute.
+ *
+ * @since 1.20
+ *
+ * @param $special SpecialPage
+ * @param $subPage string|null
+ */
+ wfRunHooks( 'SpecialPageAfterExecute', array( $this, $subPage ) );
+ }
+
+ /**
+ * Gets called before @see SpecialPage::execute.
+ *
+ * @since 1.20
+ *
+ * @param $subPage string|null
+ */
+ protected function beforeExecute( $subPage ) {
+ // No-op
+ }
+
+ /**
+ * Gets called after @see SpecialPage::execute.
+ *
+ * @since 1.20
+ *
+ * @param $subPage string|null
+ */
+ protected function afterExecute( $subPage ) {
+ // No-op
+ }
+
+ /**
* Default execute method
* Checks user permissions, calls the function given in mFunction
*
* This must be overridden by subclasses; it will be made abstract in a future version
*
- * @param $par String subpage string, if one was specified
+ * @param $subPage string|null
*/
- function execute( $par ) {
+ public function execute( $subPage ) {
$this->setHeaders();
$this->checkPermissions();
@@ -609,7 +662,7 @@ class SpecialPage {
require_once( $this->mFile );
}
$this->outputHeader();
- call_user_func( $func, $par, $this );
+ call_user_func( $func, $subPage, $this );
}
/**
@@ -628,7 +681,7 @@ class SpecialPage {
} else {
$msg = $summaryMessageKey;
}
- if ( !$this->msg( $msg )->isBlank() && !$this->including() ) {
+ if ( !$this->msg( $msg )->isDisabled() && !$this->including() ) {
$this->getOutput()->wrapWikiMsg(
"<div class='mw-specialpage-summary'>\n$1\n</div>", $msg );
}
@@ -768,7 +821,15 @@ class SpecialPage {
// Works fine as the first parameter, which appears elsewhere in the
// code base. Sighhhh.
$args = func_get_args();
- return call_user_func_array( array( $this->getContext(), 'msg' ), $args );
+ $message = call_user_func_array( array( $this->getContext(), 'msg' ), $args );
+ // RequestContext passes context to wfMessage, and the language is set from
+ // the context, but setting the language for Message class removes the
+ // interface message status, which breaks for example usernameless gender
+ // invokations. Restore the flag when not including special page in content.
+ if ( $this->including() ) {
+ $message->setInterfaceMessageFlag( false );
+ }
+ return $message;
}
/**
@@ -891,7 +952,7 @@ abstract class FormSpecialPage extends SpecialPage {
$this->checkPermissions();
if ( $this->requiresUnblock() && $user->isBlocked() ) {
- $block = $user->mBlock;
+ $block = $user->getBlock();
throw new UserBlockedError( $block );
}
@@ -988,7 +1049,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
* False otherwise.
*
* @param $par String Subpage string
- * @return Title|false
+ * @return Title|bool
*/
abstract public function getRedirect( $par );
@@ -1076,16 +1137,102 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
*/
/**
+ * Superclass for any RedirectSpecialPage which redirects the user
+ * to a particular article (as opposed to user contributions, logs, etc.).
+ *
+ * For security reasons these special pages are restricted to pass on
+ * the following subset of GET parameters to the target page while
+ * removing all others:
+ *
+ * - useskin, uselang, printable: to alter the appearance of the resulting page
+ *
+ * - redirect: allows viewing one's user page or talk page even if it is a
+ * redirect.
+ *
+ * - rdfrom: allows redirecting to one's user page or talk page from an
+ * external wiki with the "Redirect from..." notice.
+ *
+ * - limit, offset: Useful for linking to history of one's own user page or
+ * user talk page. For example, this would be a link to "the last edit to your
+ * user talk page in the year 2010":
+ * http://en.wikipedia.org/w/index.php?title=Special:MyPage&offset=20110000000000&limit=1&action=history
+ *
+ * - feed: would allow linking to the current user's RSS feed for their user
+ * talk page:
+ * http://en.wikipedia.org/w/index.php?title=Special:MyTalk&action=history&feed=rss
+ *
+ * - preloadtitle: Can be used to provide a default section title for a
+ * preloaded new comment on one's own talk page.
+ *
+ * - summary : Can be used to provide a default edit summary for a preloaded
+ * edit to one's own user page or talk page.
+ *
+ * - preview: Allows showing/hiding preview on first edit regardless of user
+ * preference, useful for preloaded edits where you know preview wouldn't be
+ * useful.
+ *
+ * - internaledit, externaledit, mode: Allows forcing the use of the
+ * internal/external editor, e.g. to force the internal editor for
+ * short/simple preloaded edits.
+ *
+ * - redlink: Affects the message the user sees if their talk page/user talk
+ * page does not currently exist. Avoids confusion for newbies with no user
+ * pages over why they got a "permission error" following this link:
+ * http://en.wikipedia.org/w/index.php?title=Special:MyPage&redlink=1
+ *
+ * - debug: determines whether the debug parameter is passed to load.php,
+ * which disables reformatting and allows scripts to be debugged. Useful
+ * when debugging scripts that manipulate one's own user page or talk page.
+ *
+ * @par Hook extension:
+ * Extensions can add to the redirect parameters list by using the hook
+ * RedirectSpecialArticleRedirectParams
+ *
+ * This hook allows extensions which add GET parameters like FlaggedRevs to
+ * retain those parameters when redirecting using special pages.
+ *
+ * @par Hook extension example:
+ * @code
+ * $wgHooks['RedirectSpecialArticleRedirectParams'][] =
+ * 'MyExtensionHooks::onRedirectSpecialArticleRedirectParams';
+ * public static function onRedirectSpecialArticleRedirectParams( &$redirectParams ) {
+ * $redirectParams[] = 'stable';
+ * return true;
+ * }
+ * @endcode
+ * @ingroup SpecialPage
+ */
+abstract class RedirectSpecialArticle extends RedirectSpecialPage {
+ function __construct( $name ) {
+ parent::__construct( $name );
+ $redirectParams = array(
+ 'action',
+ 'redirect', 'rdfrom',
+ # Options for preloaded edits
+ 'preload', 'editintro', 'preloadtitle', 'summary',
+ # Options for overriding user settings
+ 'preview', 'internaledit', 'externaledit', 'mode',
+ # Options for history/diffs
+ 'section', 'oldid', 'diff', 'dir',
+ 'limit', 'offset', 'feed',
+ # Misc options
+ 'redlink', 'debug',
+ # Options for action=raw; missing ctype can break JS or CSS in some browsers
+ 'ctype', 'maxage', 'smaxage',
+ );
+
+ wfRunHooks( "RedirectSpecialArticleRedirectParams", array(&$redirectParams) );
+ $this->mAllowedRedirectParams = $redirectParams;
+ }
+}
+
+/**
* Shortcut to construct a special page pointing to current user user's page.
* @ingroup SpecialPage
*/
-class SpecialMypage extends RedirectSpecialPage {
+class SpecialMypage extends RedirectSpecialArticle {
function __construct() {
parent::__construct( 'Mypage' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
- 'section', 'oldid', 'diff', 'dir',
- // Options for action=raw; missing ctype can break JS or CSS in some browsers
- 'ctype', 'maxage', 'smaxage' );
}
function getRedirect( $subpage ) {
@@ -1101,11 +1248,9 @@ class SpecialMypage extends RedirectSpecialPage {
* Shortcut to construct a special page pointing to current user talk page.
* @ingroup SpecialPage
*/
-class SpecialMytalk extends RedirectSpecialPage {
+class SpecialMytalk extends RedirectSpecialArticle {
function __construct() {
parent::__construct( 'Mytalk' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
- 'section', 'oldid', 'diff', 'dir' );
}
function getRedirect( $subpage ) {