Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
FilterUser
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
4 / 4
6
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getAuthority
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUserIdentity
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUser
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter;
4
5use MediaWiki\Permissions\Authority;
6use MediaWiki\User\UserGroupManager;
7use MediaWiki\User\UserIdentity;
8use MessageLocalizer;
9use Psr\Log\LoggerInterface;
10use User;
11
12class FilterUser {
13    public const SERVICE_NAME = 'AbuseFilterFilterUser';
14
15    /** @var MessageLocalizer */
16    private $messageLocalizer;
17    /** @var UserGroupManager */
18    private $userGroupManager;
19    /** @var LoggerInterface */
20    private $logger;
21
22    /**
23     * @param MessageLocalizer $messageLocalizer
24     * @param UserGroupManager $userGroupManager
25     * @param LoggerInterface $logger
26     */
27    public function __construct(
28        MessageLocalizer $messageLocalizer,
29        UserGroupManager $userGroupManager,
30        LoggerInterface $logger
31    ) {
32        $this->messageLocalizer = $messageLocalizer;
33        $this->userGroupManager = $userGroupManager;
34        $this->logger = $logger;
35    }
36
37    /**
38     * @return Authority
39     */
40    public function getAuthority(): Authority {
41        return $this->getUser();
42    }
43
44    /**
45     * @return UserIdentity
46     */
47    public function getUserIdentity(): UserIdentity {
48        return $this->getUser();
49    }
50
51    /**
52     * @todo Stop using the User class when User::newSystemUser is refactored.
53     * @return User
54     */
55    private function getUser(): User {
56        $username = $this->messageLocalizer->msg( 'abusefilter-blocker' )->inContentLanguage()->text();
57        $user = User::newSystemUser( $username, [ 'steal' => true ] );
58
59        if ( !$user ) {
60            // User name is invalid. Don't throw because this is a system message, easy
61            // to change and make wrong either by mistake or intentionally to break the site.
62            $this->logger->warning(
63                'The AbuseFilter user\'s name is invalid. Please change it in ' .
64                'MediaWiki:abusefilter-blocker'
65            );
66            // Use the default name to avoid breaking other stuff. This should have no harm,
67            // aside from blocks temporarily attributed to another user.
68            // Don't use the database in case the English onwiki message is broken, T284364
69            $defaultName = $this->messageLocalizer->msg( 'abusefilter-blocker' )
70                ->inLanguage( 'en' )
71                ->useDatabase( false )
72                ->text();
73            $user = User::newSystemUser( $defaultName, [ 'steal' => true ] );
74        }
75        '@phan-var User $user';
76
77        // Promote user to 'sysop' so it doesn't look
78        // like an unprivileged account is blocking users
79        if ( !in_array( 'sysop', $this->userGroupManager->getUserGroups( $user ) ) ) {
80            $this->userGroupManager->addUserToGroup( $user, 'sysop' );
81        }
82
83        return $user;
84    }
85}