Completed
Push — master ( fa0cb8...7d06ec )
by Robbie
15s queued 11s
created

testCanSkipWhenMFAIsOptional()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\MFA\Tests\Service;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\MFA\Extension\MemberExtension;
7
use SilverStripe\MFA\Service\EnforcementManager;
8
use SilverStripe\MFA\Service\MethodRegistry;
9
use SilverStripe\MFA\Tests\Stub\BasicMath\Method as BasicMathMethod;
10
use SilverStripe\ORM\FieldType\DBDatetime;
11
use SilverStripe\Security\Member;
12
use SilverStripe\SiteConfig\SiteConfig;
13
14
class EnforcementManagerTest extends SapphireTest
15
{
16
    protected static $fixture_file = 'EnforcementManagerTest.yml';
17
18
    protected function setUp()
19
    {
20
        parent::setUp();
21
22
        DBDatetime::set_mock_now('2019-01-25 12:00:00');
23
24
        MethodRegistry::config()->set('methods', [
25
            BasicMathMethod::class,
26
        ]);
27
    }
28
29
    public function testCannotSkipWhenMFAIsRequiredWithNoGracePeriod()
30
    {
31
        $this->setSiteConfig(['MFARequired' => true]);
32
33
        $member = new Member();
34
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
35
    }
36
37
    public function testCanSkipWhenMFAIsRequiredWithGracePeriodExpiringInFuture()
38
    {
39
        $this->setSiteConfig(['MFARequired' => true, 'MFAGracePeriodExpires' => '2019-01-30']);
40
41
        $member = new Member();
42
        $this->assertTrue(EnforcementManager::create()->canSkipMFA($member));
43
    }
44
45
    public function testCannotSkipWhenMFAIsRequiredWithGracePeriodExpiringInPast()
46
    {
47
        $this->setSiteConfig(['MFARequired' => true, 'MFAGracePeriodExpires' => '2018-12-25']);
48
49
        $member = new Member();
50
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
51
    }
52
53
    public function testCannotSkipWhenMemberHasRegisteredAuthenticationMethodsSetUp()
54
    {
55
        $this->setSiteConfig(['MFARequired' => false]);
56
        // Sally has "backup codes" as a registered authentication method already
57
        /** @var Member $member */
58
        $member = $this->objFromFixture(Member::class, 'sally_smith');
59
        $this->logInAs($member);
60
61
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
62
    }
63
64
    public function testCanSkipWhenMFAIsOptional()
65
    {
66
        $this->setSiteConfig(['MFARequired' => false]);
67
        // Anonymous admin user
68
        $memberId = $this->logInWithPermission();
69
        /** @var Member $member */
70
        $member = Member::get()->byID($memberId);
71
72
        $this->assertTrue(EnforcementManager::create()->canSkipMFA($member));
73
    }
74
75
    public function testShouldRedirectToMFAWhenMFAIsRequired()
76
    {
77
        $this->setSiteConfig(['MFARequired' => true]);
78
        /** @var Member $member */
79
        $member = $this->objFromFixture(Member::class, 'sally_smith');
80
        $this->logInAs($member);
81
82
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
83
    }
84
85
    public function testShouldRedirectToMFAWhenMFAIsOptionalAndHasNotBeenSkipped()
86
    {
87
        $this->setSiteConfig(['MFARequired' => false]);
88
89
        /** @var Member|MemberExtension $member */
90
        $member = $this->objFromFixture(Member::class, 'sally_smith');
91
        $member->HasSkippedMFARegistration = false;
92
        $member->write();
93
        $this->logInAs($member);
94
95
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
96
    }
97
98
    public function testShouldNotRedirectToMFAWhenMFAIsOptionalAndHasBeenSkipped()
99
    {
100
        $this->setSiteConfig(['MFARequired' => false]);
101
102
        /** @var Member&MemberExtension $member */
103
        $member = $this->objFromFixture(Member::class, 'sally_smith');
104
        $member->HasSkippedMFARegistration = true;
105
        $member->write();
106
        $this->logInAs($member);
107
108
        $this->assertFalse(EnforcementManager::create()->shouldRedirectToMFA($member));
109
    }
110
111
    /**
112
     * Helper method for changing the current SiteConfig values
113
     *
114
     * @param array $data
115
     */
116
    protected function setSiteConfig(array $data)
117
    {
118
        $siteConfig = SiteConfig::current_site_config();
119
        $siteConfig->update($data);
120
        $siteConfig->write();
121
    }
122
}
123