Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.04% covered (success)
98.04%
50 / 51
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
ContributionsHandler
98.04% covered (success)
98.04%
50 / 51
50.00% covered (danger)
50.00%
1 / 2
10
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
 onContribsPager__getQueryInfo
97.78% covered (success)
97.78%
44 / 45
0.00% covered (danger)
0.00%
0 / 1
9
1<?php
2
3namespace MediaWiki\CheckUser\HookHandler;
4
5use MediaWiki\CheckUser\Services\CheckUserLookupUtils;
6use MediaWiki\Config\Config;
7use MediaWiki\Hook\ContribsPager__getQueryInfoHook;
8use MediaWiki\Permissions\PermissionManager;
9use MediaWiki\User\Options\UserOptionsLookup;
10use MediaWiki\User\TempUser\TempUserConfig;
11use Wikimedia\IPUtils;
12use Wikimedia\Rdbms\IConnectionProvider;
13use Wikimedia\Rdbms\IExpression;
14
15class ContributionsHandler implements ContribsPager__getQueryInfoHook {
16    private Config $config;
17    private PermissionManager $permissionManager;
18    private IConnectionProvider $dbProvider;
19    private TempUserConfig $tempUserConfig;
20    private UserOptionsLookup $userOptionsLookup;
21    private CheckUserLookupUtils $checkUserLookupUtils;
22
23    /**
24     * @param Config $config
25     * @param PermissionManager $permissionManager
26     * @param IConnectionProvider $dbProvider
27     * @param TempUserConfig $tempUserConfig
28     * @param UserOptionsLookup $userOptionsLookup
29     * @param CheckUserLookupUtils $checkUserLookupUtils
30     */
31    public function __construct(
32        Config $config,
33        PermissionManager $permissionManager,
34        IConnectionProvider $dbProvider,
35        TempUserConfig $tempUserConfig,
36        UserOptionsLookup $userOptionsLookup,
37        CheckUserLookupUtils $checkUserLookupUtils
38    ) {
39        $this->config = $config;
40        $this->permissionManager = $permissionManager;
41        $this->dbProvider = $dbProvider;
42        $this->tempUserConfig = $tempUserConfig;
43        $this->userOptionsLookup = $userOptionsLookup;
44        $this->checkUserLookupUtils = $checkUserLookupUtils;
45    }
46
47    /**
48     * @inheritDoc
49     */
50    public function onContribsPager__getQueryInfo( $pager, &$queryInfo ) {
51        if ( !$this->tempUserConfig->isEnabled() ) {
52            return;
53        }
54
55        $target = $pager->getTarget();
56        if ( !IPUtils::isValid( $target ) ) {
57            // TODO: Handle ranges and change isValid to isIPAddress: T361867
58            return;
59        }
60
61        $user = $pager->getUser();
62        if (
63            !$this->permissionManager->userHasRight(
64                $user,
65                'checkuser-temporary-account-no-preference'
66            ) &&
67            (
68                !$this->permissionManager->userHasRight(
69                    $user,
70                    'checkuser-temporary-account'
71                ) ||
72                !$this->userOptionsLookup->getOption(
73                    $user,
74                    'checkuser-temporary-account-enable'
75                )
76            )
77        ) {
78            return;
79        }
80
81        if ( $user->getBlock() ) {
82            return;
83        }
84
85        $dbr = $this->dbProvider->getReplicaDatabase();
86        $ipConds = $this->checkUserLookupUtils->getIPTargetExpr( $target, false, 'cu_changes' );
87        if ( !$ipConds ) {
88            return;
89        }
90
91        $results = $dbr->newSelectQueryBuilder()
92            ->select( [ 'cuc_actor', 'actor_name' ] )
93            ->from( 'cu_changes' )
94            ->where( $ipConds )
95            ->andWhere(
96                $this->tempUserConfig->getMatchCondition(
97                    $dbr,
98                    'actor_name',
99                    IExpression::LIKE
100                )
101            )
102            ->caller( __METHOD__ )
103            ->groupBy( [ 'cuc_actor', 'actor_name' ] )
104            ->limit( $this->config->get( 'CheckUserMaximumRowCount' ) )
105            ->join( 'actor', null, 'actor_id=cuc_actor' )
106            ->fetchResultSet();
107
108        $names = [ $queryInfo['conds']['actor_name'] ];
109        foreach ( $results as $row ) {
110            $names[] = $row->actor_name;
111        }
112        $queryInfo['conds']['actor_name'] = $names;
113    }
114}