X-Git-Url: https://git.cyclocoop.org/admin/?a=blobdiff_plain;f=includes%2FSpecialPageFactory.php;h=95f75a8ef7e35eecf0f93fa461f4526fa66d9504;hb=0168a529a98adcc257771ad8ef52e11e9ae85471;hp=ea0048c91a5b705b9c9d6fa777a4555f1195df8c;hpb=3bc50f69840c978e81f1464f400921d39e74c39a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php index ea0048c91a..95f75a8ef7 100644 --- a/includes/SpecialPageFactory.php +++ b/includes/SpecialPageFactory.php @@ -1,6 +1,29 @@ 'MostlinkedCategoriesPage', 'Mostimages' => 'MostimagesPage', + 'Mostinterwikis' => 'MostinterwikisPage', 'Mostlinked' => 'MostlinkedPage', 'Mostlinkedtemplates' => 'MostlinkedTemplatesPage', 'Mostcategories' => 'MostcategoriesPage', @@ -138,6 +155,7 @@ class SpecialPageFactory { 'Blankpage' => 'SpecialBlankpage', 'Blockme' => 'SpecialBlockme', 'Emailuser' => 'SpecialEmailUser', + 'JavaScriptTest' => 'SpecialJavaScriptTest', 'Movepage' => 'MovePageForm', 'Mycontributions' => 'SpecialMycontributions', 'Mypage' => 'SpecialMypage', @@ -160,6 +178,7 @@ class SpecialPageFactory { static function getList() { global $wgSpecialPages; global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication; + global $wgEnableEmail; if ( !is_object( self::$mList ) ) { wfProfileIn( __METHOD__ ); @@ -177,6 +196,10 @@ class SpecialPageFactory { self::$mList['Invalidateemail'] = 'EmailInvalidation'; } + if ( $wgEnableEmail ) { + self::$mList['ChangeEmail'] = 'SpecialChangeEmail'; + } + // Add extension special pages self::$mList = array_merge( self::$mList, $wgSpecialPages ); @@ -262,33 +285,36 @@ class SpecialPageFactory { */ public static function setGroup( $page, $group ) { global $wgSpecialPageGroups; - $name = is_object( $page ) ? $page->mName : $page; + $name = is_object( $page ) ? $page->getName() : $page; $wgSpecialPageGroups[$name] = $group; } /** - * Add a page to a certain display group for Special:SpecialPages + * Get the group that the special page belongs in on Special:SpecialPage * * @param $page SpecialPage + * @return String */ public static function getGroup( &$page ) { + $name = $page->getName(); + global $wgSpecialPageGroups; static $specialPageGroupsCache = array(); - if ( isset( $specialPageGroupsCache[$page->mName] ) ) { - return $specialPageGroupsCache[$page->mName]; + if ( isset( $specialPageGroupsCache[$name] ) ) { + return $specialPageGroupsCache[$name]; } - $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $page->mName ) ); + $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $name ) ); if ( !$msg->isBlank() ) { $group = $msg->text(); } else { - $group = isset( $wgSpecialPageGroups[$page->mName] ) - ? $wgSpecialPageGroups[$page->mName] + $group = isset( $wgSpecialPageGroups[$name] ) + ? $wgSpecialPageGroups[$name] : '-'; } if ( $group == '-' ) { $group = 'other'; } - $specialPageGroupsCache[$page->mName] = $group; + $specialPageGroupsCache[$name] = $group; return $group; } @@ -332,18 +358,21 @@ class SpecialPageFactory { * Return categorised listable special pages which are available * for the current user, and everyone. * + * @param $user User object to check permissions, $wgUser will be used + * if not provided * @return Array( String => Specialpage ) */ - public static function getUsablePages() { - global $wgUser; + public static function getUsablePages( User $user = null ) { $pages = array(); + if ( $user === null ) { + global $wgUser; + $user = $wgUser; + } foreach ( self::getList() as $name => $rec ) { $page = self::getPage( $name ); - if ( $page->isListed() - && ( - !$page->isRestricted() - || $page->userCanExecute( $wgUser ) - ) + if ( $page // not null + && $page->isListed() + && ( !$page->isRestricted() || $page->userCanExecute( $user ) ) ) { $pages[$name] = $page; } @@ -398,12 +427,12 @@ class SpecialPageFactory { * page, and true if it was successful. * * @param $title Title object - * @param $context RequestContext + * @param $context IContextSource * @param $including Bool output is being captured for use in {{special:whatever}} * * @return bool */ - public static function executePath( Title &$title, RequestContext &$context, $including = false ) { + public static function executePath( Title &$title, IContextSource &$context, $including = false ) { wfProfileIn( __METHOD__ ); // @todo FIXME: Redirects broken due to this call @@ -417,10 +446,15 @@ class SpecialPageFactory { $page = self::getPage( $name ); // Nonexistent? if ( !$page ) { - $context->output->setArticleRelated( false ); - $context->output->setRobotPolicy( 'noindex,nofollow' ); - $context->output->setStatusCode( 404 ); - $context->output->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' ); + $context->getOutput()->setArticleRelated( false ); + $context->getOutput()->setRobotPolicy( 'noindex,nofollow' ); + + global $wgSend404Code; + if ( $wgSend404Code ) { + $context->getOutput()->setStatusCode( 404 ); + } + + $context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' ); wfProfileOut( __METHOD__ ); return false; } @@ -434,17 +468,17 @@ class SpecialPageFactory { // the request. Such POST requests are possible for old extensions that // generate self-links without being aware that their default name has // changed. - if ( $name != $page->getLocalName() && !$context->request->wasPosted() ) { - $query = $context->request->getQueryValues(); + if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) { + $query = $context->getRequest()->getQueryValues(); unset( $query['title'] ); $query = wfArrayToCGI( $query ); $title = $page->getTitle( $par ); $url = $title->getFullUrl( $query ); - $context->output->redirect( $url ); + $context->getOutput()->redirect( $url ); wfProfileOut( __METHOD__ ); return $title; } else { - $context->title = $page->getTitle(); + $context->setTitle( $page->getTitle( $par ) ); } } elseif ( !$page->isIncludable() ) { @@ -457,43 +491,54 @@ class SpecialPageFactory { // Execute special page $profName = 'Special:' . $page->getName(); wfProfileIn( $profName ); - $page->execute( $par ); + $page->run( $par ); wfProfileOut( $profName ); wfProfileOut( __METHOD__ ); return true; } /** - * 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. + * Just like executePath() but will override global variables and execute + * the page in "inclusion" mode. Returns true if the execution was + * successful or false if there was no such special page, or a title object + * if it was a redirect. + * + * Also saves the current $wgTitle, $wgOut, $wgRequest, $wgUser and $wgLang + * variables so that the special page will get the context it'd expect on a + * normal request, and then restores them to their previous values after. * * @param $title Title + * @param $context IContextSource * * @return String: HTML fragment */ - static function capturePath( &$title ) { - global $wgOut, $wgTitle, $wgRequest; + static function capturePath( Title $title, IContextSource $context ) { + global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang; + // Save current globals $oldTitle = $wgTitle; $oldOut = $wgOut; $oldRequest = $wgRequest; + $oldUser = $wgUser; + $oldLang = $wgLang; - // Don't want special pages interpreting ?feed=atom parameters. - $wgRequest = new FauxRequest( array() ); - - $context = new RequestContext; - $context->setTitle( $title ); - $context->setRequest( $wgRequest ); + // Set the globals to the current context + $wgTitle = $title; $wgOut = $context->getOutput(); + $wgRequest = $context->getRequest(); + $wgUser = $context->getUser(); + $wgLang = $context->getLanguage(); + // The useful part $ret = self::executePath( $title, $context, true ); - if ( $ret === true ) { - $ret = $wgOut->getHTML(); - } + + // And restore the old globals $wgTitle = $oldTitle; $wgOut = $oldOut; $wgRequest = $oldRequest; + $wgUser = $oldUser; + $wgLang = $oldLang; + return $ret; } @@ -508,7 +553,7 @@ class SpecialPageFactory { static function getLocalNameFor( $name, $subpage = false ) { global $wgContLang; $aliases = $wgContLang->getSpecialPageAliases(); - + if ( isset( $aliases[$name][0] ) ) { $name = $aliases[$name][0]; } else {