Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
45 / 45
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
FilterRunnerFactory
100.00% covered (success)
100.00%
45 / 45
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
1
 newRunner
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter;
4
5use BagOStuff;
6use IBufferingStatsdDataFactory;
7use MediaWiki\Config\ServiceOptions;
8use MediaWiki\Extension\AbuseFilter\ChangeTags\ChangeTagger;
9use MediaWiki\Extension\AbuseFilter\Consequences\ConsequencesExecutorFactory;
10use MediaWiki\Extension\AbuseFilter\Hooks\AbuseFilterHookRunner;
11use MediaWiki\Extension\AbuseFilter\Parser\RuleCheckerFactory;
12use MediaWiki\Extension\AbuseFilter\VariableGenerator\VariableGeneratorFactory;
13use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder;
14use MediaWiki\Extension\AbuseFilter\Variables\VariablesManager;
15use MediaWiki\Extension\AbuseFilter\Watcher\EmergencyWatcher;
16use MediaWiki\Extension\AbuseFilter\Watcher\UpdateHitCountWatcher;
17use MediaWiki\Title\Title;
18use MediaWiki\User\User;
19use NullStatsdDataFactory;
20use Psr\Log\LoggerInterface;
21
22class FilterRunnerFactory {
23    public const SERVICE_NAME = 'AbuseFilterFilterRunnerFactory';
24
25    /** @var AbuseFilterHookRunner */
26    private $hookRunner;
27    /** @var FilterProfiler */
28    private $filterProfiler;
29    /** @var ChangeTagger */
30    private $changeTagger;
31    /** @var FilterLookup */
32    private $filterLookup;
33    /** @var RuleCheckerFactory */
34    private $ruleCheckerFactory;
35    /** @var ConsequencesExecutorFactory */
36    private $consExecutorFactory;
37    /** @var AbuseLoggerFactory */
38    private $abuseLoggerFactory;
39    /** @var VariablesManager */
40    private $varManager;
41    /** @var VariableGeneratorFactory */
42    private $varGeneratorFactory;
43    /** @var EmergencyCache */
44    private $emergencyCache;
45    /** @var UpdateHitCountWatcher */
46    private $updateHitCountWatcher;
47    /** @var EmergencyWatcher */
48    private $emergencyWatcher;
49    /** @var BagOStuff */
50    private $localCache;
51    /** @var LoggerInterface */
52    private $logger;
53    /** @var LoggerInterface */
54    private $editStashLogger;
55    /** @var IBufferingStatsdDataFactory */
56    private $statsdDataFactory;
57    /** @var ServiceOptions */
58    private $options;
59
60    /**
61     * @param AbuseFilterHookRunner $hookRunner
62     * @param FilterProfiler $filterProfiler
63     * @param ChangeTagger $changeTagger
64     * @param FilterLookup $filterLookup
65     * @param RuleCheckerFactory $ruleCheckerFactory
66     * @param ConsequencesExecutorFactory $consExecutorFactory
67     * @param AbuseLoggerFactory $abuseLoggerFactory
68     * @param VariablesManager $varManager
69     * @param VariableGeneratorFactory $varGeneratorFactory
70     * @param EmergencyCache $emergencyCache
71     * @param UpdateHitCountWatcher $updateHitCountWatcher
72     * @param EmergencyWatcher $emergencyWatcher
73     * @param BagOStuff $localCache
74     * @param LoggerInterface $logger
75     * @param LoggerInterface $editStashLogger
76     * @param IBufferingStatsdDataFactory $statsdDataFactory
77     * @param ServiceOptions $options
78     */
79    public function __construct(
80        AbuseFilterHookRunner $hookRunner,
81        FilterProfiler $filterProfiler,
82        ChangeTagger $changeTagger,
83        FilterLookup $filterLookup,
84        RuleCheckerFactory $ruleCheckerFactory,
85        ConsequencesExecutorFactory $consExecutorFactory,
86        AbuseLoggerFactory $abuseLoggerFactory,
87        VariablesManager $varManager,
88        VariableGeneratorFactory $varGeneratorFactory,
89        EmergencyCache $emergencyCache,
90        UpdateHitCountWatcher $updateHitCountWatcher,
91        EmergencyWatcher $emergencyWatcher,
92        BagOStuff $localCache,
93        LoggerInterface $logger,
94        LoggerInterface $editStashLogger,
95        IBufferingStatsdDataFactory $statsdDataFactory,
96        ServiceOptions $options
97    ) {
98        $this->hookRunner = $hookRunner;
99        $this->filterProfiler = $filterProfiler;
100        $this->changeTagger = $changeTagger;
101        $this->filterLookup = $filterLookup;
102        $this->ruleCheckerFactory = $ruleCheckerFactory;
103        $this->consExecutorFactory = $consExecutorFactory;
104        $this->abuseLoggerFactory = $abuseLoggerFactory;
105        $this->varManager = $varManager;
106        $this->varGeneratorFactory = $varGeneratorFactory;
107        $this->emergencyCache = $emergencyCache;
108        $this->updateHitCountWatcher = $updateHitCountWatcher;
109        $this->emergencyWatcher = $emergencyWatcher;
110        $this->localCache = $localCache;
111        $this->logger = $logger;
112        $this->editStashLogger = $editStashLogger;
113        $this->statsdDataFactory = $statsdDataFactory;
114        $this->options = $options;
115    }
116
117    /**
118     * @param User $user
119     * @param Title $title
120     * @param VariableHolder $vars
121     * @param string $group
122     * @return FilterRunner
123     */
124    public function newRunner(
125        User $user,
126        Title $title,
127        VariableHolder $vars,
128        string $group
129    ): FilterRunner {
130        // TODO Add a method to this class taking these as params? Add a hook for custom watchers
131        $watchers = [ $this->updateHitCountWatcher, $this->emergencyWatcher ];
132        return new FilterRunner(
133            $this->hookRunner,
134            $this->filterProfiler,
135            $this->changeTagger,
136            $this->filterLookup,
137            $this->ruleCheckerFactory,
138            $this->consExecutorFactory,
139            $this->abuseLoggerFactory,
140            $this->varManager,
141            $this->varGeneratorFactory,
142            $this->emergencyCache,
143            $watchers,
144            new EditStashCache(
145                $this->localCache,
146                // Bots do not use edit stashing, so avoid distorting the stats
147                $user->isBot() ? new NullStatsdDataFactory() : $this->statsdDataFactory,
148                $this->varManager,
149                $this->editStashLogger,
150                $title,
151                $group
152            ),
153            $this->logger,
154            $this->options,
155            $user,
156            $title,
157            $vars,
158            $group
159        );
160    }
161}