summaryrefslogtreecommitdiff
path: root/includes/SpecialPage.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/SpecialPage.php')
-rw-r--r--includes/SpecialPage.php237
1 files changed, 163 insertions, 74 deletions
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 80e2f7ed..12ad517a 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -70,6 +70,10 @@ class SpecialPage {
*/
var $mAllowedRedirectParams = array();
/**
+ * Query parameteres added by redirects
+ */
+ var $mAddedRedirectParams = array();
+ /**
* List of special pages, followed by parameters.
* If the only parameter is a string, that is the page name.
* Otherwise, it is an array. The format is one of:
@@ -88,8 +92,8 @@ class SpecialPage {
'Lonelypages' => array( 'SpecialPage', 'Lonelypages' ),
'Fewestrevisions' => array( 'SpecialPage', 'Fewestrevisions' ),
'Withoutinterwiki' => array( 'SpecialPage', 'Withoutinterwiki' ),
- 'Protectedpages' => array( 'SpecialPage', 'Protectedpages' ),
- 'Protectedtitles' => array( 'SpecialPage', 'Protectedtitles' ),
+ 'Protectedpages' => 'SpecialProtectedpages',
+ 'Protectedtitles' => 'SpecialProtectedtitles',
'Shortpages' => array( 'SpecialPage', 'Shortpages' ),
'Uncategorizedcategories' => array( 'SpecialPage', 'Uncategorizedcategories' ),
'Uncategorizedimages' => array( 'SpecialPage', 'Uncategorizedimages' ),
@@ -107,7 +111,7 @@ class SpecialPage {
# List of pages
'Allpages' => 'SpecialAllpages',
'Prefixindex' => 'SpecialPrefixindex',
- 'Categories' => array( 'SpecialPage', 'Categories' ),
+ 'Categories' => 'SpecialCategories',
'Disambiguations' => array( 'SpecialPage', 'Disambiguations' ),
'Listredirects' => array( 'SpecialPage', 'Listredirects' ),
@@ -116,20 +120,23 @@ class SpecialPage {
'CreateAccount' => array( 'SpecialRedirectToSpecial', 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) ),
# Users and rights
- 'Blockip' => array( 'SpecialPage', 'Blockip', 'block' ),
- 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ),
+ 'Blockip' => 'IPBlockForm',
+ 'Ipblocklist' => 'IPUnblockForm',
+ 'Unblock' => array( 'SpecialRedirectToSpecial', 'Unblock', 'Ipblocklist', false, array( 'uselang', 'ip', 'id' ), array( 'action' => 'unblock' ) ),
'Resetpass' => 'SpecialResetpass',
'DeletedContributions' => 'DeletedContributionsPage',
'Preferences' => 'SpecialPreferences',
'Contributions' => 'SpecialContributions',
'Listgrouprights' => 'SpecialListGroupRights',
'Listusers' => array( 'SpecialPage', 'Listusers' ),
+ 'Listadmins' => array( 'SpecialRedirectToSpecial', 'Listadmins', 'Listusers', 'sysop' ),
+ 'Listbots' => array( 'SpecialRedirectToSpecial', 'Listbots', 'Listusers', 'bot' ),
'Activeusers' => 'SpecialActiveUsers',
'Userrights' => 'UserrightsPage',
# Recent changes and logs
'Newimages' => array( 'IncludableSpecialPage', 'Newimages' ),
- 'Log' => array( 'SpecialPage', 'Log' ),
+ 'Log' => 'SpecialLog',
'Watchlist' => array( 'SpecialPage', 'Watchlist' ),
'Newpages' => 'SpecialNewpages',
'Recentchanges' => 'SpecialRecentchanges',
@@ -138,17 +145,18 @@ class SpecialPage {
# Media reports and uploads
'Listfiles' => array( 'SpecialPage', 'Listfiles' ),
- 'Filepath' => array( 'SpecialPage', 'Filepath' ),
+ 'Filepath' => 'SpecialFilepath',
'MIMEsearch' => array( 'SpecialPage', 'MIMEsearch' ),
'FileDuplicateSearch' => array( 'SpecialPage', 'FileDuplicateSearch' ),
'Upload' => 'SpecialUpload',
+ 'UploadStash' => 'SpecialUploadStash',
# Wiki data and tools
'Statistics' => 'SpecialStatistics',
'Allmessages' => 'SpecialAllmessages',
'Version' => 'SpecialVersion',
- 'Lockdb' => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
- 'Unlockdb' => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
+ 'Lockdb' => 'SpecialLockdb',
+ 'Unlockdb' => 'SpecialUnlockdb',
# Redirecting special pages
'LinkSearch' => array( 'SpecialPage', 'LinkSearch' ),
@@ -164,28 +172,28 @@ class SpecialPage {
'Mostrevisions' => array( 'SpecialPage', 'Mostrevisions' ),
# Page tools
+ 'ComparePages' => 'SpecialComparePages',
'Export' => 'SpecialExport',
'Import' => 'SpecialImport',
- 'Undelete' => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
+ 'Undelete' => 'UndeleteForm',
'Whatlinkshere' => 'SpecialWhatlinkshere',
- 'MergeHistory' => array( 'SpecialPage', 'MergeHistory', 'mergehistory' ),
+ 'MergeHistory' => 'SpecialMergeHistory',
# Other
'Booksources' => 'SpecialBookSources',
# Unlisted / redirects
'Blankpage' => 'SpecialBlankpage',
- 'Blockme' => array( 'UnlistedSpecialPage', 'Blockme' ),
- 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ),
- 'Listadmins' => array( 'SpecialRedirectToSpecial', 'Listadmins', 'Listusers', 'sysop' ),
- 'Listbots' => array( 'SpecialRedirectToSpecial', 'Listbots', 'Listusers', 'bot' ),
- 'Movepage' => array( 'UnlistedSpecialPage', 'Movepage' ),
- 'Mycontributions' => array( 'SpecialMycontributions' ),
- 'Mypage' => array( 'SpecialMypage' ),
- 'Mytalk' => array( 'SpecialMytalk' ),
+ 'Blockme' => 'SpecialBlockme',
+ 'Emailuser' => 'SpecialEmailUser',
+ 'Movepage' => 'MovePageForm',
+ 'Mycontributions' => 'SpecialMycontributions',
+ 'Mypage' => 'SpecialMypage',
+ 'Mytalk' => 'SpecialMytalk',
+ 'Myuploads' => 'SpecialMyuploads',
'Revisiondelete' => 'SpecialRevisionDelete',
- 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ),
- 'Userlogout' => array( 'UnlistedSpecialPage', 'Userlogout' ),
+ 'Specialpages' => 'SpecialSpecialpages',
+ 'Userlogout' => 'SpecialUserlogout',
);
static public $mAliases;
@@ -254,6 +262,9 @@ class SpecialPage {
/**
* Given a special page alias, return the special page name.
* Returns false if there is no such alias.
+ *
+ * @param $alias String
+ * @return String or false
*/
static function resolveAlias( $alias ) {
global $wgContLang;
@@ -261,6 +272,7 @@ class SpecialPage {
if ( !self::$mListInitialised ) self::initList();
if ( is_null( self::$mAliases ) ) self::initAliasList();
$caseFoldedAlias = $wgContLang->caseFold( $alias );
+ $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
if ( isset( self::$mAliases[$caseFoldedAlias] ) ) {
return self::$mAliases[$caseFoldedAlias];
} else {
@@ -272,6 +284,9 @@ class SpecialPage {
* Given a special page name with a possible subpage, return an array
* where the first element is the special page name and the second is the
* subpage.
+ *
+ * @param $alias String
+ * @return Array
*/
static function resolveAliasWithSubpage( $alias ) {
$bits = explode( '/', $alias, 2 );
@@ -289,10 +304,11 @@ class SpecialPage {
* method for adding special pages in extensions. It's now suggested that you add
* an associative record to $wgSpecialPages. This avoids autoloading SpecialPage.
*
- * @param SpecialPage $page
- * @static
+ * @param $page SpecialPage
+ * Deprecated in 1.7, warnings in 1.17, might be removed in 1.20
*/
static function addPage( &$page ) {
+ wfDeprecated( __METHOD__ );
if ( !self::$mListInitialised ) {
self::initList();
}
@@ -302,9 +318,8 @@ class SpecialPage {
/**
* Add a page to a certain display group for Special:SpecialPages
*
- * @param mixed $page (SpecialPage or string)
- * @param string $group
- * @static
+ * @param $page Mixed: SpecialPage or string
+ * @param $group String
*/
static function setGroup( $page, $group ) {
global $wgSpecialPageGroups;
@@ -315,8 +330,7 @@ class SpecialPage {
/**
* Add a page to a certain display group for Special:SpecialPages
*
- * @param SpecialPage $page
- * @static
+ * @param $page SpecialPage
*/
static function getGroup( &$page ) {
global $wgSpecialPageGroups;
@@ -340,8 +354,6 @@ class SpecialPage {
* Remove a special page from the list
* Formerly used to disable expensive or dangerous special pages. The
* preferred method is now to add a SpecialPage_initList hook.
- *
- * @static
*/
static function removePage( $name ) {
if ( !self::$mListInitialised ) {
@@ -352,8 +364,9 @@ class SpecialPage {
/**
* Check if a given name exist as a special page or as a special page alias
- * @param $name string: name of a special page
- * @return boolean: true if a special page exists with this name
+ *
+ * @param $name String: name of a special page
+ * @return Boolean: true if a special page exists with this name
*/
static function exists( $name ) {
global $wgContLang;
@@ -376,8 +389,9 @@ class SpecialPage {
/**
* Find the object with a given name and return it (or NULL)
- * @static
- * @param string $name
+ *
+ * @param $name String
+ * @return SpecialPage object or null if the page doesn't exist
*/
static function getPage( $name ) {
if ( !self::$mListInitialised ) {
@@ -401,6 +415,8 @@ class SpecialPage {
/**
* Get a special page with a given localised name, or NULL if there
* is no such special page.
+ *
+ * @return SpecialPage object or null if the page doesn't exist
*/
static function getPageByAlias( $alias ) {
$realName = self::resolveAlias( $alias );
@@ -414,7 +430,8 @@ class SpecialPage {
/**
* Return categorised listable special pages which are available
* for the current user, and everyone.
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getUsablePages() {
global $wgUser;
@@ -439,7 +456,8 @@ class SpecialPage {
/**
* Return categorised listable special pages for all users
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getRegularPages() {
if ( !self::$mListInitialised ) {
@@ -459,7 +477,8 @@ class SpecialPage {
/**
* Return categorised listable special pages which are available
* for the current user, but not for everyone
- * @static
+ *
+ * @return Associative array mapping page's name to its SpecialPage object
*/
static function getRestrictedPages() {
global $wgUser;
@@ -554,7 +573,7 @@ class SpecialPage {
$page->including( $including );
// Execute special page
- $profName = 'Special:' . $page->getName();
+ $profName = 'Special:' . $page->name();
wfProfileIn( $profName );
$page->execute( $par );
wfProfileOut( $profName );
@@ -566,7 +585,8 @@ class SpecialPage {
* Just like executePath() except it returns the HTML instead of outputting it
* Returns false if there was no such special page, or a title object if it was
* a redirect.
- * @static
+ *
+ * @return String: HTML fragment
*/
static function capturePath( &$title ) {
global $wgOut, $wgTitle;
@@ -588,10 +608,10 @@ class SpecialPage {
/**
* Get the local name for a specified canonical name
*
- * @param $name
- * @param mixed $subpage Boolean false, or string
+ * @param $name String
+ * @param $subpage Mixed: boolean false, or string
*
- * @return string
+ * @return String
*/
static function getLocalNameFor( $name, $subpage = false ) {
global $wgContLang;
@@ -603,15 +623,17 @@ class SpecialPage {
$found = false;
foreach ( $aliases as $n => $values ) {
if ( strcasecmp( $name, $n ) === 0 ) {
- wfWarn( "Found alias defined for $n when searching for special page aliases
-for $name. Case mismatch?" );
+ wfWarn( "Found alias defined for $n when searching for" .
+ "special page aliases for $name. Case mismatch?" );
$name = $values[0];
$found = true;
break;
}
}
- if ( !$found ) wfWarn( "Did not find alias for special page '$name'.
-Perhaps no page aliases are defined for it?" );
+ if ( !$found ) {
+ wfWarn( "Did not find alias for special page '$name'. " .
+ "Perhaps no aliases are defined for it?" );
+ }
}
if ( $subpage !== false && !is_null( $subpage ) ) {
$name = "$name/$subpage";
@@ -621,6 +643,8 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a localised Title object for a specified special page name
+ *
+ * @return Title object
*/
static function getTitleFor( $name, $subpage = false ) {
$name = self::getLocalNameFor( $name, $subpage );
@@ -633,6 +657,8 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a localised Title object for a page name with a possibly unvalidated subpage
+ *
+ * @return Title object or null if the page doesn't exist
*/
static function getSafeTitleFor( $name, $subpage = false ) {
$name = self::getLocalNameFor( $name, $subpage );
@@ -645,6 +671,7 @@ Perhaps no page aliases are defined for it?" );
/**
* Get a title for a given alias
+ *
* @return Title or null if there is no such alias
*/
static function getTitleForAlias( $alias ) {
@@ -666,18 +693,28 @@ Perhaps no page aliases are defined for it?" );
* If you override execute(), you can recover the default behaviour with userCanExecute()
* and displayRestrictionError()
*
- * @param string $name Name of the special page, as seen in links and URLs
- * @param string $restriction User right required, e.g. "block" or "delete"
- * @param boolean $listed Whether the page is listed in Special:Specialpages
- * @param string $function Function called by execute(). By default it is constructed from $name
- * @param string $file File which is included by execute(). It is also constructed from $name by default
+ * @param $name String: name of the special page, as seen in links and URLs
+ * @param $restriction String: user right required, e.g. "block" or "delete"
+ * @param $listed Boolean: whether the page is listed in Special:Specialpages
+ * @param $function Callback: function called by execute(). By default it is constructed from $name
+ * @param $file String: file which is included by execute(). It is also constructed from $name by default
+ * @param $includable Boolean: whether the page can be included in normal pages
*/
- function SpecialPage( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false ) {
+ public function __construct( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false ) {
+ $this->init( $name, $restriction, $listed, $function, $file, $includable );
+ }
+
+ /**
+ * Do the real work for the constructor, mainly so __call() can intercept
+ * calls to SpecialPage()
+ * @see __construct() for param docs
+ */
+ private function init( $name, $restriction, $listed, $function, $file, $includable ) {
$this->mName = $name;
$this->mRestriction = $restriction;
$this->mListed = $listed;
$this->mIncludable = $includable;
- if ( $function == false ) {
+ if ( !$function ) {
$this->mFunction = 'wfSpecial'.$name;
} else {
$this->mFunction = $function;
@@ -689,6 +726,29 @@ Perhaps no page aliases are defined for it?" );
}
}
+ /**
+ * Use PHP's magic __call handler to get calls to the old PHP4 constructor
+ * because PHP E_STRICT yells at you for having __construct() and SpecialPage()
+ *
+ * @param $name String Name of called method
+ * @param $a Array Arguments to the method
+ * @deprecated Call isn't deprecated, but SpecialPage::SpecialPage() is
+ */
+ public function __call( $fName, $a ) {
+ // Sometimes $fName is SpecialPage, sometimes it's specialpage. <3 PHP
+ if( strtolower( $fName ) == 'specialpage' ) {
+ // Debug messages now, warnings in 1.19 or 1.20?
+ wfDebug( "Deprecated SpecialPage::SpecialPage() called, use __construct();\n" );
+ $name = isset( $a[0] ) ? $a[0] : '';
+ $restriction = isset( $a[1] ) ? $a[1] : '';
+ $listed = isset( $a[2] ) ? $a[2] : true;
+ $function = isset( $a[3] ) ? $a[3] : false;
+ $file = isset( $a[4] ) ? $a[4] : 'default';
+ $includable = isset( $a[5] ) ? $a[5] : false;
+ $this->init( $name, $restriction, $listed, $function, $file, $includable );
+ }
+ }
+
/**#@+
* Accessor
*
@@ -731,7 +791,7 @@ Perhaps no page aliases are defined for it?" );
* Can be overridden by subclasses with more complicated permissions
* schemes.
*
- * @return bool Should the page be displayed with the restricted-access
+ * @return Boolean: should the page be displayed with the restricted-access
* pages?
*/
public function isRestricted() {
@@ -745,8 +805,8 @@ Perhaps no page aliases are defined for it?" );
* special page (as defined by $mRestriction). Can be overridden by sub-
* classes with more complicated permissions schemes.
*
- * @param User $user The user to check
- * @return bool Does the user have permission to view the page?
+ * @param $user User: the user to check
+ * @return Boolean: does the user have permission to view the page?
*/
public function userCanExecute( $user ) {
return $user->isAllowed( $this->mRestriction );
@@ -774,7 +834,7 @@ Perhaps no page aliases are defined for it?" );
* Default execute method
* Checks user permissions, calls the function given in mFunction
*
- * This may be overridden by subclasses.
+ * This must be overridden by subclasses; it will be made abstract in a future version
*/
function execute( $par ) {
global $wgUser;
@@ -800,7 +860,7 @@ Perhaps no page aliases are defined for it?" );
* May be overriden, i.e. by extensions to stick with the naming conventions
* for message keys: 'extensionname-xxx'
*
- * @param string message key of the summary
+ * @param $summaryMessageKey String: message key of the summary
*/
function outputHeader( $summaryMessageKey = '' ) {
global $wgOut, $wgContLang;
@@ -812,22 +872,29 @@ Perhaps no page aliases are defined for it?" );
}
$out = wfMsgNoTrans( $msg );
if ( ! wfEmptyMsg( $msg, $out ) and $out !== '' and ! $this->including() ) {
- $wgOut->wrapWikiMsg( "<div class='mw-specialpage-summary'>\n$1</div>", $msg );
+ $wgOut->wrapWikiMsg( "<div class='mw-specialpage-summary'>\n$1\n</div>", $msg );
}
}
- # Returns the name that goes in the <h1> in the special page itself, and also the name that
- # will be listed in Special:Specialpages
- #
- # Derived classes can override this, but usually it is easier to keep the default behaviour.
- # Messages can be added at run-time, see MessageCache.php
+ /**
+ * Returns the name that goes in the \<h1\> in the special page itself, and
+ * also the name that will be listed in Special:Specialpages
+ *
+ * Derived classes can override this, but usually it is easier to keep the
+ * default behaviour. Messages can be added at run-time, see
+ * MessageCache.php.
+ *
+ * @return String
+ */
function getDescription() {
return wfMsg( strtolower( $this->mName ) );
}
/**
* Get a self-referential title object
+ *
+ * @return Title object
*/
function getTitle( $subpage = false ) {
return self::getTitleFor( $this->mName, $subpage );
@@ -852,7 +919,7 @@ Perhaps no page aliases are defined for it?" );
* Return part of the request string for a special redirect page
* This allows passing, e.g. action=history to Special:Mypage, etc.
*
- * @return string
+ * @return String
*/
function getRedirectQuery() {
global $wgRequest;
@@ -861,7 +928,11 @@ Perhaps no page aliases are defined for it?" );
if( ( $val = $wgRequest->getVal( $arg, null ) ) !== null )
$params[] = $arg . '=' . $val;
}
-
+
+ foreach( $this->mAddedRedirectParams as $arg => $val ) {
+ $params[] = $arg . '=' . $val;
+ }
+
return count( $params ) ? implode( '&', $params ) : false;
}
}
@@ -872,8 +943,8 @@ Perhaps no page aliases are defined for it?" );
*/
class UnlistedSpecialPage extends SpecialPage
{
- function UnlistedSpecialPage( $name, $restriction = '', $function = false, $file = 'default' ) {
- SpecialPage::SpecialPage( $name, $restriction, false, $function, $file );
+ function __construct( $name, $restriction = '', $function = false, $file = 'default' ) {
+ parent::__construct( $name, $restriction, false, $function, $file );
}
}
@@ -883,8 +954,8 @@ class UnlistedSpecialPage extends SpecialPage
*/
class IncludableSpecialPage extends SpecialPage
{
- function IncludableSpecialPage( $name, $restriction = '', $listed = true, $function = false, $file = 'default' ) {
- SpecialPage::SpecialPage( $name, $restriction, $listed, $function, $file, true );
+ function __construct( $name, $restriction = '', $listed = true, $function = false, $file = 'default' ) {
+ parent::__construct( $name, $restriction, $listed, $function, $file, true );
}
}
@@ -895,11 +966,12 @@ class IncludableSpecialPage extends SpecialPage
class SpecialRedirectToSpecial extends UnlistedSpecialPage {
var $redirName, $redirSubpage;
- function __construct( $name, $redirName, $redirSubpage = false, $redirectParams = array() ) {
+ function __construct( $name, $redirName, $redirSubpage = false, $allowedRedirectParams = array(), $addedRedirectParams = array() ) {
parent::__construct( $name );
$this->redirName = $redirName;
$this->redirSubpage = $redirSubpage;
- $this->mAllowedRedirectParams = $redirectParams;
+ $this->mAllowedRedirectParams = $allowedRedirectParams;
+ $this->mAddedRedirectParams = $addedRedirectParams;
}
function getRedirect( $subpage ) {
@@ -925,7 +997,8 @@ class SpecialRedirectToSpecial extends UnlistedSpecialPage {
class SpecialMypage extends UnlistedSpecialPage {
function __construct() {
parent::__construct( 'Mypage' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro', 'section' );
+ $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
+ 'section', 'oldid', 'diff', 'dir' );
}
function getRedirect( $subpage ) {
@@ -945,7 +1018,8 @@ class SpecialMypage extends UnlistedSpecialPage {
class SpecialMytalk extends UnlistedSpecialPage {
function __construct() {
parent::__construct( 'Mytalk' );
- $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro', 'section' );
+ $this->mAllowedRedirectParams = array( 'action' , 'preload' , 'editintro',
+ 'section', 'oldid', 'diff', 'dir' );
}
function getRedirect( $subpage ) {
@@ -974,3 +1048,18 @@ class SpecialMycontributions extends UnlistedSpecialPage {
return SpecialPage::getTitleFor( 'Contributions', $wgUser->getName() );
}
}
+
+/**
+ * Redirect to Special:Listfiles?user=$wgUser
+ */
+class SpecialMyuploads extends UnlistedSpecialPage {
+ function __construct() {
+ parent::__construct( 'Myuploads' );
+ $this->mAllowedRedirectParams = array( 'limit' );
+ }
+
+ function getRedirect( $subpage ) {
+ global $wgUser;
+ return SpecialPage::getTitleFor( 'Listfiles', $wgUser->getName() );
+ }
+}