public function execute() {
global $wgUser;
// Before doing anything at all, let's check permissions
- if ( !$wgUser->isAllowed( 'deletedhistory' ) ) {
+ if ( !$wgUser->isAllowed( 'deletedhistory' ) || $wgUser->isBlocked() ) {
$this->dieUsage( 'You don\'t have permission to view deleted revision information', 'permissiondenied' );
}
$titles = $pageSet->getTitles();
// This module operates in three modes:
- // 'revs': List deleted revs for certain titles
- // 'user': List deleted revs by a certain user
- // 'all': List all deleted revs
+ // 'revs': List deleted revs for certain titles (1)
+ // 'user': List deleted revs by a certain user (2)
+ // 'all': List all deleted revs in NS (3)
$mode = 'all';
if ( count( $titles ) > 0 ) {
$mode = 'revs';
$mode = 'user';
}
+ if ( $mode == 'revs' || $mode == 'user' ) {
+ // Ignore namespace and unique due to inability to know whether they were purposely set
+ foreach( array( 'from', 'to', 'prefix', /*'namespace',*/ 'continue', /*'unique'*/ ) as $p ) {
+ if ( !is_null( $params[$p] ) ) {
+ $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams');
+ }
+ }
+ } else {
+ foreach( array( 'start', 'end' ) as $p ) {
+ if ( !is_null( $params[$p] ) ) {
+ $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams');
+ }
+ }
+ }
+
if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
}
$this->addWhere( 'ar_deleted = 0' );
$this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp' ) );
- if ( $fld_parentid ) {
- $this->addFields( 'ar_parent_id' );
- }
- if ( $fld_revid ) {
- $this->addFields( 'ar_rev_id' );
- }
- if ( $fld_user ) {
- $this->addFields( 'ar_user_text' );
- }
- if ( $fld_userid ) {
- $this->addFields( 'ar_user' );
- }
- if ( $fld_comment || $fld_parsedcomment ) {
- $this->addFields( 'ar_comment' );
- }
- if ( $fld_minor ) {
- $this->addFields( 'ar_minor_edit' );
- }
- if ( $fld_len ) {
- $this->addFields( 'ar_len' );
- }
+ $this->addFieldsIf( 'ar_parent_id', $fld_parentid );
+ $this->addFieldsIf( 'ar_rev_id', $fld_revid );
+ $this->addFieldsIf( 'ar_user_text', $fld_user );
+ $this->addFieldsIf( 'ar_user', $fld_userid );
+ $this->addFieldsIf( 'ar_comment', $fld_comment || $fld_parsedcomment );
+ $this->addFieldsIf( 'ar_minor_edit', $fld_minor );
+ $this->addFieldsIf( 'ar_len', $fld_len );
+
if ( $fld_content ) {
$this->addTables( 'text' );
$this->addFields( array( 'ar_text', 'ar_text_id', 'old_text', 'old_flags' ) );
$from = is_null( $params['from'] ) ? null : $this->titleToKey( $params['from'] );
$to = is_null( $params['to'] ) ? null : $this->titleToKey( $params['to'] );
$this->addWhereRange( 'ar_title', $dir, $from, $to );
+
+ if ( isset( $params['prefix'] ) ) {
+ $this->addWhere( 'ar_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ }
}
if ( !is_null( $params['user'] ) ) {
if ( $fld_revid ) {
$rev['revid'] = intval( $row->ar_rev_id );
}
- if ( $fld_parentid ) {
+ if ( $fld_parentid && !is_null( $row->ar_parent_id ) ) {
$rev['parentid'] = intval( $row->ar_parent_id );
}
if ( $fld_user ) {
$title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
if ( $fld_parsedcomment ) {
- $rev['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->ar_comment, $title );
+ $rev['parsedcomment'] = Linker::formatComment( $row->ar_comment, $title );
}
if ( $fld_minor && $row->ar_minor_edit == 1 ) {
$rev['minor'] = '';
),
'from' => null,
'to' => null,
+ 'prefix' => null,
'continue' => null,
'unique' => false,
'user' => array(
return array(
'start' => 'The timestamp to start enumerating from (1,2)',
'end' => 'The timestamp to stop enumerating at (1,2)',
- 'dir' => $this->getDirectionDescription( $this->getModulePrefix(), ' (1,2)' ),
+ 'dir' => $this->getDirectionDescription( $this->getModulePrefix(), ' (1, 3)' ),
'from' => 'Start listing at this title (3)',
'to' => 'Stop listing at this title (3)',
+ 'prefix' => 'Search for all page titles that begin with this value (3)',
'limit' => 'The maximum amount of revisions to list',
'prop' => array(
'Which properties to get',
}
public function getDescription() {
+ $p = $this->getModulePrefix();
return array(
'List deleted revisions.',
- 'This module operates in three modes:',
- '1) List deleted revisions for the given title(s), sorted by timestamp',
- '2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
- '3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, druser not set)',
+ 'Operates in three modes:',
+ ' 1) List deleted revisions for the given title(s), sorted by timestamp',
+ ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
+ " 3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, {$p}user not set)",
'Certain parameters only apply to some modes and are ignored in others.',
'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3',
);
array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision content' ),
array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+ array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ),
+ array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ),
+ array( 'code' => 'badparams', 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" ),
+ array( 'code' => 'badparams', 'info' => "The 'continue' parameter cannot be used in modes 1 or 2" ),
+ array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ),
+ array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ),
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1):',
' api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content',
);
}
+ public function getHelpUrls() {
+ return 'http://www.mediawiki.org/wiki/API:Deletedrevs';
+ }
+
public function getVersion() {
return __CLASS__ . ': $Id$';
}