mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-11-15 18:19:38 +00:00
2026e3ac3a
This service should act as a mediator between the AF code and the permission manager, and it should know what are the permissions required by each action. Change-Id: Ieb177d9992147b11fa7b8f05929da6c182cc2286
132 lines
2.7 KiB
PHP
132 lines
2.7 KiB
PHP
<?php
|
|
|
|
use MediaWiki\Cache\LinkBatchFactory;
|
|
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
|
|
use Wikimedia\Rdbms\IResultWrapper;
|
|
|
|
class AbuseLogPager extends ReverseChronologicalPager {
|
|
/**
|
|
* @var SpecialAbuseLog
|
|
*/
|
|
public $mForm;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
public $mConds;
|
|
|
|
/** @var LinkBatchFactory */
|
|
private $linkBatchFactory;
|
|
|
|
/** @var bool */
|
|
private $joinWithArchive;
|
|
|
|
/**
|
|
* @param SpecialAbuseLog $form
|
|
* @param array $conds
|
|
* @param LinkBatchFactory $linkBatchFactory
|
|
* @param bool $joinWithArchive
|
|
*/
|
|
public function __construct(
|
|
SpecialAbuseLog $form,
|
|
array $conds,
|
|
LinkBatchFactory $linkBatchFactory,
|
|
bool $joinWithArchive = false
|
|
) {
|
|
parent::__construct( $form->getContext(), $form->getLinkRenderer() );
|
|
$this->mForm = $form;
|
|
$this->mConds = $conds;
|
|
$this->linkBatchFactory = $linkBatchFactory;
|
|
$this->joinWithArchive = $joinWithArchive;
|
|
}
|
|
|
|
/**
|
|
* @param object $row
|
|
* @return string
|
|
*/
|
|
public function formatRow( $row ) {
|
|
return $this->mForm->formatRow( $row );
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getQueryInfo() {
|
|
$afPermManager = AbuseFilterServices::getPermissionManager();
|
|
$conds = $this->mConds;
|
|
|
|
$info = [
|
|
'tables' => [ 'abuse_filter_log', 'abuse_filter', 'revision' ],
|
|
'fields' => [
|
|
$this->mDb->tableName( 'abuse_filter_log' ) . '.*',
|
|
$this->mDb->tableName( 'abuse_filter' ) . '.*',
|
|
'rev_id',
|
|
],
|
|
'conds' => $conds,
|
|
'join_conds' => [
|
|
'abuse_filter' => [
|
|
'LEFT JOIN',
|
|
'af_id=afl_filter',
|
|
],
|
|
'revision' => [
|
|
'LEFT JOIN',
|
|
[
|
|
'afl_wiki IS NULL',
|
|
'afl_rev_id IS NOT NULL',
|
|
'rev_id=afl_rev_id',
|
|
]
|
|
],
|
|
],
|
|
];
|
|
|
|
if ( $this->joinWithArchive ) {
|
|
$info['tables'][] = 'archive';
|
|
$info['fields'][] = 'ar_timestamp';
|
|
$info['join_conds']['archive'] = [
|
|
'LEFT JOIN',
|
|
[
|
|
'afl_wiki IS NULL',
|
|
'afl_rev_id IS NOT NULL',
|
|
'rev_id IS NULL',
|
|
'ar_rev_id=afl_rev_id',
|
|
]
|
|
];
|
|
}
|
|
|
|
if ( !$afPermManager->canSeeHiddenLogEntries( $this->getUser() ) ) {
|
|
$info['conds']['afl_deleted'] = 0;
|
|
}
|
|
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* @param IResultWrapper $result
|
|
*/
|
|
protected function preprocessResults( $result ) {
|
|
if ( $this->getNumRows() === 0 ) {
|
|
return;
|
|
}
|
|
|
|
$lb = $this->linkBatchFactory->newLinkBatch();
|
|
$lb->setCaller( __METHOD__ );
|
|
foreach ( $result as $row ) {
|
|
// Only for local wiki results
|
|
if ( !$row->afl_wiki ) {
|
|
$lb->add( $row->afl_namespace, $row->afl_title );
|
|
$lb->add( NS_USER, $row->afl_user );
|
|
$lb->add( NS_USER_TALK, $row->afl_user_text );
|
|
}
|
|
}
|
|
$lb->execute();
|
|
$result->seek( 0 );
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getIndexField() {
|
|
return 'afl_timestamp';
|
|
}
|
|
}
|