mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-12-18 08:30:52 +00:00
725ec052ed
Some pieces of code were updated to use Filter objects, while other places are still to be updated. We also need to change the history part to exclude actions somehow, cleanup the ViewEdit, reduce direct DB access or anything mentioning DB fields outside of FilterLookup, etc. Change-Id: I42b7ded685db76eddd45e4b1336f9828cba811ce
228 lines
4.9 KiB
PHP
228 lines
4.9 KiB
PHP
<?php
|
|
|
|
use MediaWiki\Extension\AbuseFilter\Filter\Filter;
|
|
use MediaWiki\Extension\AbuseFilter\Filter\Flags;
|
|
use MediaWiki\Extension\AbuseFilter\Filter\LastEditInfo;
|
|
use MediaWiki\Extension\AbuseFilter\Filter\Specs;
|
|
|
|
/**
|
|
* This trait contains some Filter <-> db_row correspondences, and can be used to avoid long test
|
|
* methods.
|
|
*/
|
|
trait AbuseFilterRowsAndFiltersTestTrait {
|
|
/**
|
|
* @return array[]
|
|
*/
|
|
public function getRowsAndFilters() : array {
|
|
static $ret = null;
|
|
if ( $ret !== null ) {
|
|
return $ret;
|
|
}
|
|
$rows = [
|
|
'no actions' => (object)[
|
|
'af_id' => 42,
|
|
'af_pattern' => 'false',
|
|
'af_user' => 0,
|
|
'af_user_text' => 'FilterTester',
|
|
'af_timestamp' => '20190826000000',
|
|
'af_enabled' => 1,
|
|
'af_comments' => '',
|
|
'af_public_comments' => 'Mock filter',
|
|
'af_hidden' => 0,
|
|
'af_hit_count' => 0,
|
|
'af_throttled' => 0,
|
|
'af_deleted' => 0,
|
|
'af_actions' => '',
|
|
'af_global' => 0,
|
|
'af_group' => 'default'
|
|
],
|
|
'with actions' => (object)[
|
|
'af_id' => 163,
|
|
'af_pattern' => 'false',
|
|
'af_user' => 0,
|
|
'af_user_text' => 'FilterTester',
|
|
'af_timestamp' => '20190826000000',
|
|
'af_enabled' => 1,
|
|
'af_comments' => '',
|
|
'af_public_comments' => 'Mock filter',
|
|
'af_hidden' => 1,
|
|
'af_hit_count' => 0,
|
|
'af_throttled' => 1,
|
|
'af_deleted' => 0,
|
|
'af_actions' => 'disallow,blockautopromote',
|
|
'af_global' => 0,
|
|
'af_group' => 'default'
|
|
]
|
|
];
|
|
|
|
foreach ( $rows as $name => $row ) {
|
|
$actionKeys = $row->af_actions ? explode( ',', $row->af_actions ) : [];
|
|
$filter = new Filter(
|
|
new Specs(
|
|
$row->af_pattern,
|
|
$row->af_comments,
|
|
$row->af_public_comments,
|
|
$actionKeys,
|
|
$row->af_group
|
|
),
|
|
new Flags(
|
|
(bool)$row->af_enabled,
|
|
(bool)$row->af_deleted,
|
|
(bool)$row->af_hidden,
|
|
(bool)$row->af_global
|
|
),
|
|
array_fill_keys( $actionKeys, [] ),
|
|
new LastEditInfo(
|
|
$row->af_user,
|
|
$row->af_user_text,
|
|
$row->af_timestamp
|
|
),
|
|
$row->af_id,
|
|
$row->af_hit_count,
|
|
$row->af_throttled
|
|
);
|
|
$ret[$name] = [
|
|
'row' => $row,
|
|
'actions' => $this->getRowsForActions( $row->af_id, $actionKeys ),
|
|
'filter' => $filter
|
|
];
|
|
}
|
|
|
|
// Add special cases that cannot be generalized above
|
|
$ret = array_merge( $ret, [
|
|
'null comments and name' => [
|
|
'row' => (object)[
|
|
'af_id' => 333,
|
|
'af_pattern' => 'false',
|
|
'af_user' => 1,
|
|
'af_user_text' => 'FilterTester',
|
|
'af_timestamp' => '20190826000000',
|
|
'af_enabled' => 1,
|
|
'af_comments' => null,
|
|
'af_public_comments' => null,
|
|
'af_hidden' => 1,
|
|
'af_hit_count' => 100,
|
|
'af_throttled' => 1,
|
|
'af_deleted' => 0,
|
|
'af_actions' => 'warn',
|
|
'af_global' => 0,
|
|
'af_group' => 'default'
|
|
],
|
|
'actions' => $this->getRowsForActions( 333, [ 'warn' ] ),
|
|
'filter' => new Filter(
|
|
new Specs(
|
|
'false',
|
|
'',
|
|
'',
|
|
[ 'warn' ],
|
|
'default'
|
|
),
|
|
new Flags( true, false, true, false ),
|
|
[ 'warn' => [] ],
|
|
new LastEditInfo(
|
|
1,
|
|
'FilterTester',
|
|
'20190826000000'
|
|
),
|
|
333,
|
|
100,
|
|
1
|
|
)
|
|
],
|
|
'no hitcount and throttled' => [
|
|
'row' => (object)[
|
|
'af_id' => 1000,
|
|
'af_pattern' => '"foo"',
|
|
'af_user' => 1,
|
|
'af_user_text' => 'FilterTester',
|
|
'af_timestamp' => '20190826000000',
|
|
'af_enabled' => 0,
|
|
'af_comments' => 'foo',
|
|
'af_public_comments' => 'bar',
|
|
'af_hidden' => 1,
|
|
'af_deleted' => 1,
|
|
'af_actions' => '',
|
|
'af_global' => 1,
|
|
'af_group' => 'default'
|
|
],
|
|
'actions' => [],
|
|
'filter' => new Filter(
|
|
new Specs(
|
|
'"foo"',
|
|
'foo',
|
|
'bar',
|
|
[],
|
|
'default'
|
|
),
|
|
new Flags( false, true, true, true ),
|
|
[],
|
|
new LastEditInfo(
|
|
1,
|
|
'FilterTester',
|
|
'20190826000000'
|
|
),
|
|
1000
|
|
)
|
|
],
|
|
'pattern to trim' => [
|
|
'row' => (object)[
|
|
'af_id' => 1000,
|
|
'af_pattern' => "\n\t 0 \t\n",
|
|
'af_user' => 1,
|
|
'af_user_text' => 'FilterTester',
|
|
'af_timestamp' => '20190826000000',
|
|
'af_enabled' => 0,
|
|
'af_comments' => 'foo',
|
|
'af_public_comments' => 'bar',
|
|
'af_hidden' => 1,
|
|
'af_hit_count' => 163,
|
|
'af_throttled' => 1,
|
|
'af_deleted' => 1,
|
|
'af_actions' => '',
|
|
'af_global' => 1,
|
|
'af_group' => 'default'
|
|
],
|
|
'actions' => [],
|
|
'filter' => new Filter(
|
|
new Specs(
|
|
'0',
|
|
'foo',
|
|
'bar',
|
|
[],
|
|
'default'
|
|
),
|
|
new Flags( false, true, true, true ),
|
|
[],
|
|
new LastEditInfo(
|
|
1,
|
|
'FilterTester',
|
|
'20190826000000'
|
|
),
|
|
1000,
|
|
163,
|
|
1
|
|
)
|
|
],
|
|
] );
|
|
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* @param int $id
|
|
* @param string[] $actions
|
|
* @return stdClass[]
|
|
*/
|
|
private function getRowsForActions( int $id, array $actions ) : array {
|
|
$ret = [];
|
|
foreach ( $actions as $action ) {
|
|
$ret[] = (object)[
|
|
'afa_filter' => $id,
|
|
'afa_consequence' => $action,
|
|
'afa_parameters' => ''
|
|
];
|
|
}
|
|
return $ret;
|
|
}
|
|
}
|