* Split out 'deletedcontent' from 'undelete' right (bug 19199/bug 9884)
authorAaron Schulz <aaron@users.mediawiki.org>
Tue, 22 Sep 2009 22:30:09 +0000 (22:30 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Tue, 22 Sep 2009 22:30:09 +0000 (22:30 +0000)
* Don't blue-link unviewable hidden revisions

includes/DefaultSettings.php
includes/SkinTemplate.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialUndelete.php

index 17e76f9..440c308 100644 (file)
@@ -1353,6 +1353,7 @@ $wgGroupPermissions['sysop']['createaccount']    = true;
 $wgGroupPermissions['sysop']['delete']           = true;
 $wgGroupPermissions['sysop']['bigdelete']        = true; // can be separately configured for pages with > $wgDeleteRevisionsLimit revs
 $wgGroupPermissions['sysop']['deletedhistory']   = true; // can view deleted history entries, but not see or restore the text
+$wgGroupPermissions['sysop']['deletedcontent']   = true; // can view deleted content
 $wgGroupPermissions['sysop']['undelete']         = true;
 $wgGroupPermissions['sysop']['editinterface']    = true;
 $wgGroupPermissions['sysop']['editusercss']      = true;
index 4042514..e0afaa9 100644 (file)
@@ -800,7 +800,7 @@ class SkinTemplate extends Skin {
                                }
                        } else {
                                //article doesn't exist or is deleted
-                               if( $wgUser->isAllowed( 'deletedhistory' ) && $wgUser->isAllowed( 'undelete' ) ) {
+                               if( $wgUser->isAllowed( 'deletedhistory' ) && $wgUser->isAllowed( 'deletedcontent' ) ) {
                                        if( $n = $this->mTitle->isDeleted() ) {
                                                $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
                                                $content_actions['undelete'] = array(
index c63c446..d5d220e 100644 (file)
@@ -145,7 +145,7 @@ class DeletedContribsPager extends IndexPager {
                        $this->messages['undeleteviewlink']
                );
 
-               if( $wgUser->isAllowed('undelete') ) {
+               if( $wgUser->isAllowed('deletedcontent') ) {
                        $last = $sk->linkKnown(
                                $undelete,
                                $this->messages['diff'],
index c0ff3b8..3ba7613 100644 (file)
@@ -552,7 +552,7 @@ class PageArchive {
  */
 class UndeleteForm {
        var $mAction, $mTarget, $mTimestamp, $mRestore, $mInvert, $mTargetObj;
-       var $mTargetTimestamp, $mAllowed, $mComment, $mToken;
+       var $mTargetTimestamp, $mAllowed, $mCanView, $mComment, $mToken;
 
        function UndeleteForm( $request, $par = "" ) {
                global $wgUser;
@@ -576,10 +576,15 @@ class UndeleteForm {
                if( $par != "" ) {
                        $this->mTarget = $par;
                }
-               if ( $wgUser->isAllowed( 'undelete' ) && !$wgUser->isBlocked() ) {
-                       $this->mAllowed = true;
-               } else {
+               if ( $wgUser->isAllowed( 'deletedcontent' ) && $wgUser->isAllowed( 'undelete' ) && !$wgUser->isBlocked() ) {
+                       $this->mAllowed = true; // user can restore
+                       $this->mCanView = true; // user can view content
+               } elseif ( $wgUser->isAllowed( 'deletedcontent' ) ) {
+                       $this->mAllowed = false; // user cannot restore
+                       $this->mCanView = true; // user can view content
+               }  else { // user can only view the list of revisions
                        $this->mAllowed = false;
+                       $this->mCanView = false;
                        $this->mTimestamp = '';
                        $this->mRestore = false;
                }
@@ -1136,8 +1141,9 @@ class UndeleteForm {
                        array( 'page' => $this->mTargetObj->getArticleId() ) );
                $stxt = '';
                $ts = wfTimestamp( TS_MW, $row->ar_timestamp );
+               // Build checkboxen...
                if( $this->mAllowed ) {
-                       if( $this->mInvert){
+                       if( $this->mInvert ) {
                                if( in_array( $ts, $this->mTargetTimestamp ) ) {
                                        $checkBox = Xml::check( "ts$ts");
                                } else {
@@ -1146,12 +1152,18 @@ class UndeleteForm {
                        } else {
                                $checkBox = Xml::check( "ts$ts" );
                        }
+               } else {
+                       $checkBox = '';
+               }
+               // Build page & diff links...
+               if( $this->mCanView ) {
                        $titleObj = SpecialPage::getTitleFor( "Undelete" );
-                       $pageLink = $this->getPageLink( $rev, $titleObj, $ts, $sk );
                        # Last link
                        if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+                               $pageLink = htmlspecialchars( $wgLang->timeanddate( $ts, true ) );
                                $last = wfMsgHtml('diff');
                        } else if( $remaining > 0 || ($earliestLiveTime && $ts > $earliestLiveTime) ) {
+                               $pageLink = $this->getPageLink( $rev, $titleObj, $ts, $sk );
                                $last = $sk->linkKnown(
                                        $titleObj,
                                        wfMsgHtml('diff'),
@@ -1163,20 +1175,22 @@ class UndeleteForm {
                                        )
                                );
                        } else {
+                               $pageLink = $this->getPageLink( $rev, $titleObj, $ts, $sk );
                                $last = wfMsgHtml('diff');
                        }
                } else {
-                       $checkBox = '';
                        $pageLink = htmlspecialchars( $wgLang->timeanddate( $ts, true ) );
                        $last = wfMsgHtml('diff');
                }
+               // User links
                $userLink = $sk->revUserTools( $rev );
-
-               if(!is_null($size = $row->ar_len)) {
+               // Revision text size
+               if( !is_null($size = $row->ar_len) ) {
                        $stxt = $sk->formatRevisionSize( $size );
                }
+               // Edit summary
                $comment = $sk->revComment( $rev );
-               $revdlink = '';
+               // Show/hide link
                if( $wgUser->isAllowed( 'deleterevision' ) ) {
                        if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
                        // If revision was hidden from sysops
@@ -1190,8 +1204,9 @@ class UndeleteForm {
                                );
                                $revdlink = $sk->revDeleteLink( $query, $rev->isDeleted( Revision::DELETED_RESTRICTED ) );
                        }
+               } else {
+                       $revdlink = '';
                }
-
                return "<li>$checkBox $revdlink ($last) $pageLink . . $userLink $stxt $comment</li>";
        }