From 2bf1a9cd8ad5f204faeaaa792a9a51899807fc59 Mon Sep 17 00:00:00 2001 From: Derrick Coetzee Date: Wed, 9 May 2012 20:12:42 -0700 Subject: [PATCH] (bug 35060) more allowed params to Special:MyPage, Special:MyTalk I investigated the available parameters and considered which could be plausibly useful for Special:MyPage and Special:MyTalk, and there are quite a few. See inline documentation for a list of them. More could potentially be added in the future if a use case is discovered. This patch also make it possible for extensions to add their own parameters to this list, through the new hook: RedirectSpecialArticleRedirectParams It has at least one application - with FlaggedRevs, it's desirable to pass the "stable" flag through Special:MyPage. It also makes it simple for individual servers that have some special reason to pass on a particular parameter to do so in LocalSettings.php, simplifying upgrades. Change-Id: I3101fbe2eba8712b87a53706583f4e8f3e907478 --- docs/hooks.txt | 5 ++ includes/SpecialPage.php | 100 +++++++++++++++++++++++++++++++++++---- 2 files changed, 97 insertions(+), 8 deletions(-) diff --git a/docs/hooks.txt b/docs/hooks.txt index 5a836ae401..e844e891c9 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -1626,6 +1626,11 @@ $out: OutputPage object 'RecentChange_save': called at the end of RecentChange::save() $recentChange: RecentChange object +'RedirectSpecialArticleRedirectParams': lets you alter the set of +parameter names such as "oldid" that are preserved when using +redirecting special pages such as Special:MyPage and Special:MyTalk. +&$redirectParams: An array of parameters preserved by redirecting special pages. + 'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin instance. Can be used by an extension override what skin is used in certain contexts. IContextSource $context: The RequestContext the skin is being created for. diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index ba6db79395..629e06d00b 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -1136,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', 'preloadtitle', '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 ) { @@ -1162,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', 'preloadtitle', 'editintro', - 'section', 'oldid', 'diff', 'dir' ); } function getRedirect( $subpage ) { -- 2.20.1