* Added User paremeter to Revision::userCan(), Revision::userCanBitfield(), LogEvents...
authorAlexandre Emsenhuber <ialex@users.mediawiki.org>
Wed, 12 Oct 2011 15:09:04 +0000 (15:09 +0000)
committerAlexandre Emsenhuber <ialex@users.mediawiki.org>
Wed, 12 Oct 2011 15:09:04 +0000 (15:09 +0000)
* Updated callers that have a context or may use another user than $wgUser
* Revision::getUser(), Revision::getUserText(), Revision::getComment() and Revision::getText() also have a User as parameter, but it will be used only when Revision::FOR_THIS_USER is passed in the first parameter

13 files changed:
includes/ChangesList.php
includes/LogEventsList.php
includes/Revision.php
includes/RevisionList.php
includes/filerepo/ArchivedFile.php
includes/filerepo/File.php
includes/filerepo/OldLocalFile.php
includes/revisiondelete/RevisionDelete.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialUndelete.php

index 4b25489..08e0718 100644 (file)
@@ -262,7 +262,7 @@ class ChangesList extends ContextSource {
                # Diff link
                if( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
                        $diffLink = $this->message['diff'];
-               } elseif( !self::userCan($rc,Revision::DELETED_TEXT) ) {
+               } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $diffLink = $this->message['diff'];
                } else {
                        $query = array(
@@ -422,13 +422,14 @@ class ChangesList extends ContextSource {
         * field of this revision, if it's marked as deleted.
         * @param $rc RCCacheEntry
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       public static function userCan( $rc, $field ) {
+       public static function userCan( $rc, $field, User $user = null ) {
                if( $rc->mAttribs['rc_type'] == RC_LOG ) {
-                       return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
+                       return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
                } else {
-                       return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
+                       return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
                }
        }
 
@@ -675,7 +676,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Don't show unusable diff links
-               if ( !ChangesList::userCan($rc,Revision::DELETED_TEXT) ) {
+               if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $showdifflinks = false;
                }
 
@@ -883,7 +884,7 @@ class EnhancedChangesList extends ChangesList {
                $r .= ' ';
                if( !$allLogs ) {
                        $r .= '(';
-                       if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT ) ) {
+                       if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $r .= $nchanges[$n];
                        } elseif( $isnew ) {
                                $r .= $nchanges[$n];
@@ -972,7 +973,7 @@ class EnhancedChangesList extends ChangesList {
                        if( $type == RC_LOG ) {
                                $link = $rcObj->timestamp;
                        # Revision link
-                       } elseif( !ChangesList::userCan($rcObj,Revision::DELETED_TEXT) ) {
+                       } elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $link = '<span class="history-deleted">'.$rcObj->timestamp.'</span> ';
                        } else {
                                if ( $rcObj->unpatrolled && $type == RC_NEW) {
index 5904105..ca0aac1 100644 (file)
@@ -557,10 +557,11 @@ class LogEventsList {
         *
         * @param $row Row
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       public static function userCan( $row, $field ) {
-               return self::userCanBitfield( $row->log_deleted, $field );
+       public static function userCan( $row, $field, User $user = null ) {
+               return self::userCanBitfield( $row->log_deleted, $field, $user );
        }
 
        /**
@@ -569,19 +570,22 @@ class LogEventsList {
         *
         * @param $bitfield Integer (current field)
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       public static function userCanBitfield( $bitfield, $field ) {
+       public static function userCanBitfield( $bitfield, $field, User $user = null ) {
                if( $bitfield & $field ) {
-                       global $wgUser;
-
                        if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } else {
                                $permission = 'deletedhistory';
                        }
                        wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
-                       return $wgUser->isAllowed( $permission );
+                       if ( $user === null ) {
+                               global $wgUser;
+                               $user = $wgUser;
+                       }
+                       return $user->isAllowed( $permission );
                } else {
                        return true;
                }
index e3db835..cd5e13f 100644 (file)
@@ -490,14 +490,14 @@ class Revision {
         *      Revision::FOR_PUBLIC       to be displayed to all users
         *      Revision::FOR_THIS_USER    to be displayed to $wgUser
         *      Revision::RAW              get the ID regardless of permissions
-        *
-        *
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
         * @return Integer
         */
-       public function getUser( $audience = self::FOR_PUBLIC ) {
+       public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return 0;
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER ) ) {
+               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return 0;
                } else {
                        return $this->mUser;
@@ -522,13 +522,14 @@ class Revision {
         *      Revision::FOR_PUBLIC       to be displayed to all users
         *      Revision::FOR_THIS_USER    to be displayed to $wgUser
         *      Revision::RAW              get the text regardless of permissions
-        *
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
         * @return string
         */
-       public function getUserText( $audience = self::FOR_PUBLIC ) {
+       public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER ) ) {
+               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return '';
                } else {
                        return $this->mUserText;
@@ -553,13 +554,14 @@ class Revision {
         *      Revision::FOR_PUBLIC       to be displayed to all users
         *      Revision::FOR_THIS_USER    to be displayed to $wgUser
         *      Revision::RAW              get the text regardless of permissions
-        *
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
         * @return String
         */
-       function getComment( $audience = self::FOR_PUBLIC ) {
+       function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT ) ) {
+               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
                        return '';
                } else {
                        return $this->mComment;
@@ -630,13 +632,14 @@ class Revision {
         *      Revision::FOR_PUBLIC       to be displayed to all users
         *      Revision::FOR_THIS_USER    to be displayed to $wgUser
         *      Revision::RAW              get the text regardless of permissions
-        *
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
         * @return String
         */
-       public function getText( $audience = self::FOR_PUBLIC ) {
+       public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT ) ) {
+               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
                        return '';
                } else {
                        return $this->getRawText();
@@ -1023,10 +1026,11 @@ class Revision {
         * @param $field Integer:one of self::DELETED_TEXT,
         *                              self::DELETED_COMMENT,
         *                              self::DELETED_USER
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       public function userCan( $field ) {
-               return self::userCanBitfield( $this->mDeleted, $field );
+       public function userCan( $field, User $user = null ) {
+               return self::userCanBitfield( $this->mDeleted, $field, $user );
        }
 
        /**
@@ -1038,11 +1042,11 @@ class Revision {
         * @param $field Integer: one of self::DELETED_TEXT = File::DELETED_FILE,
         *                               self::DELETED_COMMENT = File::DELETED_COMMENT,
         *                               self::DELETED_USER = File::DELETED_USER
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       public static function userCanBitfield( $bitfield, $field ) {
+       public static function userCanBitfield( $bitfield, $field, User $user = null ) {
                if( $bitfield & $field ) { // aspect is deleted
-                       global $wgUser;
                        if ( $bitfield & self::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } elseif ( $field & self::DELETED_TEXT ) {
@@ -1051,7 +1055,11 @@ class Revision {
                                $permission = 'deletedhistory';
                        }
                        wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
-                       return $wgUser->isAllowed( $permission );
+                       if ( $user === null ) {
+                               global $wgUser;
+                               $user = $wgUser;
+                       }
+                       return $user->isAllowed( $permission );
                } else {
                        return true;
                }
index 215b663..cf0c32a 100644 (file)
@@ -300,11 +300,11 @@ class RevisionItem extends RevisionItemBase {
        }
 
        public function canView() {
-               return $this->revision->userCan( Revision::DELETED_RESTRICTED );
+               return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() );
        }
 
        public function canViewContent() {
-               return $this->revision->userCan( Revision::DELETED_TEXT );
+               return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() );
        }
 
        public function isDeleted() {
index b62ed89..6043d26 100644 (file)
@@ -461,10 +461,11 @@ class ArchivedFile {
         * Determine if the current user is allowed to view a particular
         * field of this FileStore image file, if it's marked as deleted.
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return bool
         */
-       public function userCan( $field ) {
+       public function userCan( $field, User $user = null ) {
                $this->load();
-               return Revision::userCanBitfield( $this->deleted, $field );
+               return Revision::userCanBitfield( $this->deleted, $field, $user );
        }
 }
index 630f1f8..afbf13e 100644 (file)
@@ -1437,9 +1437,10 @@ abstract class File {
         * field of this file, if it's marked as deleted.
         * STUB
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return Boolean
         */
-       function userCan( $field ) {
+       function userCan( $field, User $user = null ) {
                return true;
        }
 
index 1fb8c56..de168b3 100644 (file)
@@ -205,11 +205,12 @@ class OldLocalFile extends LocalFile {
         * field of this image file, if it's marked as deleted.
         *
         * @param $field Integer
+        * @param $user User object to check, or null to use $wgUser
         * @return bool
         */
-       function userCan( $field ) {
+       function userCan( $field, User $user = null ) {
                $this->load();
-               return Revision::userCanBitfield( $this->deleted, $field );
+               return Revision::userCanBitfield( $this->deleted, $field, $user );
        }
        
        /**
index b329fc4..ea022fb 100644 (file)
@@ -132,11 +132,11 @@ class RevDel_RevisionItem extends RevDel_Item {
        }
 
        public function canView() {
-               return $this->revision->userCan( Revision::DELETED_RESTRICTED );
+               return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->list->getUser() );
        }
 
        public function canViewContent() {
-               return $this->revision->userCan( Revision::DELETED_TEXT );
+               return $this->revision->userCan( Revision::DELETED_TEXT, $this->list->getUser() );
        }
 
        public function getBits() {
@@ -509,11 +509,11 @@ class RevDel_FileItem extends RevDel_Item {
        }
 
        public function canView() {
-               return $this->file->userCan( File::DELETED_RESTRICTED );
+               return $this->file->userCan( File::DELETED_RESTRICTED, $this->list->getUser() );
        }
 
        public function canViewContent() {
-               return $this->file->userCan( File::DELETED_FILE );
+               return $this->file->userCan( File::DELETED_FILE, $this->list->getUser() );
        }
 
        public function getBits() {
@@ -596,7 +596,7 @@ class RevDel_FileItem extends RevDel_Item {
         * @return string HTML
         */
        protected function getUserTools() {
-               if( $this->file->userCan( Revision::DELETED_USER ) ) {
+               if( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
                        $link = Linker::userLink( $this->file->user, $this->file->user_text ) .
                                Linker::userToolLinks( $this->file->user, $this->file->user_text );
                } else {
@@ -615,7 +615,7 @@ class RevDel_FileItem extends RevDel_Item {
         * @return string HTML
         */
        protected function getComment() {
-               if( $this->file->userCan( File::DELETED_COMMENT ) ) {
+               if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
                        $block = Linker::commentBlock( $this->file->description );
                } else {
                        $block = ' ' . wfMsgHtml( 'rev-deleted-comment' );
@@ -807,7 +807,7 @@ class RevDel_LogItem extends RevDel_Item {
        }
 
        public function canView() {
-               return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED );
+               return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED, $this->list->getUser() );
        }
 
        public function canViewContent() {
index 431787b..bc66bc9 100644 (file)
@@ -616,8 +616,9 @@ class ContribsPager extends ReverseChronologicalPager {
                                $topmarktext .= ' '.Linker::generateRollback( $rev );
                        }
                }
+               $user = $this->getUser();
                # Is there a visible previous revision?
-               if( $rev->userCan( Revision::DELETED_TEXT ) && $rev->getParentId() !== 0 ) {
+               if( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
                        $difftext = Linker::linkKnown(
                                $page,
                                $this->messages['diff'],
@@ -646,7 +647,7 @@ class ContribsPager extends ReverseChronologicalPager {
 
                $comment = $this->getLang()->getDirMark() . Linker::revComment( $rev, false, true );
                $date = $this->getLang()->timeanddate( wfTimestamp( TS_MW, $row->rev_timestamp ), true );
-               if( $rev->userCan( Revision::DELETED_TEXT ) ) {
+               if( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $d = Linker::linkKnown(
                                $page,
                                htmlspecialchars($date),
@@ -680,9 +681,9 @@ class ContribsPager extends ReverseChronologicalPager {
                }
 
                // Don't show useless link to people who cannot hide revisions
-               $canHide = $this->getUser()->isAllowed( 'deleterevision' );
-               if( $canHide || ($rev->getVisibility() && $this->getUser()->isAllowed('deletedhistory')) ) {
-                       if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
+               $canHide = $user->isAllowed( 'deleterevision' );
+               if( $canHide || ($rev->getVisibility() && $user->isAllowed('deletedhistory')) ) {
+                       if( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
                                $del = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
                        } else {
                                $query = array(
index 23c0c83..e97fe4c 100644 (file)
@@ -184,7 +184,7 @@ class DeletedContribsPager extends IndexPager {
                $comment = Linker::revComment( $rev );
                $date = htmlspecialchars( $this->getLang()->timeanddate( $rev->getTimestamp(), true ) );
 
-               if( !$user->isAllowed('undelete') || !$rev->userCan(Revision::DELETED_TEXT) ) {
+               if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $link = $date; // unusable link
                } else {
                        $link = Linker::linkKnown(
index 0f046ab..753ac9e 100644 (file)
@@ -271,7 +271,7 @@ class SpecialMergeHistory extends SpecialPage {
                }
 
                # Last link
-               if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+               if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $last = $this->message['last'];
                } elseif( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = Linker::linkKnown(
index 1bfda1f..e967a90 100644 (file)
@@ -278,7 +278,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addWikiMsg( 'revdelete-no-file' );
                        return;
                }
-               if( !$oimage->userCan(File::DELETED_FILE) ) {
+               if( !$oimage->userCan( File::DELETED_FILE, $this->getUser() ) ) {
                        if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
                                $this->getOutput()->permissionRequired( 'suppressrevision' );
                        } else {
index 1285003..8f3542f 100644 (file)
@@ -634,7 +634,9 @@ class SpecialUndelete extends SpecialPage {
 
        function execute( $par ) {
                $this->setHeaders();
-               if ( !$this->userCanExecute( $this->getUser() ) ) {
+
+               $user = $this->getUser();
+               if ( !$this->userCanExecute( $user ) ) {
                        $this->displayRestrictionError();
                        return;
                }
@@ -663,7 +665,7 @@ class SpecialUndelete extends SpecialPage {
 
                if( is_null( $this->mTargetObj ) ) {
                        # Not all users can just browse every deleted page from the list
-                       if( $this->getUser()->isAllowed( 'browsearchive' ) ) {
+                       if( $user->isAllowed( 'browsearchive' ) ) {
                                $this->showSearchForm();
 
                                # List undeletable articles
@@ -685,14 +687,14 @@ class SpecialUndelete extends SpecialPage {
                        if ( !$file->exists() ) {
                                $out->addWikiMsg( 'filedelete-nofile', $this->mFilename );
                                return;
-                       } elseif( !$file->userCan( File::DELETED_FILE ) ) {
+                       } elseif( !$file->userCan( File::DELETED_FILE, $user ) ) {
                                if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
                                        $out->permissionRequired( 'suppressrevision' );
                                } else {
                                        $out->permissionRequired( 'deletedtext' );
                                }
                                return false;
-                       } elseif ( !$this->getUser()->matchEditToken( $this->mToken, $this->mFilename ) ) {
+                       } elseif ( !$user->matchEditToken( $this->mToken, $this->mFilename ) ) {
                                $this->showFileConfirmationForm( $this->mFilename );
                                return false;
                        } else {
@@ -772,8 +774,6 @@ class SpecialUndelete extends SpecialPage {
        }
 
        private function showRevision( $timestamp ) {
-               $out = $this->getOutput();
-
                if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
                        return 0;
                }
@@ -782,13 +782,16 @@ class SpecialUndelete extends SpecialPage {
                wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) );
                $rev = $archive->getRevision( $timestamp );
 
+               $out = $this->getOutput();
+               $user = $this->getUser();
+
                if( !$rev ) {
                        $out->addWikiMsg( 'undeleterevision-missing' );
                        return;
                }
 
                if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+                       if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                                $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
                                return;
                        } else {
@@ -804,7 +807,7 @@ class SpecialUndelete extends SpecialPage {
                        $previousRev = $archive->getPreviousRevision( $timestamp );
                        if( $previousRev ) {
                                $this->showDiff( $previousRev, $rev );
-                               if( $this->getUser()->getOption( 'diffonly' ) ) {
+                               if( $user->getOption( 'diffonly' ) ) {
                                        return;
                                } else {
                                        $out->addHTML( '<hr />' );
@@ -824,7 +827,7 @@ class SpecialUndelete extends SpecialPage {
                $time = $this->getLang()->timeAndDate( $timestamp, true );
                $d = $this->getLang()->date( $timestamp, true );
                $t = $this->getLang()->time( $timestamp, true );
-               $user = Linker::revUserTools( $rev );
+               $userLink = Linker::revUserTools( $rev );
 
                if( $this->mPreview ) {
                        $openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
@@ -835,14 +838,14 @@ class SpecialUndelete extends SpecialPage {
 
                // Revision delete links
                if ( !$this->mDiff ) {
-                       $revdel = Linker::getRevDeleteLink( $this->getUser(), $rev, $this->mTargetObj );
+                       $revdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
                        if ( $revdel ) {
                                $out->addHTML( "$revdel " );
                        }
                }
 
                $out->addHTML( wfMessage( 'undelete-revision' )->rawParams( $link )->params(
-                       $time )->rawParams( $user )->params( $d, $t )->parse() . '</div>' );
+                       $time )->rawParams( $userLink )->params( $d, $t )->parse() . '</div>' );
                wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) );
 
                if( $this->mPreview ) {
@@ -850,15 +853,15 @@ class SpecialUndelete extends SpecialPage {
                        $popts = $out->parserOptions();
                        $popts->setEditSection( false );
                        $out->parserOptions( $popts );
-                       $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER ), $this->mTargetObj, true );
+                       $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER, $user ), $this->mTargetObj, true );
                }
 
                $out->addHTML(
                        Xml::element( 'textarea', array(
                                        'readonly' => 'readonly',
-                                       'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
-                                       'rows' => intval( $this->getUser()->getOption( 'rows' ) ) ),
-                               $rev->getText( Revision::FOR_THIS_USER ) . "\n" ) .
+                                       'cols' => intval( $user->getOption( 'cols' ) ),
+                                       'rows' => intval( $user->getOption( 'rows' ) ) ),
+                               $rev->getText( Revision::FOR_THIS_USER, $user ) . "\n" ) .
                        Xml::openElement( 'div' ) .
                        Xml::openElement( 'form', array(
                                'method' => 'post',
@@ -874,7 +877,7 @@ class SpecialUndelete extends SpecialPage {
                        Xml::element( 'input', array(
                                'type' => 'hidden',
                                'name' => 'wpEditToken',
-                               'value' => $this->getUser()->editToken() ) ) .
+                               'value' => $user->editToken() ) ) .
                        Xml::element( 'input', array(
                                'type' => 'submit',
                                'name' => 'preview',
@@ -1189,7 +1192,7 @@ class SpecialUndelete extends SpecialPage {
                if( $this->mCanView ) {
                        $titleObj = $this->getTitle();
                        # Last link
-                       if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+                       if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $pageLink = htmlspecialchars( $this->getLang()->timeanddate( $ts, true ) );
                                $last = wfMsgHtml( 'diff' );
                        } elseif( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
@@ -1250,9 +1253,10 @@ class SpecialUndelete extends SpecialPage {
                $comment = $this->getFileComment( $file );
 
                // Add show/hide deletion links if available
-               $canHide = $this->getUser()->isAllowed( 'deleterevision' );
-               if( $canHide || ( $file->getVisibility() && $this->getUser()->isAllowed( 'deletedhistory' ) ) ) {
-                       if( !$file->userCan( File::DELETED_RESTRICTED ) ) {
+               $user = $this->getUser();
+               $canHide = $user->isAllowed( 'deleterevision' );
+               if( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+                       if( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
                                $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
                        } else {
                                $query = array(
@@ -1279,7 +1283,7 @@ class SpecialUndelete extends SpecialPage {
        function getPageLink( $rev, $titleObj, $ts ) {
                $time = htmlspecialchars( $this->getLang()->timeanddate( $ts, true ) );
 
-               if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+               if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
                } else {
                        $link = Linker::linkKnown(
@@ -1305,7 +1309,7 @@ class SpecialUndelete extends SpecialPage {
         * @return String: HTML fragment
         */
        function getFileLink( $file, $titleObj, $ts, $key ) {
-               if( !$file->userCan( File::DELETED_FILE ) ) {
+               if( !$file->userCan( File::DELETED_FILE, $this->getUser() ) ) {
                        return '<span class="history-deleted">' . $this->getLang()->timeanddate( $ts, true ) . '</span>';
                } else {
                        $link = Linker::linkKnown(
@@ -1332,7 +1336,7 @@ class SpecialUndelete extends SpecialPage {
         * @return String: HTML fragment
         */
        function getFileUser( $file ) {
-               if( !$file->userCan( File::DELETED_USER ) ) {
+               if( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
                        return '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
                } else {
                        $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
@@ -1351,7 +1355,7 @@ class SpecialUndelete extends SpecialPage {
         * @return String: HTML fragment
         */
        function getFileComment( $file ) {
-               if( !$file->userCan( File::DELETED_COMMENT ) ) {
+               if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
                        return '<span class="history-deleted"><span class="comment">' .
                                wfMsgHtml( 'rev-deleted-comment' ) . '</span></span>';
                } else {