Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
15.62% covered (danger)
15.62%
5 / 32
33.33% covered (danger)
33.33%
1 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserMergeHooks
15.62% covered (danger)
15.62%
5 / 32
33.33% covered (danger)
33.33%
1 / 3
57.65
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 onUserGetReservedNames
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 onContributionsToolLinks
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3use MediaWiki\Config\ConfigFactory;
4use MediaWiki\Hook\ContributionsToolLinksHook;
5use MediaWiki\Title\Title;
6use MediaWiki\User\Hook\UserGetReservedNamesHook;
7use MediaWiki\User\UserGroupManager;
8
9class UserMergeHooks implements
10    UserGetReservedNamesHook,
11    ContributionsToolLinksHook
12{
13    private ConfigFactory $configFactory;
14    private UserGroupManager $userGroupManager;
15
16    public function __construct(
17        ConfigFactory $configFactory,
18        UserGroupManager $userGroupManager
19    ) {
20        $this->configFactory = $configFactory;
21        $this->userGroupManager = $userGroupManager;
22    }
23
24    /**
25     * UserGetReservedNames hook handler
26     *
27     * @param string[] &$reservedUsernames Already registered reserved names
28     */
29    public function onUserGetReservedNames( &$reservedUsernames ) {
30        $deleteEnabled = $this->configFactory
31            ->makeConfig( 'usermerge' )
32            ->get( 'UserMergeEnableDelete' );
33
34        if ( $deleteEnabled ) {
35            $reservedUsernames[] = 'Anonymous';
36        }
37    }
38
39    /**
40     * Handler for ContributionsToolLinks hook
41     *
42     * @param int $id
43     * @param Title $nt
44     * @param array &$tools
45     * @param SpecialPage $sp for context
46     */
47    public function onContributionsToolLinks(
48        $id, Title $nt, array &$tools, SpecialPage $sp
49    ) {
50        if ( $id === 0 || $id === $sp->getUser()->getId() ) {
51            return;
52        }
53        if ( !$sp->getAuthority()->isAllowed( 'usermerge' ) ) {
54            return;
55        }
56        $targetUser = User::newFromId( $id );
57        if ( array_intersect(
58            $this->userGroupManager->getUserGroups( $targetUser ),
59            $sp->getConfig()->get( 'UserMergeProtectedGroups' )
60        ) ) {
61            return;
62        }
63
64        $username = $nt->getText();
65        $linkRenderer = $sp->getLinkRenderer();
66        $tools['usermerge-merge'] = $linkRenderer->makeKnownLink(
67            SpecialPage::getTitleFor( 'UserMerge' ),
68            $sp->msg( 'usermerge-merge-linkoncontribs', $username )->text(),
69            [],
70            [ 'wpolduser' => $username ]
71        );
72        if ( $sp->getConfig()->get( 'UserMergeEnableDelete' ) ) {
73            $tools['usermerge-delete'] = $linkRenderer->makeKnownLink(
74                SpecialPage::getTitleFor( 'UserMerge' ),
75                $sp->msg( 'usermerge-delete-linkoncontribs', $username )->text(),
76                [],
77                [ 'wpolduser' => $username, 'wpdelete' => '1' ]
78            );
79        }
80    }
81
82}