Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
52 / 52 |
|
100.00% |
9 / 9 |
CRAP | |
100.00% |
1 / 1 |
ConsequencesFactory | |
100.00% |
52 / 52 |
|
100.00% |
9 / 9 |
9 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
15 / 15 |
|
100.00% |
1 / 1 |
1 | |||
newBlock | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
1 | |||
newRangeBlock | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
1 | |||
newDegroup | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
newBlockAutopromote | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
newThrottle | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
1 | |||
newWarn | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
newDisallow | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
newTag | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\AbuseFilter\Consequences; |
4 | |
5 | use BagOStuff; |
6 | use MediaWiki\Block\BlockUserFactory; |
7 | use MediaWiki\Block\DatabaseBlock; |
8 | use MediaWiki\Block\DatabaseBlockStore; |
9 | use MediaWiki\Config\ServiceOptions; |
10 | use MediaWiki\Extension\AbuseFilter\BlockAutopromoteStore; |
11 | use MediaWiki\Extension\AbuseFilter\ChangeTags\ChangeTagger; |
12 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Block; |
13 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\BlockAutopromote; |
14 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Degroup; |
15 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Disallow; |
16 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\RangeBlock; |
17 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Tag; |
18 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Throttle; |
19 | use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Warn; |
20 | use MediaWiki\Extension\AbuseFilter\FilterUser; |
21 | use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder; |
22 | use MediaWiki\Session\Session; |
23 | use MediaWiki\User\UserEditTracker; |
24 | use MediaWiki\User\UserFactory; |
25 | use MediaWiki\User\UserGroupManager; |
26 | use MediaWiki\User\UserNameUtils; |
27 | use MessageLocalizer; |
28 | use Psr\Log\LoggerInterface; |
29 | |
30 | class ConsequencesFactory { |
31 | public const SERVICE_NAME = 'AbuseFilterConsequencesFactory'; |
32 | |
33 | public const CONSTRUCTOR_OPTIONS = [ |
34 | 'AbuseFilterCentralDB', |
35 | 'AbuseFilterIsCentral', |
36 | 'AbuseFilterRangeBlockSize', |
37 | 'BlockCIDRLimit', |
38 | ]; |
39 | |
40 | /** @var ServiceOptions */ |
41 | private $options; |
42 | |
43 | /** @var LoggerInterface */ |
44 | private $logger; |
45 | |
46 | /** @var BlockUserFactory */ |
47 | private $blockUserFactory; |
48 | |
49 | /** @var DatabaseBlockStore */ |
50 | private $databaseBlockStore; |
51 | |
52 | /** @var UserGroupManager */ |
53 | private $userGroupManager; |
54 | |
55 | /** @var BagOStuff */ |
56 | private $mainStash; |
57 | |
58 | /** @var ChangeTagger */ |
59 | private $changeTagger; |
60 | |
61 | /** @var BlockAutopromoteStore */ |
62 | private $blockAutopromoteStore; |
63 | |
64 | /** @var FilterUser */ |
65 | private $filterUser; |
66 | |
67 | /** @var Session */ |
68 | private $session; |
69 | |
70 | /** @var MessageLocalizer */ |
71 | private $messageLocalizer; |
72 | |
73 | /** @var UserEditTracker */ |
74 | private $userEditTracker; |
75 | |
76 | /** @var UserFactory */ |
77 | private $userFactory; |
78 | |
79 | /** @var UserNameUtils */ |
80 | private $userNameUtils; |
81 | |
82 | /** |
83 | * @todo This might drag in unwanted dependencies. The alternative is to use ObjectFactory, but that's harder |
84 | * to understand for humans and static analysis tools, so do that only if the dependencies list starts growing. |
85 | * @param ServiceOptions $options |
86 | * @param LoggerInterface $logger |
87 | * @param BlockUserFactory $blockUserFactory |
88 | * @param DatabaseBlockStore $databaseBlockStore |
89 | * @param UserGroupManager $userGroupManager |
90 | * @param BagOStuff $mainStash |
91 | * @param ChangeTagger $changeTagger |
92 | * @param BlockAutopromoteStore $blockAutopromoteStore |
93 | * @param FilterUser $filterUser |
94 | * @param Session $session |
95 | * @param MessageLocalizer $messageLocalizer |
96 | * @param UserEditTracker $userEditTracker |
97 | * @param UserFactory $userFactory |
98 | * @param UserNameUtils $userNameUtils |
99 | */ |
100 | public function __construct( |
101 | ServiceOptions $options, |
102 | LoggerInterface $logger, |
103 | BlockUserFactory $blockUserFactory, |
104 | DatabaseBlockStore $databaseBlockStore, |
105 | UserGroupManager $userGroupManager, |
106 | BagOStuff $mainStash, |
107 | ChangeTagger $changeTagger, |
108 | BlockAutopromoteStore $blockAutopromoteStore, |
109 | FilterUser $filterUser, |
110 | Session $session, |
111 | MessageLocalizer $messageLocalizer, |
112 | UserEditTracker $userEditTracker, |
113 | UserFactory $userFactory, |
114 | UserNameUtils $userNameUtils |
115 | ) { |
116 | $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS ); |
117 | $this->options = $options; |
118 | $this->logger = $logger; |
119 | $this->blockUserFactory = $blockUserFactory; |
120 | $this->databaseBlockStore = $databaseBlockStore; |
121 | $this->userGroupManager = $userGroupManager; |
122 | $this->mainStash = $mainStash; |
123 | $this->changeTagger = $changeTagger; |
124 | $this->blockAutopromoteStore = $blockAutopromoteStore; |
125 | $this->filterUser = $filterUser; |
126 | $this->session = $session; |
127 | $this->messageLocalizer = $messageLocalizer; |
128 | $this->userEditTracker = $userEditTracker; |
129 | $this->userFactory = $userFactory; |
130 | $this->userNameUtils = $userNameUtils; |
131 | } |
132 | |
133 | // Each class has its factory method for better type inference and static analysis |
134 | |
135 | /** |
136 | * @param Parameters $params |
137 | * @param string $expiry |
138 | * @param bool $preventsTalk |
139 | * @return Block |
140 | */ |
141 | public function newBlock( Parameters $params, string $expiry, bool $preventsTalk ): Block { |
142 | return new Block( |
143 | $params, |
144 | $expiry, |
145 | $preventsTalk, |
146 | $this->blockUserFactory, |
147 | $this->databaseBlockStore, |
148 | // FIXME This is a hack until DI is possible here (T255433). |
149 | [ DatabaseBlock::class, 'newFromTarget' ], |
150 | $this->filterUser, |
151 | $this->messageLocalizer, |
152 | $this->logger |
153 | ); |
154 | } |
155 | |
156 | /** |
157 | * @param Parameters $params |
158 | * @param string $expiry |
159 | * @return RangeBlock |
160 | */ |
161 | public function newRangeBlock( Parameters $params, string $expiry ): RangeBlock { |
162 | return new RangeBlock( |
163 | $params, |
164 | $expiry, |
165 | $this->blockUserFactory, |
166 | $this->filterUser, |
167 | $this->messageLocalizer, |
168 | $this->logger, |
169 | $this->options->get( 'AbuseFilterRangeBlockSize' ), |
170 | $this->options->get( 'BlockCIDRLimit' ) |
171 | ); |
172 | } |
173 | |
174 | /** |
175 | * @param Parameters $params |
176 | * @param VariableHolder $vars |
177 | * @return Degroup |
178 | */ |
179 | public function newDegroup( Parameters $params, VariableHolder $vars ): Degroup { |
180 | return new Degroup( $params, $vars, $this->userGroupManager, $this->filterUser, $this->messageLocalizer ); |
181 | } |
182 | |
183 | /** |
184 | * @param Parameters $params |
185 | * @param int $duration |
186 | * @return BlockAutopromote |
187 | */ |
188 | public function newBlockAutopromote( Parameters $params, int $duration ): BlockAutopromote { |
189 | return new BlockAutopromote( $params, $duration, $this->blockAutopromoteStore, $this->messageLocalizer, |
190 | $this->userNameUtils ); |
191 | } |
192 | |
193 | /** |
194 | * @param Parameters $params |
195 | * @param array $throttleParams |
196 | * @phan-param array{id:int|string,count:int,period:int,groups:string[]} $throttleParams |
197 | * @return Throttle |
198 | */ |
199 | public function newThrottle( Parameters $params, array $throttleParams ): Throttle { |
200 | return new Throttle( |
201 | $params, |
202 | $throttleParams, |
203 | $this->mainStash, |
204 | $this->userEditTracker, |
205 | $this->userFactory, |
206 | $this->logger, |
207 | $this->options->get( 'AbuseFilterIsCentral' ), |
208 | $this->options->get( 'AbuseFilterCentralDB' ) |
209 | ); |
210 | } |
211 | |
212 | /** |
213 | * @param Parameters $params |
214 | * @param string $message |
215 | * @return Warn |
216 | */ |
217 | public function newWarn( Parameters $params, string $message ): Warn { |
218 | return new Warn( $params, $message, $this->session ); |
219 | } |
220 | |
221 | /** |
222 | * @param Parameters $params |
223 | * @param string $message |
224 | * @return Disallow |
225 | */ |
226 | public function newDisallow( Parameters $params, string $message ): Disallow { |
227 | return new Disallow( $params, $message ); |
228 | } |
229 | |
230 | /** |
231 | * @param Parameters $params |
232 | * @param string[] $tags |
233 | * @return Tag |
234 | */ |
235 | public function newTag( Parameters $params, array $tags ): Tag { |
236 | return new Tag( $params, $tags, $this->changeTagger ); |
237 | } |
238 | } |