Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
ToolLinksHandler
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
4 / 4
11
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 onContributionsToolLinks
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
3
 onHistoryPageToolLinks
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 onUndeletePageToolLinks
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
 getSpecialPageTitle
n/a
0 / 0
n/a
0 / 0
2
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\Hooks\Handlers;
4
5use MediaWiki\Context\IContextSource;
6use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
7use MediaWiki\Extension\AbuseFilter\Special\SpecialAbuseLog;
8use MediaWiki\Linker\LinkRenderer;
9use MediaWiki\Linker\LinkTarget;
10use MediaWiki\SpecialPage\SpecialPage;
11use MediaWiki\Title\Title;
12use MediaWiki\Title\TitleValue;
13use Wikimedia\IPUtils;
14
15class ToolLinksHandler implements
16    \MediaWiki\Hook\ContributionsToolLinksHook,
17    \MediaWiki\Hook\HistoryPageToolLinksHook,
18    \MediaWiki\Hook\UndeletePageToolLinksHook
19{
20
21    /** @var AbuseFilterPermissionManager */
22    private $afPermManager;
23
24    /**
25     * ToolLinksHandler constructor.
26     */
27    public function __construct( AbuseFilterPermissionManager $afPermManager ) {
28        $this->afPermManager = $afPermManager;
29    }
30
31    /**
32     * @param int $id
33     * @param Title $nt
34     * @param array &$tools
35     * @param SpecialPage $sp for context
36     */
37    public function onContributionsToolLinks( $id, Title $nt, array &$tools, SpecialPage $sp ) {
38        $username = $nt->getText();
39        if ( $this->afPermManager->canViewAbuseLog( $sp->getAuthority() )
40            && !IPUtils::isValidRange( $username )
41        ) {
42            $linkRenderer = $sp->getLinkRenderer();
43            $tools['abuselog'] = $linkRenderer->makeLink(
44                $this->getSpecialPageTitle(),
45                $sp->msg( 'abusefilter-log-linkoncontribs' )->text(),
46                [ 'title' => $sp->msg( 'abusefilter-log-linkoncontribs-text',
47                    $username )->text(), 'class' => 'mw-contributions-link-abuse-log' ],
48                [ 'wpSearchUser' => $username ]
49            );
50        }
51    }
52
53    /**
54     * @param IContextSource $context
55     * @param LinkRenderer $linkRenderer
56     * @param string[] &$links
57     */
58    public function onHistoryPageToolLinks( IContextSource $context, LinkRenderer $linkRenderer, array &$links ) {
59        if ( $this->afPermManager->canViewAbuseLog( $context->getAuthority() ) ) {
60            $links[] = $linkRenderer->makeLink(
61                $this->getSpecialPageTitle(),
62                $context->msg( 'abusefilter-log-linkonhistory' )->text(),
63                [ 'title' => $context->msg( 'abusefilter-log-linkonhistory-text' )->text() ],
64                [ 'wpSearchTitle' => $context->getTitle()->getPrefixedText() ]
65            );
66        }
67    }
68
69    /**
70     * @param IContextSource $context
71     * @param LinkRenderer $linkRenderer
72     * @param string[] &$links
73     */
74    public function onUndeletePageToolLinks( IContextSource $context, LinkRenderer $linkRenderer, array &$links ) {
75        $show = $this->afPermManager->canViewAbuseLog( $context->getAuthority() );
76        $action = $context->getRequest()->getVal( 'action', 'view' );
77
78        // For 'history action', the link would be added by HistoryPageToolLinks hook.
79        if ( $show && $action !== 'history' ) {
80            $links[] = $linkRenderer->makeLink(
81                $this->getSpecialPageTitle(),
82                $context->msg( 'abusefilter-log-linkonundelete' )->text(),
83                [ 'title' => $context->msg( 'abusefilter-log-linkonundelete-text' )->text() ],
84                [ 'wpSearchTitle' => $context->getTitle()->getPrefixedText() ]
85            );
86        }
87    }
88
89    /**
90     * @codeCoverageIgnore Helper for tests
91     * @return LinkTarget
92     */
93    private function getSpecialPageTitle(): LinkTarget {
94        return defined( 'MW_PHPUNIT_TEST' )
95            ? new TitleValue( NS_SPECIAL, SpecialAbuseLog::PAGE_NAME )
96            : SpecialPage::getTitleFor( SpecialAbuseLog::PAGE_NAME );
97    }
98}