Passed
Push — master ( 948cdb...200aa9 )
by
unknown
02:48
created

testShouldRedirectToMFAWhenUserHasRegisteredMFAMethod()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 5
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 testShouldRedirectToMFAWhenUserHasRegisteredMFAMethod()
76
    {
77
        $member = $this->objFromFixture(Member::class, 'sally_smith');
78
        $shouldRedirect = EnforcementManager::create()->shouldRedirectToMFA($member);
79
        $this->assertTrue($shouldRedirect);
80
    }
81
82
    public function testShouldRedirectToMFAWhenMFAIsRequired()
83
    {
84
        $this->setSiteConfig(['MFARequired' => true]);
85
        /** @var Member $member */
86
        $member = $this->objFromFixture(Member::class, 'sally_smith');
87
        $this->logInAs($member);
88
89
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
90
    }
91
92
    public function testShouldRedirectToMFAWhenMFAIsOptionalAndHasNotBeenSkipped()
93
    {
94
        $this->setSiteConfig(['MFARequired' => false]);
95
96
        /** @var Member|MemberExtension $member */
97
        $member = $this->objFromFixture(Member::class, 'sally_smith');
98
        $member->HasSkippedMFARegistration = false;
99
        $member->write();
100
        $this->logInAs($member);
101
102
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
103
    }
104
105
    public function testShouldNotRedirectToMFAWhenMFAIsOptionalAndHasBeenSkipped()
106
    {
107
        $this->setSiteConfig(['MFARequired' => false]);
108
109
        /** @var Member&MemberExtension $member */
110
        $member = $this->objFromFixture(Member::class, 'sammy_smith');
111
        $member->HasSkippedMFARegistration = true;
112
        $member->write();
113
        $this->logInAs($member);
114
115
        $this->assertFalse(EnforcementManager::create()->shouldRedirectToMFA($member));
116
    }
117
118
    /**
119
     * Helper method for changing the current SiteConfig values
120
     *
121
     * @param array $data
122
     */
123
    protected function setSiteConfig(array $data)
124
    {
125
        $siteConfig = SiteConfig::current_site_config();
126
        $siteConfig->update($data);
127
        $siteConfig->write();
128
    }
129
}
130