Cleanup in WikiPage::getRedirectURL():
authorAlexandre Emsenhuber <ialex@users.mediawiki.org>
Sat, 7 Jan 2012 15:48:42 +0000 (15:48 +0000)
committerAlexandre Emsenhuber <ialex@users.mediawiki.org>
Sat, 7 Jan 2012 15:48:42 +0000 (15:48 +0000)
* Call Title::isValidRedirectTarget() in case of special page instead of checking only for Special:Userlogout
* Refactor the code a bit to be more readable and remove unneeded nested conditions

includes/WikiPage.php

index f9feaea..262235f 100644 (file)
@@ -205,36 +205,39 @@ class WikiPage extends Page {
         * @return mixed false, Title object of local target, or string with URL
         */
        public function getRedirectURL( $rt ) {
-               if ( $rt ) {
-                       if ( $rt->getInterwiki() != '' ) {
-                               if ( $rt->isLocal() ) {
-                                       // Offsite wikis need an HTTP redirect.
-                                       //
-                                       // This can be hard to reverse and may produce loops,
-                                       // so they may be disabled in the site configuration.
-                                       $source = $this->mTitle->getFullURL( 'redirect=no' );
-                                       return $rt->getFullURL( 'rdfrom=' . urlencode( $source ) );
-                               }
+               if ( !$rt ) {
+                       return false;
+               }
+
+               if ( $rt->isExternal() ) {
+                       if ( $rt->isLocal() ) {
+                               // Offsite wikis need an HTTP redirect.
+                               //
+                               // This can be hard to reverse and may produce loops,
+                               // so they may be disabled in the site configuration.
+                               $source = $this->mTitle->getFullURL( 'redirect=no' );
+                               return $rt->getFullURL( 'rdfrom=' . urlencode( $source ) );
                        } else {
-                               if ( $rt->isSpecialPage() ) {
-                                       // Gotta handle redirects to special pages differently:
-                                       // Fill the HTTP response "Location" header and ignore
-                                       // the rest of the page we're on.
-                                       //
-                                       // This can be hard to reverse, so they may be disabled.
-                                       if ( $rt->isSpecial( 'Userlogout' ) ) {
-                                               // rolleyes
-                                       } else {
-                                               return $rt->getFullURL();
-                                       }
-                               }
+                               // External pages pages without "local" bit set are not valid
+                               // redirect targets
+                               return false;
+                       }
+               }
 
-                               return $rt;
+               if ( $rt->isSpecialPage() ) {
+                       // Gotta handle redirects to special pages differently:
+                       // Fill the HTTP response "Location" header and ignore
+                       // the rest of the page we're on.
+                       //
+                       // Some pages are not valid targets
+                       if ( $rt->isValidRedirectTarget() ) {
+                               return $rt->getFullURL();
+                       } else {
+                               return false;
                        }
                }
 
-               // No or invalid redirect
-               return false;
+               return $rt;
        }
 
        /**