Passed
Pull Request — master (#13)
by Simon
02:07
created

testNoYubikeyLockout()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 19
nc 1
nop 0
dl 0
loc 27
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\YubiAuth\Tests;
4
5
use Firesphere\YubiAuth\Authenticators\YubikeyMemberAuthenticator;
6
use Firesphere\YubiAuth\Forms\YubikeyForm;
7
use Firesphere\YubiAuth\Forms\YubikeyLoginForm;
8
use Firesphere\YubiAuth\Handlers\YubikeyLoginHandler;
9
use Firesphere\YubiAuth\Providers\YubiAuthProvider;
10
use SilverStripe\Control\HTTPRequest;
11
use SilverStripe\Control\Session;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Dev\SapphireTest;
14
use SilverStripe\Security\IdentityStore;
15
use SilverStripe\Security\Member;
16
use SilverStripe\Security\Security;
17
use Yubikey\Validate;
18
19
class YubikeyMemberAuthenticatorTest extends SapphireTest
20
{
21
    protected static $fixture_file = '../fixtures/Member.yml';
22
23
    /**
24
     * @var YubikeyLoginHandler
25
     */
26
    protected $handler;
27
    /**
28
     * @var YubikeyLoginForm
29
     */
30
    protected $form;
31
32
    /**
33
     * @var YubikeyMemberAuthenticator
34
     */
35
    protected $authenticator;
36
37
    protected $request;
38
39
    public function setUp()
40
    {
41
        parent::setUp();
42
        $this->objFromFixture(Member::class, 'admin');
43
        $validator = new MockYubiValidate('apikey', '1234');
44
        $this->authenticator = Injector::inst()->get(YubikeyMemberAuthenticator::class);
45
        $this->handler = Injector::inst()->createWithArgs(
46
            YubikeyLoginHandler::class,
47
            [Security::login_url(), $this->authenticator]
48
        );
49
        $this->form = Injector::inst()->get(
50
            YubikeyLoginForm::class,
51
            true,
52
            [$this->handler, YubikeyMemberAuthenticator::class, '']
53
        );
54
        Injector::inst()->registerService($validator, Validate::class);
55
    }
56
57
    public function tearDown()
58
    {
59
        parent::tearDown();
60
    }
61
62
    public function testNoYubikey()
63
    {
64
        $request = new HTTPRequest('POST', '/');
65
        $request->setSession(new Session(['hi' => 'bye']));
66
        $this->handler->setRequest($request);
67
68
        $this->handler->doLogin(
69
            [
70
                'Email'    => '[email protected]',
71
                'Password' => 'password',
72
            ],
73
            $this->form,
74
            $request
75
        );
76
        $this->handler->validateYubikey(
77
            ['yubiauth' => ''],
78
            YubikeyForm::create($this->handler),
79
            $request
80
        );
81
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
82
        $this->assertGreaterThan(0, $member->NoYubikeyCount);
83
        $this->assertEquals(null, $member->Yubikey);
84
    }
85
86
    public function testNoYubikeySuccess()
87
    {
88
        /** @var Member $member */
89
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
90
        $member->NoYubikeyCount = 0;
91
        $member->YubiAuthEnabled = false;
92
        $member->write();
93
        $request = new HTTPRequest('POST', '/');
94
        $request->setSession(new Session(['hi' => 'bye']));
95
        $this->handler->setRequest($request);
96
        $this->handler->doLogin(
97
            [
98
99
                'Email'    => '[email protected]',
100
                'Password' => 'password',
101
            ],
102
            $this->form,
103
            $request
104
        );
105
        $this->handler->validateYubikey(
106
            ['yubiauth' => ''],
107
            YubikeyForm::create($this->handler),
108
            $request
109
        );
110
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
111
        $this->assertEquals(0, $member->FailedLoginCount);
112
    }
113
114
    public function testNoYubikeyLockout()
115
    {
116
        /** @var Member $member */
117
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
118
        $failedCount = $member->FailedLoginCount;
119
        $member->NoYubikeyCount = 25;
120
        $member->YubiAuthEnabled = false;
121
        $member->write();
122
        $request = new HTTPRequest('POST', '/');
123
        $request->setSession(new Session(['hi' => 'bye']));
124
        $this->handler->setRequest($request);
125
        $this->handler->doLogin(
126
            [
127
128
                'Email'    => '[email protected]',
129
                'Password' => 'password',
130
            ],
131
            $this->form,
132
            $request
133
        );
134
        $this->handler->validateYubikey(
135
            ['yubiauth' => ''],
136
            YubikeyForm::create($this->handler),
137
            $request
138
        );
139
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
140
        $this->assertGreaterThan($failedCount, $member->FailedLoginCount);
141
    }
142
143
    public function testYubikey()
144
    {
145
        $request = new HTTPRequest('POST', '/');
146
        $request->setSession(new Session(['hi' => 'bye']));
147
        $this->handler->setRequest($request);
148
        $this->handler->doLogin(
149
            [
150
151
                'Email'    => '[email protected]',
152
                'Password' => 'password',
153
            ],
154
            $this->form,
155
            $request
156
        );
157
        $this->handler->validateYubikey(
158
            [
159
                // This OTP is _not_ valid in real situations
160
                'yubiauth' => 'jjjjjjucbuipyhde.cybcpnbiixcjkbbyd.ydenhnjkn'
161
            ],
162
            YubikeyForm::create($this->handler),
163
            $request
164
        );
165
        $result = Security::getCurrentUser();
166
        $this->assertEquals(Member::class, $result->ClassName);
167
        $this->assertEquals('ccccccfinfgr', $result->Yubikey);
168
        $this->assertEquals(1, $result->YubiAuthEnabled);
169
        $this->assertEquals('[email protected]', $result->Email);
170
        $this->assertEquals(true, $result->YubiAuthEnabled);
171
        $result->write();
172
    }
173
174
    public function testYubikeyAfterSuccess()
175
    {
176
        $request = new HTTPRequest('POST', '/');
177
        $request->setSession(new Session(['hi' => 'bye']));
178
        $this->handler->setRequest($request);
179
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
180
        $member->YubiAuthEnabled = true;
181
        $member->Yubikey = 'ccccccfinfgr';
182
        $member->NoYubikeyCount = 50;
183
        $member->write();
184
        Injector::inst()->get(IdentityStore::class)->logOut();
185
        $failedLoginCount = $member->FailedLoginCount;
186
        $this->handler->doLogin(
187
            [
188
189
                'Email'    => '[email protected]',
190
                'Password' => 'password',
191
            ],
192
            $this->form,
193
            $request
194
        );
195
        $this->handler->validateYubikey(['yubiauth' => ''], YubikeyForm::create($this->handler), $request);
196
        $resultNoYubi = Security::getCurrentUser();
197
        $this->assertEquals(null, $resultNoYubi);
198
        $member = Member::get()->filter(array('Email' => '[email protected]'))->first();
199
        $this->assertGreaterThan($failedLoginCount, $member->FailedLoginCount);
200
    }
201
202
    public function testName()
203
    {
204
        $this->assertEquals('Yubikey 2 factor login', YubikeyMemberAuthenticator::get_name());
205
    }
206
207
    public function testGetLoginHandler()
208
    {
209
        $authenticator = new YubikeyMemberAuthenticator();
210
211
        $handler = $authenticator->getLoginHandler(Security::login_url());
212
213
        $this->assertInstanceOf(YubikeyLoginHandler::class, $handler);
214
    }
215
216
    public function testGetSetProvider()
217
    {
218
        /** @var YubikeyMemberAuthenticator $authenticator */
219
        $authenticator = new YubikeyMemberAuthenticator();
220
221
        /** @var YubiAuthProvider $provider */
222
        $provider = Injector::inst()->get(YubiAuthProvider::class);
223
224
        $authenticator->setProvider($provider);
225
226
        $this->assertInstanceOf(YubiAuthProvider::class, $authenticator->getProvider());
227
    }
228
229
    public function testSupportedServices()
230
    {
231
        /** @var YubikeyMemberAuthenticator $authenticator */
232
        $authenticator = new YubikeyMemberAuthenticator();
233
234
        $this->assertEquals(47, $authenticator->supportedServices());
235
    }
236
}
237