Merge "Made LinksUpdate::updateLinksTimestamp() use a more correct timestamp"
[lhc/web/wiklou.git] / includes / api / ApiQueryLogEvents.php
index 14364cb..1578775 100644 (file)
@@ -72,7 +72,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        'page' => array( 'LEFT JOIN',
                                array( 'log_namespace=page_namespace',
                                        'log_title=page_title' ) ) ) );
-               $index = array( 'logging' => 'times' ); // default, may change
 
                $this->addFields( array(
                        'log_type',
@@ -110,7 +109,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhereFld( 'log_action', $action );
                } elseif ( !is_null( $params['type'] ) ) {
                        $this->addWhereFld( 'log_type', $params['type'] );
-                       $index['logging'] = 'type_time';
                }
 
                $this->addTimestampWhereRange(
@@ -126,11 +124,11 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $user = $params['user'];
                if ( !is_null( $user ) ) {
                        $userid = User::idFromName( $user );
-                       if ( !$userid ) {
-                               $this->dieUsage( "User name $user not found", 'param_user' );
+                       if ( $userid ) {
+                               $this->addWhereFld( 'log_user', $userid );
+                       } else {
+                               $this->addWhereFld( 'log_user_text', IP::sanitizeIP( $user ) );
                        }
-                       $this->addWhereFld( 'log_user', $userid );
-                       $index['logging'] = 'user_time';
                }
 
                $title = $params['title'];
@@ -141,9 +139,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
                        $this->addWhereFld( 'log_namespace', $titleObj->getNamespace() );
                        $this->addWhereFld( 'log_title', $titleObj->getDBkey() );
-
-                       // Use the title index in preference to the user index if there is a conflict
-                       $index['logging'] = is_null( $user ) ? 'page_time' : array( 'page_time', 'user_time' );
                }
 
                $prefix = $params['prefix'];
@@ -162,14 +157,24 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
                }
 
-               $this->addOption( 'USE INDEX', $index );
-
                // Paranoia: avoid brute force searches (bug 17342)
-               if ( !is_null( $title ) ) {
-                       $this->addWhere( $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0' );
-               }
-               if ( !is_null( $user ) ) {
-                       $this->addWhere( $db->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0' );
+               if ( !is_null( $title ) || !is_null( $user ) ) {
+                       if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                               $titleBits = LogPage::DELETED_ACTION;
+                               $userBits = LogPage::DELETED_USER;
+                       } elseif ( !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                               $titleBits = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
+                               $userBits = LogPage::DELETED_USER | LogPage::DELETED_RESTRICTED;
+                       } else {
+                               $titleBits = 0;
+                               $userBits = 0;
+                       }
+                       if ( !is_null( $title ) && $titleBits ) {
+                               $this->addWhere( $db->bitAnd( 'log_deleted', $titleBits ) . " != $titleBits" );
+                       }
+                       if ( !is_null( $user ) && $userBits ) {
+                               $this->addWhere( $db->bitAnd( 'log_deleted', $userBits ) . " != $userBits" );
+                       }
                }
 
                $count = 0;
@@ -303,21 +308,40 @@ class ApiQueryLogEvents extends ApiQueryBase {
        private function extractRowInfo( $row ) {
                $logEntry = DatabaseLogEntry::newFromRow( $row );
                $vals = array();
+               $anyHidden = false;
+               $user = $this->getUser();
 
                if ( $this->fld_ids ) {
                        $vals['logid'] = intval( $row->log_id );
-                       $vals['pageid'] = intval( $row->page_id );
                }
 
                if ( $this->fld_title || $this->fld_parsedcomment ) {
                        $title = Title::makeTitle( $row->log_namespace, $row->log_title );
                }
 
-               if ( $this->fld_title ) {
+               if ( $this->fld_title || $this->fld_ids || $this->fld_details && $row->log_params !== '' ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
                                $vals['actionhidden'] = '';
-                       } else {
-                               ApiQueryBase::addTitleInfo( $vals, $title );
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_ACTION, $user ) ) {
+                               if ( $this->fld_title ) {
+                                       ApiQueryBase::addTitleInfo( $vals, $title );
+                               }
+                               if ( $this->fld_ids ) {
+                                       $vals['pageid'] = intval( $row->page_id );
+                               }
+                               if ( $this->fld_details && $row->log_params !== '' ) {
+                                       self::addLogParams(
+                                               $this->getResult(),
+                                               $vals,
+                                               $logEntry->getParameters(),
+                                               $logEntry->getType(),
+                                               $logEntry->getSubtype(),
+                                               $logEntry->getTimestamp(),
+                                               $logEntry->isLegacy()
+                                       );
+                               }
                        }
                }
 
@@ -326,26 +350,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $vals['action'] = $row->log_action;
                }
 
-               if ( $this->fld_details && $row->log_params !== '' ) {
-                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
-                               $vals['actionhidden'] = '';
-                       } else {
-                               self::addLogParams(
-                                       $this->getResult(),
-                                       $vals,
-                                       $logEntry->getParameters(),
-                                       $logEntry->getType(),
-                                       $logEntry->getSubtype(),
-                                       $logEntry->getTimestamp(),
-                                       $logEntry->isLegacy()
-                               );
-                       }
-               }
-
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
                                $vals['userhidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_USER, $user ) ) {
                                if ( $this->fld_user ) {
                                        $vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
                                }
@@ -365,7 +375,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->log_comment ) ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = '';
-                       } else {
+                               $anyHidden = true;
+                       }
+                       if ( LogEventsList::userCan( $row, LogPage::DELETED_COMMENT, $user ) ) {
                                if ( $this->fld_comment ) {
                                        $vals['comment'] = $row->log_comment;
                                }
@@ -386,10 +398,17 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
                }
 
+               if ( $anyHidden && LogEventsList::isDeleted( $row, LogPage::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
+               }
+
                return $vals;
        }
 
        public function getCacheMode( $params ) {
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';