Passed
Push — master ( 3624ae...1055f5 )
by Simon
01:38
created

getCodesFromSession()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 0
1
<?php
2
3
namespace Firesphere\BootstrapMFA\Tests;
4
5
use Firesphere\BootstrapMFA\Authenticators\BootstrapMFAAuthenticator;
6
use Firesphere\BootstrapMFA\Generators\CodeGenerator;
7
use Firesphere\BootstrapMFA\Models\BackupCode;
8
use Firesphere\BootstrapMFA\Tests\Helpers\CodeHelper;
9
use SilverStripe\Control\Controller;
10
use SilverStripe\Control\Session;
11
use SilverStripe\Core\Config\Config;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Dev\SapphireTest;
14
use SilverStripe\ORM\ValidationResult;
15
use SilverStripe\Security\IdentityStore;
16
use SilverStripe\Security\Member;
17
18
class BootstrapMFAAuthenticatorTest extends SapphireTest
19
{
20
    /**
21
     * @var BootstrapMFAAuthenticator
22
     */
23
    protected $authenticator;
24
25
    protected static $fixture_file = '../fixtures/member.yml';
26
27
    protected function setUp()
28
    {
29
        $this->authenticator = Injector::inst()->get(BootstrapMFAAuthenticator::class);
30
        Config::modify()->set(BackupCode::class, 'token_limit', 3);
31
32
        return parent::setUp();
33
    }
34
35
    /**
36
     * Test if user codes are properly validated and expired
37
     *
38
     * @throws \Psr\Container\NotFoundExceptionInterface
39
     * @throws \SilverStripe\ORM\ValidationException
40
     * @throws \SilverStripe\Security\PasswordEncryptor_NotFoundException
41
     */
42
    public function testValidateBackupCodeRight()
43
    {
44
        /** @var Member $member */
45
        $member = $this->objFromFixture(Member::class, 'member1');
46
        Injector::inst()->get(IdentityStore::class)->logIn($member);
47
        BackupCode::generateTokensForMember($member);
48
49
        $codes = CodeHelper::getCodesFromSession();
50
        $length = Config::inst()->get(CodeGenerator::class, 'length');
51
52
        // Actual testing
53
        foreach ($codes as $code) {
54
            $this->assertEquals($length, strlen($code));
55
            $member = $this->authenticator->validateBackupCode($member, $code, $result);
0 ignored issues
show
Bug introduced by
It seems like $member can also be of type false; however, parameter $member of Firesphere\BootstrapMFA\...r::validateBackupCode() does only seem to accept SilverStripe\Security\Member, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

55
            $member = $this->authenticator->validateBackupCode(/** @scrutinizer ignore-type */ $member, $code, $result);
Loading history...
56
            // All codes should be valid
57
            $this->assertTrue($result->isValid());
58
            $this->assertInstanceOf(Member::class, $member);
59
60
            $encryptedCode = $member->encryptWithUserSettings($code);
61
62
            /** @var BackupCode $code */
63
            $code = BackupCode::get()->filter(['Code' => $encryptedCode])->first();
64
65
            $this->assertTrue((bool)$code->Used);
66
        }
67
    }
68
69
    public function testValidateBackupCodeWrong()
70
    {
71
        $member = $this->objFromFixture(Member::class, 'member1');
72
73
        $this->authenticator->validateBackupCode($member, '12345', $result);
74
75
        $this->assertInstanceOf(ValidationResult::class, $result);
76
        $this->assertFalse($result->isValid());
77
    }
78
}
79