Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
52 / 52
100.00% covered (success)
100.00%
9 / 9
CRAP
100.00% covered (success)
100.00%
1 / 1
ConsequencesFactory
100.00% covered (success)
100.00%
52 / 52
100.00% covered (success)
100.00%
9 / 9
9
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
1
 newBlock
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 newRangeBlock
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 newDegroup
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 newBlockAutopromote
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 newThrottle
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 newWarn
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 newDisallow
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 newTag
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\Consequences;
4
5use BagOStuff;
6use MediaWiki\Block\BlockUserFactory;
7use MediaWiki\Block\DatabaseBlock;
8use MediaWiki\Block\DatabaseBlockStore;
9use MediaWiki\Config\ServiceOptions;
10use MediaWiki\Extension\AbuseFilter\BlockAutopromoteStore;
11use MediaWiki\Extension\AbuseFilter\ChangeTags\ChangeTagger;
12use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Block;
13use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\BlockAutopromote;
14use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Degroup;
15use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Disallow;
16use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\RangeBlock;
17use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Tag;
18use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Throttle;
19use MediaWiki\Extension\AbuseFilter\Consequences\Consequence\Warn;
20use MediaWiki\Extension\AbuseFilter\FilterUser;
21use MediaWiki\Extension\AbuseFilter\Variables\VariableHolder;
22use MediaWiki\Session\Session;
23use MediaWiki\User\UserEditTracker;
24use MediaWiki\User\UserFactory;
25use MediaWiki\User\UserGroupManager;
26use MediaWiki\User\UserNameUtils;
27use MessageLocalizer;
28use Psr\Log\LoggerInterface;
29
30class 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}