Follow up r47852. Unlike forkWorkers(), the start() method doesn't get the $procs...
[lhc/web/wiklou.git] / includes / SpecialPage.php
index 859865e..558296a 100644 (file)
@@ -84,39 +84,39 @@ class SpecialPage {
         */
        static public $mList = array(
                # Maintenance Reports
-               'BrokenRedirects'           => array( 'SpecialPage', 'BrokenRedirects' ),
-               'Deadendpages'              => array( 'SpecialPage', 'Deadendpages' ),
-               'DoubleRedirects'           => array( 'SpecialPage', 'DoubleRedirects' ),
-               'Longpages'                 => array( 'SpecialPage', 'Longpages' ),
-               'Ancientpages'              => array( 'SpecialPage', 'Ancientpages' ),
-               'Lonelypages'               => array( 'SpecialPage', 'Lonelypages' ),
-               'Fewestrevisions'           => array( 'SpecialPage', 'Fewestrevisions' ),
-               'Withoutinterwiki'          => array( 'SpecialPage', 'Withoutinterwiki' ),
+               'BrokenRedirects'           => 'BrokenRedirectsPage',
+               'Deadendpages'              => 'DeadendpagesPage',
+               'DoubleRedirects'           => 'DoubleRedirectsPage',
+               'Longpages'                 => 'LongpagesPage',
+               'Ancientpages'              => 'AncientpagesPage',
+               'Lonelypages'               => 'LonelypagesPage',
+               'Fewestrevisions'           => 'FewestrevisionsPage',
+               'Withoutinterwiki'          => 'WithoutinterwikiPage',
                'Protectedpages'            => 'SpecialProtectedpages',
                'Protectedtitles'           => 'SpecialProtectedtitles',
-               'Shortpages'                => array( 'SpecialPage', 'Shortpages' ),
-               'Uncategorizedcategories'   => array( 'SpecialPage', 'Uncategorizedcategories' ),
-               'Uncategorizedimages'       => array( 'SpecialPage', 'Uncategorizedimages' ),
-               'Uncategorizedpages'        => array( 'SpecialPage', 'Uncategorizedpages' ),
-               'Uncategorizedtemplates'    => array( 'SpecialPage', 'Uncategorizedtemplates' ),
-               'Unusedcategories'          => array( 'SpecialPage', 'Unusedcategories' ),
-               'Unusedimages'              => array( 'SpecialPage', 'Unusedimages' ),
-               'Unusedtemplates'           => array( 'SpecialPage', 'Unusedtemplates' ),
-               'Unwatchedpages'            => array( 'SpecialPage', 'Unwatchedpages', 'unwatchedpages' ),
-               'Wantedcategories'          => array( 'SpecialPage', 'Wantedcategories' ),
-               'Wantedfiles'               => array( 'SpecialPage', 'Wantedfiles' ),
-               'Wantedpages'               => array( 'IncludableSpecialPage', 'Wantedpages' ),
-               'Wantedtemplates'           => array( 'SpecialPage', 'Wantedtemplates' ),
+               'Shortpages'                => 'ShortpagesPage',
+               'Uncategorizedcategories'   => 'UncategorizedcategoriesPage',
+               'Uncategorizedimages'       => 'UncategorizedimagesPage',
+               'Uncategorizedpages'        => 'UncategorizedpagesPage',
+               'Uncategorizedtemplates'    => 'UncategorizedtemplatesPage',
+               'Unusedcategories'          => 'UnusedcategoriesPage',
+               'Unusedimages'              => 'UnusedimagesPage',
+               'Unusedtemplates'           => 'UnusedtemplatesPage',
+               'Unwatchedpages'            => 'UnwatchedpagesPage',
+               'Wantedcategories'          => 'WantedcategoriesPage',
+               'Wantedfiles'               => 'WantedfilesPage',
+               'Wantedpages'               => 'WantedpagesPage',
+               'Wantedtemplates'           => 'WantedtemplatesPage',
 
                # List of pages
                'Allpages'                  => 'SpecialAllpages',
                'Prefixindex'               => 'SpecialPrefixindex',
                'Categories'                => 'SpecialCategories',
-               'Disambiguations'           => array( 'SpecialPage', 'Disambiguations' ),
-               'Listredirects'             => array( 'SpecialPage', 'Listredirects' ),
+               'Disambiguations'           => 'DisambiguationsPage',
+               'Listredirects'             => 'ListredirectsPage',
 
                # Login/create account
-               'Userlogin'                 => array( 'SpecialPage', 'Userlogin' ),
+               'Userlogin'                 => 'LoginForm',
                'CreateAccount'             => array( 'SpecialRedirectToSpecial', 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) ),
 
                # Users and rights
@@ -133,6 +133,7 @@ class SpecialPage {
                'Listbots'                  => array( 'SpecialRedirectToSpecial', 'Listbots', 'Listusers', 'bot' ),
                'Activeusers'               => 'SpecialActiveUsers',
                'Userrights'                => 'UserrightsPage',
+               'DisableAccount'            => 'SpecialDisableAccount',
 
                # Recent changes and logs
                'Newimages'                 => array( 'IncludableSpecialPage', 'Newimages' ),
@@ -146,10 +147,10 @@ class SpecialPage {
                # Media reports and uploads
                'Listfiles'                 => array( 'SpecialPage', 'Listfiles' ),
                'Filepath'                  => 'SpecialFilepath',
-               'MIMEsearch'                => array( 'SpecialPage', 'MIMEsearch' ),
-               'FileDuplicateSearch'       => array( 'SpecialPage', 'FileDuplicateSearch' ),
+               'MIMEsearch'                => 'MIMEsearchPage',
+               'FileDuplicateSearch'       => 'FileDuplicateSearchPage',
                'Upload'                    => 'SpecialUpload',
-               'UploadStash'        => 'SpecialUploadStash',
+               'UploadStash'               => 'SpecialUploadStash',
 
                # Wiki data and tools
                'Statistics'                => 'SpecialStatistics',
@@ -159,23 +160,23 @@ class SpecialPage {
                'Unlockdb'                  => 'SpecialUnlockdb',
 
                # Redirecting special pages
-               'LinkSearch'                => array( 'SpecialPage', 'LinkSearch' ),
+               'LinkSearch'                => 'LinkSearchPage',
                'Randompage'                => 'Randompage',
                'Randomredirect'            => 'SpecialRandomredirect',
 
                # High use pages
-               'Mostlinkedcategories'      => array( 'SpecialPage', 'Mostlinkedcategories' ),
-               'Mostimages'                => array( 'SpecialPage', 'Mostimages' ),
-               'Mostlinked'                => array( 'SpecialPage', 'Mostlinked' ),
-               'Mostlinkedtemplates'       => array( 'SpecialPage', 'Mostlinkedtemplates' ),
-               'Mostcategories'            => array( 'SpecialPage', 'Mostcategories' ),
-               'Mostrevisions'             => array( 'SpecialPage', 'Mostrevisions' ),
+               'Mostlinkedcategories'      => 'MostlinkedCategoriesPage',
+               'Mostimages'                => 'MostimagesPage',
+               'Mostlinked'                => 'MostlinkedPage',
+               'Mostlinkedtemplates'       => 'MostlinkedTemplatesPage',
+               'Mostcategories'            => 'MostcategoriesPage',
+               'Mostrevisions'             => 'MostrevisionsPage',
 
                # Page tools
                'ComparePages'              => 'SpecialComparePages',
                'Export'                    => 'SpecialExport',
                'Import'                    => 'SpecialImport',
-               'Undelete'                  => 'UndeleteForm',
+               'Undelete'                  => 'SpecialUndelete',
                'Whatlinkshere'             => 'SpecialWhatlinkshere',
                'MergeHistory'              => 'SpecialMergeHistory',
 
@@ -190,6 +191,8 @@ class SpecialPage {
                'Mycontributions'           => 'SpecialMycontributions',
                'Mypage'                    => 'SpecialMypage',
                'Mytalk'                    => 'SpecialMytalk',
+               'Myuploads'                 => 'SpecialMyuploads',
+               'PermanentLink'             => 'SpecialPermanentLink',
                'Revisiondelete'            => 'SpecialRevisionDelete',
                'RevisionMove'              => 'SpecialRevisionMove',
                'Specialpages'              => 'SpecialSpecialpages',
@@ -218,11 +221,11 @@ class SpecialPage {
                self::$mListInitialised = true;
 
                if( !$wgDisableCounters ) {
-                       self::$mList['Popularpages'] = array( 'SpecialPage', 'Popularpages' );
+                       self::$mList['Popularpages'] = 'PopularpagesPage';
                }
 
                if( !$wgDisableInternalSearch ) {
-                       self::$mList['Search'] = array( 'SpecialPage', 'Search' );
+                       self::$mList['Search'] = 'SpecialSearch';
                }
 
                if( $wgEmailAuthentication ) {
@@ -272,6 +275,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 {
@@ -403,7 +407,7 @@ class SpecialPage {
                                self::$mList[$name] = new $className;
                        } elseif ( is_array( $rec ) ) {
                                $className = array_shift( $rec );
-                               self::$mList[$name] = wfCreateObject( $className, $rec );
+                               self::$mList[$name] = MWFunction::newObj( $className, $rec );
                        }
                        return self::$mList[$name];
                } else {
@@ -501,7 +505,7 @@ class SpecialPage {
 
        /**
         * Execute a special page path.
-        * The path     may contain parameters, e.g. Special:Name/Params
+        * The path may contain parameters, e.g. Special:Name/Params
         * Extracts the special page name and call the execute method, passing the parameters
         *
         * Returns a title object if the page is redirected, false if there was no such special
@@ -538,12 +542,18 @@ class SpecialPage {
                # Check for redirect
                if ( !$including ) {
                        $redirect = $page->getRedirect( $par );
-                       if ( $redirect ) {
-                               $query = $page->getRedirectQuery();
+                       $query = $page->getRedirectQuery();
+                       if ( $redirect instanceof Title ) {
                                $url = $redirect->getFullUrl( $query );
                                $wgOut->redirect( $url );
                                wfProfileOut( __METHOD__ );
                                return $redirect;
+                       } elseif( $redirect === true ) {
+                               global $wgScript;
+                               $url = $wgScript . '?' . wfArrayToCGI( $query );
+                               $wgOut->redirect( $url );
+                               wfProfileOut( __METHOD__ );
+                               return $redirect;
                        }
                }
 
@@ -572,7 +582,7 @@ class SpecialPage {
                $page->including( $including );
 
                // Execute special page
-               $profName = 'Special:' . $page->getName();
+               $profName = 'Special:' . $page->name();
                wfProfileIn( $profName );
                $page->execute( $par );
                wfProfileOut( $profName );
@@ -699,7 +709,16 @@ class SpecialPage {
         * @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 __construct( $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;
@@ -716,6 +735,32 @@ class SpecialPage {
                }
        }
 
+       /**
+        * 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 $fName 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 );
+               } else {
+                       $className = get_class( $this );
+                       throw new MWException( "Call to undefined method $className::$fName" );
+               }
+       }
+
        /**#@+
          * Accessor
          *
@@ -891,16 +936,20 @@ class SpecialPage {
        function getRedirectQuery() {
                global $wgRequest;
                $params = array();
+
                foreach( $this->mAllowedRedirectParams as $arg ) {
-                       if( ( $val = $wgRequest->getVal( $arg, null ) ) !== null )
-                               $params[] = $arg . '=' . $val;
+                       if( $wgRequest->getVal( $arg, null ) !== null ){
+                               $params[$arg] = $wgRequest->getVal( $arg );
+                       }
                }
-               
+
                foreach( $this->mAddedRedirectParams as $arg => $val ) {
-                       $params[] = $arg . '=' . $val;
+                       $params[$arg] = $val;
                }
-               
-               return count( $params ) ? implode( '&', $params ) : false;
+
+               return count( $params )
+                       ? $params
+                       : false;
        }
 }
 
@@ -950,7 +999,8 @@ class SpecialRedirectToSpecial extends UnlistedSpecialPage {
        }
 }
 
-/** SpecialMypage, SpecialMytalk and SpecialMycontributions special pages
+/**
+ * SpecialMypage, SpecialMytalk and SpecialMycontributions special pages
  * are used to get user independant links pointing to the user page, talk
  * page and list of contributions.
  * This can let us cache a single copy of any generated content for all
@@ -964,7 +1014,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 ) {
@@ -984,7 +1035,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 ) {
@@ -1013,3 +1065,34 @@ 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() );
+       }
+}
+
+/**
+ * Redirect from Special:PermanentLink/### to index.php?oldid=###
+ */
+class SpecialPermanentLink extends UnlistedSpecialPage {
+       function __construct() {
+               parent::__construct( 'PermanentLink' );
+               $this->mAllowedRedirectParams = array();
+       }
+
+       function getRedirect( $subpage ) {
+               $subpage = intval( $subpage );
+               $this->mAddedRedirectParams['oldid'] = $subpage;
+               return true;
+       }
+}