From 167d11a8c3aa0dce72cfa5521ab127a498bd187f Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Thu, 5 Feb 2009 11:44:10 +0000 Subject: [PATCH] * API: Listing (semi-)deleted revisions and log entries (with rev_/log_deleted != 0) as well in prop=revisions and list=logevents, with commenthidden/userhidden/actionhidden/texthidden flags where appropriate * Still honors the paranoia checks added in r46807 * Use $index consistently in ApiQueryLogEvents * Some whitespace consistency --- RELEASE-NOTES | 2 ++ includes/api/ApiPageSet.php | 6 ++-- includes/api/ApiQueryLogEvents.php | 49 +++++++++++++++++++++--------- includes/api/ApiQueryRevisions.php | 38 +++++++++++++++-------- 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 1715468ebd..8de4829be1 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -163,6 +163,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * (bug 17007) Added action=import * BREAKING CHANGE: Removed rctitles parameter from list=recentchanges because of performance concerns +* Listing (semi-)deleted revisions and log entries as well in prop=revisions and + list=logevents === Languages updated in 1.15 === diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index b6b43cb90f..a9724d3902 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -457,9 +457,9 @@ class ApiPageSet extends ApiQueryBase { $pageids = array(); $remaining = array_flip($revids); - $tables = array('revision','page'); - $fields = array('rev_id','rev_page'); - $where = array('rev_deleted' => 0, 'rev_id' => $revids,'rev_page = page_id'); + $tables = array('revision', 'page'); + $fields = array('rev_id', 'rev_page'); + $where = array('rev_id' => $revids, 'rev_page = page_id'); // Get pageIDs data from the `page` table $this->profileDBIn(); diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index beb2963e86..f745894e1e 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -65,12 +65,13 @@ class ApiQueryLogEvents extends ApiQueryBase { array( 'log_namespace=page_namespace', 'log_title=page_title')))); $this->addWhere('user_id=log_user'); - $this->addOption('USE INDEX', array('logging' => 'times')); // default, may change + $index = 'times'; // default, may change $this->addFields(array ( 'log_type', 'log_action', 'log_timestamp', + 'log_deleted', )); $this->addFieldsIf('log_id', $this->fld_ids); @@ -81,12 +82,10 @@ class ApiQueryLogEvents extends ApiQueryBase { $this->addFieldsIf('log_title', $this->fld_title); $this->addFieldsIf('log_comment', $this->fld_comment); $this->addFieldsIf('log_params', $this->fld_details); - - $this->addWhereFld('log_deleted', 0); if( !is_null($params['type']) ) { $this->addWhereFld('log_type', $params['type']); - $this->addOption('USE INDEX', array('logging' => array('type_time'))); + $index = 'type_time'; } $this->addWhereRange('log_timestamp', $params['dir'], $params['start'], $params['end']); @@ -118,7 +117,13 @@ class ApiQueryLogEvents extends ApiQueryBase { if ( $index ) { $this->addOption( 'USE INDEX', array( 'logging' => $index ) ); } - + // Paranoia: avoid brute force searches (bug 17342) + if (!is_null($title) || !is_null($params['type'])) { + $this->addWhere('log_deleted & ' . LogPage::DELETED_ACTION . ' = 0'); + } + if (!is_null($user)) { + $this->addWhere('log_deleted & ' . LogPage::DELETED_USER . ' = 0'); + } $data = array (); $count = 0; @@ -196,26 +201,42 @@ class ApiQueryLogEvents extends ApiQueryBase { } if ($this->fld_type) { - $vals['type'] = $row->log_type; - $vals['action'] = $row->log_action; + if (LogEventsList::isDeleted($row, LogPage::DELETED_ACTION)) { + $vals['actionhidden'] = ''; + } else { + $vals['type'] = $row->log_type; + $vals['action'] = $row->log_action; + } } if ($this->fld_details && $row->log_params !== '') { - self::addLogParams($this->getResult(), $vals, - $row->log_params, $row->log_type, - $row->log_timestamp); + if (LogEventsList::isDeleted($row, LogPage::DELETED_ACTION)) { + $vals['actionhidden'] = ''; + } else { + self::addLogParams($this->getResult(), $vals, + $row->log_params, $row->log_type, + $row->log_timestamp); + } } if ($this->fld_user) { - $vals['user'] = $row->user_name; - if(!$row->log_user) - $vals['anon'] = ''; + if (LogEventsList::isDeleted($row, LogPage::DELETED_USER)) { + $vals['userhidden'] = ''; + } else { + $vals['user'] = $row->user_name; + if(!$row->log_user) + $vals['anon'] = ''; + } } if ($this->fld_timestamp) { $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->log_timestamp); } if ($this->fld_comment && isset($row->log_comment)) { - $vals['comment'] = $row->log_comment; + if (LogEventsList::isDeleted($row, LogPage::DELETED_COMMENT)) { + $vals['commenthidden'] = ''; + } else { + $vals['comment'] = $row->log_comment; + } } return $vals; diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index af2afdc873..258f460f34 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -101,8 +101,8 @@ class ApiQueryRevisions extends ApiQueryBase { $this->dieUsage('titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, user, excludeuser, start and end parameters may only be used on a single page.', 'multpages'); $this->addTables('revision'); - $this->addFields( Revision::selectFields() ); - $this->addTables( 'page' ); + $this->addFields(Revision::selectFields()); + $this->addTables('page'); $this->addWhere('page_id = rev_page'); $prop = array_flip($params['prop']); @@ -134,7 +134,7 @@ class ApiQueryRevisions extends ApiQueryBase { $this->addTables('text'); $this->addWhere('rev_text_id=old_id'); $this->addFields('old_id'); - $this->addFields( Revision::selectTextFields() ); + $this->addFields(Revision::selectTextFields()); $this->fld_content = true; @@ -190,10 +190,14 @@ class ApiQueryRevisions extends ApiQueryBase { if(!is_null($params['user'])) { $this->addWhereFld('rev_user_text', $params['user']); - } elseif (!is_null( $params['excludeuser'])) { + } elseif (!is_null($params['excludeuser'])) { $this->addWhere('rev_user_text != ' . $this->getDB()->addQuotes($params['excludeuser'])); } + if(!is_null($params['user']) || !is_null($params['excludeuser'])) { + // Paranoia: avoid brute force searches (bug 17342) + $this->addWhere('rev_deleted & ' . Revision::DELETED_USER . ' = 0'); + } } elseif ($revCount > 0) { $max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax; @@ -280,9 +284,13 @@ class ApiQueryRevisions extends ApiQueryBase { $vals['minor'] = ''; if ($this->fld_user) { - $vals['user'] = $revision->getUserText(); - if (!$revision->getUser()) - $vals['anon'] = ''; + if ($revision->isDeleted(Revision::DELETED_USER)) { + $vals['userhidden'] = ''; + } else { + $vals['user'] = $revision->getUserText(); + if (!$revision->getUser()) + $vals['anon'] = ''; + } } if ($this->fld_timestamp) { @@ -294,9 +302,13 @@ class ApiQueryRevisions extends ApiQueryBase { } if ($this->fld_comment) { - $comment = $revision->getComment(); - if (strval($comment) !== '') - $vals['comment'] = $comment; + if ($revision->isDeleted(Revision::DELETED_COMMENT)) { + $vals['commenthidden'] = ''; + } else { + $comment = $revision->getComment(); + if (strval($comment) !== '') + $vals['comment'] = $comment; + } } if(!is_null($this->token) || ($this->fld_content && $this->expandTemplates)) @@ -314,8 +326,8 @@ class ApiQueryRevisions extends ApiQueryBase { $vals[$t . 'token'] = $val; } } - - if ($this->fld_content) { + + if ($this->fld_content && !$revision->isDeleted(Revision::DELETED_TEXT)) { global $wgParser; $text = $revision->getText(); # Expand templates after getting section content because @@ -341,6 +353,8 @@ class ApiQueryRevisions extends ApiQueryBase { $text = $wgParser->preprocess( $text, $title, new ParserOptions() ); } ApiResult :: setContent($vals, $text); + } else if ($this->fld_content) { + $vals['texthidden'] = ''; } return $vals; } -- 2.20.1