YubikeyAuthProviderTest::testSingleHost()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 0
1
<?php
2
3
namespace Firesphere\YubiAuth\Tests;
4
5
use Firesphere\YubiAuth\Providers\YubikeyAuthProvider;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\ORM\ValidationResult;
10
use SilverStripe\Security\Member;
11
use Yubikey\Validate;
12
13
class YubikeyAuthProviderTest extends SapphireTest
14
{
15
    protected static $fixture_file = '../fixtures/Member.yml';
16
17
    /**
18
     * @var YubikeyAuthProvider
19
     */
20
    protected $provider;
21
22
    public function testSetService()
23
    {
24
        $service = Injector::inst()->createWithArgs(Validate::class, ['test', 'test']);
25
26
        $this->provider->setService($service);
27
28
        $this->assertInstanceOf(Validate::class, $this->provider->getService());
29
    }
30
31
    public function testCheckNoYubikeyDaysZero()
32
    {
33
        Config::modify()->set(YubikeyAuthProvider::class, 'MaxNoYubiLoginDays', 0);
34
        /** @var Member $member */
35
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
36
        $member->Created = date('Y-m-d', strtotime('-1 year'));
37
        $member->MFAEnabled = false;
38
        $member->write();
39
40
        $result = $this->provider->checkNoYubiDays($member);
41
        $this->assertInstanceOf(Member::class, $result);
42
    }
43
44
    public function testCheckNoYubikeyDaysError()
45
    {
46
        /** @var Member $member */
47
        $member = Member::get()->filter(['Email' => '[email protected]'])->first();
48
        $member->Created = date('Y-m-d', strtotime('-1 year'));
49
        $member->MFAEnabled = false;
50
        $member->write();
51
52
        $result = $this->provider->checkNoYubiDays($member);
53
        $this->assertInstanceOf(ValidationResult::class, $result);
54
    }
55
56
    public function testvalidateTokenDuplicate()
57
    {
58
        $result = Injector::inst()->get(ValidationResult::class, false);
59
        $member1 = Member::create([
60
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
61
            'Yubikey'    => 'ccccccfinfgr',
62
            'MFAEnabled' => true
63
        ]);
64
        $member1->write();
65
        $member2 = Member::create([
66
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
67
            'Yubikey'    => 'ccccccfinfgr',
68
            'MFAEnabled' => true
69
        ]);
70
        $member2->write();
71
72
        $this->provider->validateToken($member1, 'ccccccfinfgr', $result);
73
74
        $this->assertInstanceOf(ValidationResult::class, $result);
75
        $this->assertFalse($result->isValid());
76
    }
77
78
    public function testvalidateTokenID()
79
    {
80
        $result = Injector::inst()->get(ValidationResult::class, false);
81
        $member1 = Member::create([
82
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
83
            'Yubikey'    => 'ccccccfinfgp',
84
            'MFAEnabled' => true
85
        ]);
86
        $member1->write();
87
        $member2 = Member::create([
88
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
89
            'Yubikey'    => 'ccccccfinfgr',
90
            'MFAEnabled' => true
91
        ]);
92
        $member2->write();
93
94
        $this->provider->validateToken($member1, 'ccccccfinfgr', $result);
95
96
        $this->assertInstanceOf(ValidationResult::class, $result);
97
        $this->assertFalse($result->isValid());
98
    }
99
100
    public function testvalidateTokenNotMatchesMember()
101
    {
102
        $result = Injector::inst()->get(ValidationResult::class, false);
103
        $member1 = Member::create([
104
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
105
            'Yubikey'    => 'ccccccfinfgr',
106
            'MFAEnabled' => true
107
        ]);
108
        $member1->write();
109
110
        $this->provider->validateToken($member1, '1234567890', $result);
111
112
        $this->assertInstanceOf(ValidationResult::class, $result);
113
        $this->assertFalse($result->isValid());
114
    }
115
116
    public function testvalidateTokenUnique()
117
    {
118
        $result = Injector::inst()->get(ValidationResult::class, false);
119
        $member1 = Member::create([
120
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
121
            'Yubikey'    => 'ccccccfinfgr',
122
            'MFAEnabled' => true
123
        ]);
124
        $member1->write();
125
        $member2 = Member::create([
126
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
127
            'Yubikey'    => 'ccccccfinfgp',
128
            'MFAEnabled' => true
129
        ]);
130
        $member2->write();
131
132
        $this->provider->validateToken($member1, 'ccccccfinfgr', $result);
133
134
        $this->assertInstanceOf(ValidationResult::class, $result);
135
        $this->assertTrue($result->isValid());
136
    }
137
138
    public function testSingleHost()
139
    {
140
        Config::modify()->set(YubikeyAuthProvider::class, 'AuthURL', 'localhost');
141
142
        /** @var YubikeyAuthProvider $provider */
143
        $provider = Injector::inst()->get(YubikeyAuthProvider::class, false);
144
145
        $url = $provider->getService()->getHost();
146
147
        $this->assertEquals('localhost', $url);
148
    }
149
150
    public function testHost()
151
    {
152
        Config::modify()->set(YubikeyAuthProvider::class, 'AuthURL', ['localhost-1', 'localhost-2']);
153
154
        /** @var YubikeyAuthProvider $provider */
155
        $provider = Injector::inst()->get(YubikeyAuthProvider::class, false);
156
157
        $url = $provider->getService()->getHost();
158
159
        $this->assertContains('localhost', $url);
160
    }
161
162
    public function testCheckYubikeyFalse()
163
    {
164
        $key = 'ccccccfinfgrtjhdeitnirlnggbicvnnthethdljlcvl';
165
        $result = Injector::inst()->get(ValidationResult::class, false);
166
        $member = Member::create([
167
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
168
            'Yubikey'    => 'ccccccfinfgr',
169
            'MFAEnabled' => true
170
        ]);
171
        $errorCount = $member->FailedLoginCount;
172
        $mockService = new MockYubiValidateFalse('key', 'secret');
173
        $this->provider->setService($mockService);
174
        $this->provider->checkYubikey(['yubiauth' => $key], $member, $result);
175
176
        $this->assertFalse($result->isValid());
177
        $this->assertGreaterThan($errorCount, $member->FailedLoginCount);
178
        $messages = $result->getMessages();
179
        $this->assertEquals('Yubikey authentication error', $messages[0]['message']);
180
    }
181
182
    public function testException()
183
    {
184
        $key = 'ccccccfinfgrtjhdeitnirlnggbicvnnthethdljlcvl';
185
        $result = Injector::inst()->get(ValidationResult::class, false);
186
        $member = Member::create([
187
            'Email'      => 'user' . uniqid('', false) . '[email protected]',
188
            'Yubikey'    => 'ccccccfinfgr',
189
            'MFAEnabled' => true
190
        ]);
191
        $errorCount = $member->FailedLoginCount;
192
        $mockService = new MockYubiValidateException('key', 'secret');
193
        $this->provider->setService($mockService);
194
        $this->provider->checkYubikey(['yubiauth' => $key], $member, $result);
195
196
        $this->assertFalse($result->isValid());
197
        $this->assertGreaterThan($errorCount, $member->FailedLoginCount);
198
        $messages = $result->getMessages();
199
        $this->assertEquals('I do not like this', $messages[0]['message']);
200
201
    }
202
203
    protected function setUp()
204
    {
205
        $this->provider = Injector::inst()->get(YubikeyAuthProvider::class);
206
207
        return parent::setUp();
208
    }
209
}
210