Revert "Revert r46880, r46902. After issues with editing rights for pages in r46880...
authorAndrew Garrett <werdna@users.mediawiki.org>
Fri, 6 Feb 2009 17:58:18 +0000 (17:58 +0000)
committerAndrew Garrett <werdna@users.mediawiki.org>
Fri, 6 Feb 2009 17:58:18 +0000 (17:58 +0000)
properly

includes/Title.php

index 06ba76d..50cd6c7 100644 (file)
@@ -1166,6 +1166,59 @@ class Title {
 
                $errors = array();
 
+               // First stop is permissions checks, which fail most often, and which are easiest to test.
+               if ( $action == 'move' ) {
+                       if( !$user->isAllowed( 'move-rootuserpages' )
+                                       && $this->getNamespace() == NS_USER && !$this->isSubpage() )
+                       {
+                               // Show user page-specific message only if the user can move other pages
+                               $errors[] = array( 'cant-move-user-page' );
+                       }
+                       
+                       // Check if user is allowed to move files if it's a file
+                       if( $this->getNamespace() == NS_FILE && !$user->isAllowed( 'movefile' ) ) {
+                               $errors[] = array( 'movenotallowedfile' );
+                       }
+                       
+                       if( !$user->isAllowed( 'move' ) ) {
+                               // User can't move anything
+                               $errors[] = $user->isAnon() ? array ( 'movenologintext' ) : array ('movenotallowed');
+                       }
+               } elseif ( $action == 'create' ) {
+                       if( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
+                               ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) )
+                       {
+                               $errors[] = $user->isAnon() ? array ('nocreatetext') : array ('nocreate-loggedin');
+                       }
+               } elseif( $action == 'move-target' ) {
+                       if( !$user->isAllowed( 'move' ) ) {
+                               // User can't move anything
+                               $errors[] = $user->isAnon() ? array ( 'movenologintext' ) : array ('movenotallowed');
+                       } elseif( !$user->isAllowed( 'move-rootuserpages' )
+                               && $this->getNamespace() == NS_USER && !$this->isSubpage() )
+                       {
+                               // Show user page-specific message only if the user can move other pages
+                               $errors[] = array( 'cant-move-to-user-page' );
+                       }
+               } elseif( !$user->isAllowed( $action ) ) {
+                       $return = null;
+                       $groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
+                               User::getGroupsWithPermission( $action ) );
+                       if( $groups ) {
+                               $return = array( 'badaccess-groups',
+                                       array( implode( ', ', $groups ), count( $groups ) ) );
+                       } else {
+                               $return = array( "badaccess-group0" );
+                       }
+                       $errors[] = $return;
+               }
+
+               # Short-circuit point
+               if( $short && count($errors) > 0 ) {
+                       wfProfileOut( __METHOD__ );
+                       return $errors;
+               }
+
                // Use getUserPermissionsErrors instead
                if( !wfRunHooks( 'userCan', array( &$this, &$user, $action, &$result ) ) ) {
                        wfProfileOut( __METHOD__ );
@@ -1300,26 +1353,7 @@ class Title {
                                        $errors[] = array( 'titleprotected', User::whoIs($pt_user), $pt_reason );
                                }
                        }
-
-                       if( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
-                               ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) ) 
-                       {
-                               $errors[] = $user->isAnon() ? array ('nocreatetext') : array ('nocreate-loggedin');
-                       }
                } elseif( $action == 'move' ) {
-                       if( !$user->isAllowed( 'move' ) ) {
-                               // User can't move anything
-                               $errors[] = $user->isAnon() ? array ( 'movenologintext' ) : array ('movenotallowed');
-                       } elseif( !$user->isAllowed( 'move-rootuserpages' ) 
-                                       && $this->getNamespace() == NS_USER && !$this->isSubpage() ) 
-                       {
-                               // Show user page-specific message only if the user can move other pages
-                               $errors[] = array( 'cant-move-user-page' );
-                       }
-                       // Check if user is allowed to move files if it's a file
-                       if( $this->getNamespace() == NS_FILE && !$user->isAllowed( 'movefile' ) ) {
-                               $errors[] = array( 'movenotallowedfile' );
-                       }
                        // Check for immobile pages
                        if( !MWNamespace::isMovable( $this->getNamespace() ) ) {
                                // Specific message for this case
@@ -1329,31 +1363,11 @@ class Title {
                                $errors[] = array( 'immobile-page' );
                        }
                } elseif( $action == 'move-target' ) {
-                       if( !$user->isAllowed( 'move' ) ) {
-                               // User can't move anything
-                               $errors[] = $user->isAnon() ? array ( 'movenologintext' ) : array ('movenotallowed');
-                       } elseif( !$user->isAllowed( 'move-rootuserpages' ) 
-                               && $this->getNamespace() == NS_USER && !$this->isSubpage() ) 
-                       {
-                               // Show user page-specific message only if the user can move other pages
-                               $errors[] = array( 'cant-move-to-user-page' );
-                       }
                        if( !MWNamespace::isMovable( $this->getNamespace() ) ) {
                                $errors[] = array( 'immobile-target-namespace', $this->getNsText() );
                        } elseif( !$this->isMovable() ) {
                                $errors[] = array( 'immobile-target-page' );
                        }
-               } elseif( !$user->isAllowed( $action ) ) {
-                       $return = null;
-                       $groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
-                               User::getGroupsWithPermission( $action ) );
-                       if( $groups ) {
-                               $return = array( 'badaccess-groups',
-                                       array( implode( ', ', $groups ), count( $groups ) ) );
-                       } else {
-                               $return = array( "badaccess-group0" );
-                       }
-                       $errors[] = $return;
                }
 
                wfProfileOut( __METHOD__ );