1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
<?php
namespace MediaWiki\Extension\AbuseFilter;
use MediaWiki\Extension\AbuseFilter\Consequences\ConsequencesRegistry;
use MediaWiki\Extension\AbuseFilter\Filter\Filter;
/**
* This service allows comparing two versions of a filter.
* @todo We might want to expand this to cover the use case of ViewDiff
* @internal
*/
class FilterCompare {
public const SERVICE_NAME = 'AbuseFilterFilterCompare';
/** @var ConsequencesRegistry */
private $consequencesRegistry;
/**
* @param ConsequencesRegistry $consequencesRegistry
*/
public function __construct( ConsequencesRegistry $consequencesRegistry ) {
$this->consequencesRegistry = $consequencesRegistry;
}
/**
* @param Filter $firstFilter
* @param Filter $secondFilter
* @return array Fields that are different
*/
public function compareVersions( Filter $firstFilter, Filter $secondFilter ): array {
// TODO: Avoid DB references here, re-add when saving the filter
$methods = [
'af_public_comments' => 'getName',
'af_pattern' => 'getRules',
'af_comments' => 'getComments',
'af_deleted' => 'isDeleted',
'af_enabled' => 'isEnabled',
'af_hidden' => 'getPrivacyLevel',
'af_global' => 'isGlobal',
'af_group' => 'getGroup',
];
$differences = [];
foreach ( $methods as $field => $method ) {
if ( $firstFilter->$method() !== $secondFilter->$method() ) {
$differences[] = $field;
}
}
$firstActions = $firstFilter->getActions();
$secondActions = $secondFilter->getActions();
foreach ( $this->consequencesRegistry->getAllEnabledActionNames() as $action ) {
if ( !isset( $firstActions[$action] ) && !isset( $secondActions[$action] ) ) {
// They're both unset
} elseif ( isset( $firstActions[$action] ) && isset( $secondActions[$action] ) ) {
// They're both set. Double check needed, e.g. per T180194
if ( array_diff( $firstActions[$action], $secondActions[$action] ) ||
array_diff( $secondActions[$action], $firstActions[$action] ) ) {
// Different parameters
$differences[] = 'actions';
}
} else {
// One's unset, one's set.
$differences[] = 'actions';
}
}
return array_unique( $differences );
}
}
|