Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
PresentationModel
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 5
156
0.00% covered (danger)
0.00%
0 / 1
 getIconType
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getPrimaryLink
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getSubjectMessage
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 getHeaderMessage
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
30
 getSecondaryLinks
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace LoginNotify;
4
5use MediaWiki\Extension\Notifications\Formatters\EchoEventPresentationModel;
6use MediaWiki\Extension\Notifications\Model\Event;
7use MediaWiki\SpecialPage\SpecialPage;
8use Message;
9
10class PresentationModel extends EchoEventPresentationModel {
11
12    /**
13     * Show an user avatar.
14     *
15     * @return string Name of icon
16     */
17    public function getIconType() {
18        return 'LoginNotify-user-avatar';
19    }
20
21    /**
22     * Link to help page on mediawiki
23     *
24     * @return array URL to link to
25     */
26    public function getPrimaryLink() {
27        return [
28            'url' => 'https://mediawiki.org/wiki/Special:MyLanguage/Help:Login_notifications',
29            'label' => $this->msg( 'loginnotify-primary-link' )->text()
30        ];
31    }
32
33    /**
34     * Define the email subject string
35     *
36     * @return Message Email subject
37     */
38    public function getSubjectMessage() {
39        switch ( $this->event->getType() ) {
40            case 'login-fail-known':
41            case 'login-fail-new':
42                $msg = $this->msg( 'notification-loginnotify-login-fail-email-subject' );
43                $msg->params( $this->getUser()->getName() );
44                $msg->numParams( $this->event->getExtraParam( 'count', 0 ) );
45                break;
46            default:
47                $msg = $this->msg( 'notification-loginnotify-login-success-email-subject' );
48                $msg->params( $this->getUser()->getName() );
49                break;
50        }
51        return $msg;
52    }
53
54    /**
55     * Include the number of attempts in the message if needed
56     *
57     * @return Message
58     */
59    public function getHeaderMessage() {
60        switch ( $this->event->getType() ) {
61            // Known IP? Don't bundle because we issue notifications after every 5 attempts anyway
62            case 'login-fail-known':
63                $msg = $this->msg( 'notification-known-header-login-fail' );
64                $msg->numParams( $this->event->getExtraParam( 'count', 0 ) );
65                break;
66            // New IP?
67            case 'login-fail-new':
68                // If it's a bundle, pass it the bundle count as param
69                if ( $this->isBundled() ) {
70                    $msg = $this->msg( 'notification-new-bundled-header-login-fail' );
71                    $totalAttempts = array_reduce(
72                        $this->getBundledEvents(),
73                        static function ( $sum, Event $event ) {
74                            return $sum + $event->getExtraParam( 'count', 0 );
75                        },
76                        0
77                    );
78                    $msg->numParams( $totalAttempts );
79                } else {
80                    // If the bundle is read or user goes to Special:Notifications, show
81                    // one notification per attempt (aligned with how unbundled bundles work)
82                    $msg = $this->msg( 'notification-new-unbundled-header-login-fail' );
83                    $msg->numParams( $this->event->getExtraParam( 'count', 0 ) );
84                }
85                break;
86            default:
87                $msg = $this->msg( 'notification-header-login-success', $this->getUser()->getName() );
88        }
89        return $msg;
90    }
91
92    /**
93     * Get links to be used in the notification
94     *
95     * @return array Link to Special:ChangePassword
96     */
97    public function getSecondaryLinks() {
98        $changePasswordLink = [
99            'url' => SpecialPage::getTitleFor( 'ChangePassword' )->getFullURL(),
100            'label' => $this->msg( 'changepassword' )->text(),
101            'description' => '',
102            'icon' => 'lock',
103            'prioritized' => true,
104        ];
105
106        return [ $changePasswordLink ];
107    }
108
109}