Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.97% covered (success)
96.97%
32 / 33
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
BlockingConsequence
96.97% covered (success)
96.97%
32 / 33
50.00% covered (danger)
50.00%
1 / 2
5
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 doBlockInternal
96.30% covered (success)
96.30%
26 / 27
0.00% covered (danger)
0.00%
0 / 1
4
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\Consequences\Consequence;
4
5use LogPage;
6use MediaWiki\Block\BlockUserFactory;
7use MediaWiki\Extension\AbuseFilter\Consequences\Parameters;
8use MediaWiki\Extension\AbuseFilter\FilterUser;
9use MediaWiki\Status\Status;
10use MessageLocalizer;
11use Psr\Log\LoggerInterface;
12use Wikimedia\IPUtils;
13
14/**
15 * Base class for consequences that block a user
16 */
17abstract class BlockingConsequence extends Consequence implements HookAborterConsequence {
18    /** @var BlockUserFactory */
19    private $blockUserFactory;
20
21    /** @var FilterUser */
22    protected $filterUser;
23
24    /** @var MessageLocalizer */
25    private $messageLocalizer;
26
27    /** @var LoggerInterface */
28    private $logger;
29
30    /** @var string Expiry of the block */
31    protected $expiry;
32
33    /**
34     * @param Parameters $params
35     * @param string $expiry
36     * @param BlockUserFactory $blockUserFactory
37     * @param FilterUser $filterUser
38     * @param MessageLocalizer $messageLocalizer
39     * @param LoggerInterface $logger
40     */
41    public function __construct(
42        Parameters $params,
43        string $expiry,
44        BlockUserFactory $blockUserFactory,
45        FilterUser $filterUser,
46        MessageLocalizer $messageLocalizer,
47        LoggerInterface $logger
48    ) {
49        parent::__construct( $params );
50        $this->expiry = $expiry;
51        $this->blockUserFactory = $blockUserFactory;
52        $this->filterUser = $filterUser;
53        $this->messageLocalizer = $messageLocalizer;
54        $this->logger = $logger;
55    }
56
57    /**
58     * Perform a block by the AbuseFilter system user
59     * @param string $ruleDesc
60     * @param int|string $ruleNumber
61     * @param string $target
62     * @param string $expiry
63     * @param bool $isAutoBlock
64     * @param bool $preventEditOwnUserTalk
65     * @return Status
66     */
67    protected function doBlockInternal(
68        string $ruleDesc,
69        $ruleNumber,
70        string $target,
71        string $expiry,
72        bool $isAutoBlock,
73        bool $preventEditOwnUserTalk
74    ): Status {
75        $reason = $this->messageLocalizer->msg(
76            'abusefilter-blockreason',
77            $ruleDesc,
78            $ruleNumber
79        )->inContentLanguage()->text();
80
81        $blockUser = $this->blockUserFactory->newBlockUser(
82            $target,
83            $this->filterUser->getAuthority(),
84            $expiry,
85            $reason,
86            [
87                'isHardBlock' => false,
88                'isAutoblocking' => $isAutoBlock,
89                'isCreateAccountBlocked' => true,
90                'isUserTalkEditBlocked' => $preventEditOwnUserTalk
91            ]
92        );
93        if (
94            strpos( $this->parameters->getAction(), 'createaccount' ) !== false &&
95            IPUtils::isIPAddress( $target )
96        ) {
97            $blockUser->setLogDeletionFlags( LogPage::SUPPRESSED_ACTION );
98        }
99        $status = $blockUser->placeBlockUnsafe();
100        if ( !$status->isGood() ) {
101            $this->logger->warning(
102                'AbuseFilter block to {block_target} failed: {errors}',
103                [ 'block_target' => $target, 'errors' => $status->__toString() ]
104            );
105        }
106        return $status;
107    }
108}