Change for bug 18383, suppress user/talk page on user suppression
authorAaron Schulz <aaron@users.mediawiki.org>
Thu, 23 Apr 2009 00:50:54 +0000 (00:50 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Thu, 23 Apr 2009 00:50:54 +0000 (00:50 +0000)
includes/specials/SpecialBlockip.php
includes/specials/SpecialRevisiondelete.php

index e33ea83..80b0805 100644 (file)
@@ -450,13 +450,12 @@ class IPBlockForm {
 
                        # Set *_deleted fields if requested
                        if( $this->BlockHideName ) {
-                               self::suppressUserName( $this->BlockAddress, $userId );
+                               self::suppressUserName( $this->BlockAddress, $userId, $reasonstr );
                        }
 
-                       if( $this->BlockWatchUser &&
-                               # Only show watch link when this is no range block
-                               $block->mRangeStart == $block->mRangeEnd) {
-                               $wgUser->addWatch ( Title::makeTitle( NS_USER, $this->BlockAddress ) );
+                       # Only show watch link when this is no range block
+                       if( $this->BlockWatchUser && $block->mRangeStart == $block->mRangeEnd ) {
+                               $wgUser->addWatch( Title::makeTitle( NS_USER, $this->BlockAddress ) );
                        }
                        
                        # Block constructor sanitizes certain block options on insert
@@ -481,7 +480,20 @@ class IPBlockForm {
                }
        }
        
-       public static function suppressUserName( $name, $userId ) {
+       public static function suppressUserName( $name, $userId, $reason = '' ) {
+               $user = User::newFromName( $name, false );
+               # Delete the user pages that exists
+               $title = $user->getUserPage();
+               if( ($id = $title->getArticleID(GAID_FOR_UPDATE)) ) {
+                       $article = new Article( $title );
+                       $article->doDeleteArticle( $reason, true /*suppress*/, $id );
+               }
+               # Delete the user talk pages that exists
+               $title = $user->getTalkPage();
+               if( $id = $title->getArticleID(GAID_FOR_UPDATE) ) {
+                       $article = new Article( $title );
+                       $article->doDeleteArticle( $reason, true /*suppress*/, $id );
+               }
                $op = '|'; // bitwise OR
                return self::setUsernameBitfields( $name, $userId, $op );
        }
index 5857bb8..27cf858 100644 (file)
@@ -85,16 +85,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->showImages();
                } else if( $this->deleteKey == 'logid' ) {
                        $this->showLogItems();
-                       return; // no logs for now
                }
-               list($qc,$lim) = $this->getLogQueryCond();
+               $qc = $this->getLogQueryCond();
                # Show relevant lines from the deletion log
                $wgOut->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'delete' ) ) . "</h2>\n" );
-               LogEventsList::showLogExtract( $wgOut, 'delete', $this->page->getPrefixedText(), '', $lim, $qc );
+               LogEventsList::showLogExtract( $wgOut, 'delete', $this->page->getPrefixedText(), '', 25, $qc );
                # Show relevant lines from the suppression log
                if( $wgUser->isAllowed( 'suppressionlog' ) ) {
                        $wgOut->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'suppress' ) ) . "</h2>\n" );
-                       LogEventsList::showLogExtract( $wgOut, 'suppress', $this->page->getPrefixedText(), '', $lim, $qc );
+                       LogEventsList::showLogExtract( $wgOut, 'suppress', $this->page->getPrefixedText(), '', 25, $qc );
                }
        }
        
@@ -121,9 +120,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
        
        private function getLogQueryCond() {
-               $ids = $safeIds = array();
-               $limit = 25; // default
-               $conds = array( 'log_action' => 'revision' ); // revision delete logs
+               $logAction = 'revision';
                switch( $this->deleteKey ) {
                        case 'oldid':
                                $ids = $this->oldids;
@@ -137,25 +134,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        case 'fileid':
                                $ids = $this->fileids;
                                break;
+                       case 'logid':
+                               $ids = $this->logids;
+                               $logAction = 'event';
+                               break;
                        default: // bad type?
-                               return array($conds,$limit);
-               }
-               // Just get the whole log if there are a lot if items
-               if( count($ids) > $limit )
-                       return array($conds,$limit);
-               // Digit chars only
-               foreach( $ids as $id ) {
-                       if( preg_match( '/^\d+$/', $id, $m ) ) {
-                               $safeIds[] = $m[0];
-                       }
-               }
-               // Format is <id1,id2,i3...>
-               if( count($safeIds) ) {
-                       $conds[] = "log_params RLIKE '^{$this->deleteKey}.*(^|\n|,)(".implode('|',$safeIds).")(,|\n|$)'";
-               } else {
-                       $conds = array('1=0');
-               }
-               return array($conds,$limit);
+                               return array();
+               }
+               // Revision delete logs for these item
+               $conds = array( 'log_action' => $logAction );
+               $conds['ls_field'] = RevisionDeleter::getRelationType( $this->deleteKey );
+               $conds['ls_value'] = $ids;
+               $conds[] = 'log_id = ls_log_id';
+               return $conds;
        }
 
        private function secureOperation() {
@@ -1541,18 +1532,41 @@ class RevisionDeleter {
                $param, $items = array() )
        {
                // Put things hidden from sysops in the oversight log
-               $logtype = ( ($nbitfield | $obitfield) & Revision::DELETED_RESTRICTED ) ?
+               $logType = ( ($nbitfield | $obitfield) & Revision::DELETED_RESTRICTED ) ?
                        'suppress' : 'delete';
-               $log = new LogPage( $logtype );
+               // Log deletions show with a difference action message
+               $logAction = ( $param == 'logid' ) ? 'event' : 'revision';
+               // Track what items changed here
                $itemCSV = implode(',',$items);
-
+               // Add params for effected page and ids
                if( $param == 'logid' ) {
                        $params = array( $itemCSV, "ofield={$obitfield}", "nfield={$nbitfield}" );
-                       $log->addEntry( 'event', $title, $comment, $params );
                } else {
-                       // Add params for effected page and ids
                        $params = array( $param, $itemCSV, "ofield={$obitfield}", "nfield={$nbitfield}" );
-                       $log->addEntry( 'revision', $title, $comment, $params );
                }
+               // Actually add the deletion log entry
+               $log = new LogPage( $logType );
+               $logid = $log->addEntry( $logAction, $title, $comment, $params );
+               // Allow for easy searching of deletion log items for revision/log items
+               $log->addRelations( self::getRelationType($param), $items, $logid );
+       }
+       
+       // Get DB field name for URL param...
+       // Future code for other things may also track
+       // other types of revision-specific changes.
+       public static function getRelationType( $param ) {
+               switch( $param ) {
+                       case 'oldid':
+                               return 'rev_id';
+                       case 'artimestamp':
+                               return 'rev_timestamp';
+                       case 'oldimage':
+                               return 'oi_timestamp';
+                       case 'fileid':
+                               return 'file_id';
+                       case 'logid':
+                               return 'log_id';
+               }
+               throw new MWException( "Bad log URL param type!" );
        }
 }