File: FilterCompare.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (72 lines) | stat: -rw-r--r-- 2,177 bytes parent folder | download | duplicates (2)
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 );
	}
}