* Wont work
[lhc/web/wiklou.git] / includes / Title.php
index 35d57db..2e0f686 100644 (file)
@@ -1029,7 +1029,7 @@ class Title {
         * @param string $action action that permission needs to be checked for
         * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary queries.
         * @return array Array of arrays of the arguments to wfMsg to explain permissions problems.
-       */
+        */
        public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true ) {
                $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
 
@@ -1037,12 +1037,13 @@ class Title {
                global $wgLang;
 
                if ( wfReadOnly() && $action != 'read' ) {
-                       $errors[] = array( 'readonlytext' );
+                       global $wgReadOnly;
+                       $errors[] = array( 'readonlytext', $wgReadOnly );
                }
 
                global $wgEmailConfirmToEdit, $wgUser;
 
-               if ( $wgEmailConfirmToEdit && !$wgUser->isEmailConfirmed() )
+               if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() )
                {
                        $errors[] = array( 'confirmedittext' );
                }
@@ -1066,6 +1067,7 @@ class Title {
                        $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
                        $blockid = $block->mId;
                        $blockExpiry = $user->mBlock->mExpiry;
+                       $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $user->mBlock->mTimestamp ), true );
 
                        if ( $blockExpiry == 'infinity' ) {
                                // Entry in database (table ipblocks) is 'infinity' but 'ipboptions' uses 'infinite' or 'indefinite'
@@ -1088,7 +1090,7 @@ class Title {
 
                        $intended = $user->mBlock->mAddress;
 
-                       $errors[] = array ( ($block->mAuto ? 'autoblockedtext-concise' : 'blockedtext-concise'), $link, $reason, $ip, $name, $blockid, $blockExpiry, $intended );
+                       $errors[] = array ( ($block->mAuto ? 'autoblockedtext' : 'blockedtext'), $link, $reason, $ip, $name, $blockid, $blockExpiry, $intended, $blockTimestamp );
                }
 
                return $errors;
@@ -1107,10 +1109,22 @@ class Title {
 
                $errors = array();
 
+               // Use getUserPermissionsErrors instead
                if ( !wfRunHooks( 'userCan', array( &$this, &$user, $action, &$result ) ) ) {
                        return $result ? array() : array( array( 'badaccess-group0' ) );
                }
 
+               if (!wfRunHooks( 'getUserPermissionsErrors', array( &$this, &$user, $action, &$result ) ) ) {
+                       if ($result != array() && is_array($result) && !is_array($result[0]))
+                               $errors[] = $result; # A single array representing an error
+                       else if (is_array($result) && is_array($result[0]))
+                               $errors = array_merge( $errors, $result ); # A nested array representing multiple errors
+                       else if ($result != '' && $result != null && $result !== true && $result !== false)
+                               $errors[] = array($result); # A string representing a message-id
+                       else if ($result === false )
+                               $errors[] = array('badaccess-group0'); # a generic "We don't want them to do that"
+               }
+
                if( NS_SPECIAL == $this->mNamespace ) {
                        $errors[] = array('ns-specialprotected');
                }
@@ -1133,7 +1147,7 @@ class Title {
                # XXX: this might be better using restrictions
                # XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssJsSubpage() from working
                if( $this->isCssJsSubpage()
-                       && !$user->isAllowed('editinterface')
+                       && !$user->isAllowed('editusercssjs')
                        && !preg_match('/^'.preg_quote($user->getName(), '/').'\//', $this->mTextform) ) {
                        $errors[] = array('customcssjsprotected');
                }
@@ -1167,7 +1181,7 @@ class Title {
                                $right = 'protect';
                        }
                        if( '' != $right && !$user->isAllowed( $right ) ) {
-                               $errors[] = array( 'protectedpagetext' );
+                               $errors[] = array( 'protectedpagetext', $right );
                        }
                }
 
@@ -1176,20 +1190,18 @@ class Title {
                                ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) ) {
                                $errors[] = $user->isAnon() ? array ('nocreatetext') : array ('nocreate-loggedin');
                        }
-               } elseif( $action == 'move' &&
-                       !( $this->isMovable() && $user->isAllowed( 'move' ) ) ) {
+               } elseif( $action == 'move' && !( $this->isMovable() && $user->isAllowed( 'move' ) ) ) {
                        $errors[] = $user->isAnon() ? array ( 'movenologintext' ) : array ('movenotallowed');
-                } else if ( !$user->isAllowed( $action ) ) {
+        } else if ( !$user->isAllowed( $action ) ) {
                        $return = null;
-                       $groups = array();
+                   $groups = array();
                        global $wgGroupPermissions;
                        foreach( $wgGroupPermissions as $key => $value ) {
                            if( isset( $value[$action] ) && $value[$action] == true ) {
                                $groupName = User::getGroupName( $key );
                                $groupPage = User::getGroupPage( $key );
                                if( $groupPage ) {
-                                   $skin = $user->getSkin();
-                                   $groups[] = $skin->makeLinkObj( $groupPage, $groupName );
+                                   $groups[] = '[['.$groupPage->getPrefixedText().'|'.$groupName.']]';
                                } else {
                                    $groups[] = $groupName;
                                }
@@ -1277,19 +1289,26 @@ class Title {
                        if( $this->isSpecial( 'Userlogin' ) || $this->isSpecial( 'Resetpass' ) ) {
                                return true;
                        }
+
+                       /**
+                        * Bail out if there isn't whitelist
+                        */
+                       if( !is_array($wgWhitelistRead) ) {
+                               return false;
+                       }
                        
                        /**
                         * Check for explicit whitelisting
                         */
                        $name = $this->getPrefixedText();
-                       if( $wgWhitelistRead && in_array( $name, $wgWhitelistRead, true ) )
+                       if( in_array( $name, $wgWhitelistRead, true ) )
                                return true;
                        
                        /**
                         * Old settings might have the title prefixed with
                         * a colon for main-namespace pages
                         */
-                       if( $wgWhitelistRead && $this->getNamespace() == NS_MAIN ) {
+                       if( $this->getNamespace() == NS_MAIN ) {
                                if( in_array( ':' . $name, $wgWhitelistRead ) )
                                        return true;
                        }
@@ -1393,7 +1412,7 @@ class Title {
         */
        public function userCanEditCssJsSubpage() {
                global $wgUser;
-               return ( $wgUser->isAllowed('editinterface') or preg_match('/^'.preg_quote($wgUser->getName(), '/').'\//', $this->mTextform) );
+               return ( $wgUser->isAllowed('editusercssjs') or preg_match('/^'.preg_quote($wgUser->getName(), '/').'\//', $this->mTextform) );
        }
 
        /**
@@ -1915,7 +1934,14 @@ class Title {
                        $this->mNamespace != NS_MAIN ) {
                        return false;
                }
-
+               // Allow IPv6 usernames to start with '::' by canonicalizing IPv6 titles.
+               // IP names are not allowed for accounts, and can only be referring to 
+               // edits from the IP. Given '::' abbreviations and caps/lowercaps, 
+               // there are numerous ways to present the same IP. Having sp:contribs scan 
+               // them all is silly and having some show the edits and others not is 
+               // inconsistent. Same for talk/userpages. Keep them normalized instead.
+               $dbkey = ($this->mNamespace == NS_USER || $this->mNamespace == NS_USER_TALK) ? 
+                       IP::sanitizeIP( $dbkey ) : $dbkey;
                // Any remaining initial :s are illegal.
                if ( $dbkey !== '' && ':' == $dbkey{0} ) {
                        return false;
@@ -2019,10 +2045,16 @@ class Title {
        /**
         * Get an array of Title objects referring to non-existent articles linked from this page
         *
+        * @todo check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case)
         * @param string $options may be FOR UPDATE
         * @return array the Title objects
         */
        public function getBrokenLinksFrom( $options = '' ) {
+               if ( $this->getArticleId() == 0 ) {
+                       # All links from article ID 0 are false positives
+                       return array();
+               }
+
                if ( $options ) {
                        $db = wfGetDB( DB_MASTER );
                } else {
@@ -2461,7 +2493,7 @@ class Title {
                                $data[$wgContLang->getNSText ( NS_CATEGORY ).':'.$x->cl_to] = $this->getFullText();
                        $dbr->freeResult ( $res ) ;
                } else {
-                       $data = '';
+                       $data = array();
                }
                return $data;
        }