From 63601400e476c6cf43d985f3e7b9864681695ed4 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 18 Jan 2013 16:46:04 +0100 Subject: 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 --- includes/SpecialPage.php | 217 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 181 insertions(+), 36 deletions(-) (limited to 'includes/SpecialPage.php') 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 @@ mFunction = $function; } if ( $file === 'default' ) { - $this->mFile = dirname( __FILE__ ) . "/specials/Special$name.php"; + $this->mFile = __DIR__ . "/specials/Special$name.php"; } else { $this->mFile = $file; } @@ -591,15 +589,70 @@ class SpecialPage { $out->setPageTitle( $this->getDescription() ); } + /** + * 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( "
\n$1\n
", $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 ); @@ -1075,17 +1136,103 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial { * users. */ +/** + * 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 ) { -- cgit v1.2.3-54-g00ecf