Passed
Push — master ( 7e81b0...7eb007 )
by Robbie
12:39 queued 11s
created

SecurityExtensionTest::setUp()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
namespace SilverStripe\MFA\Tests\Extension\AccountReset;
4
5
use SilverStripe\Control\HTTPRequest;
6
use SilverStripe\Dev\FunctionalTest;
7
use SilverStripe\MFA\Extension\AccountReset\MemberExtension;
8
use SilverStripe\MFA\Extension\AccountReset\SecurityAdminExtension;
9
use SilverStripe\ORM\FieldType\DBDatetime;
10
use SilverStripe\Security\Member;
11
12
/**
13
 * Class SecurityExtensionTest
14
 *
15
 * @package SilverStripe\MFA\Tests\Extension\AccountReset
16
 */
17
class SecurityExtensionTest extends FunctionalTest
18
{
19
    protected static $fixture_file = 'SecurityExtensionTest.yml';
20
21
    protected function setUp()
22
    {
23
        parent::setUp();
24
25
        $validator = Member::password_validator();
26
        // Do not let project code rules for password strength break these tests
27
        if ($validator) {
0 ignored issues
show
introduced by
$validator is of type SilverStripe\Security\PasswordValidator, thus it always evaluated to true.
Loading history...
28
            $validator
29
                ->setMinLength(6)
30
                ->setMinTestScore(1);
31
        }
32
    }
33
34
    public function testResetAccountFailsWhenAlreadyAuthenticated()
35
    {
36
        /** @var Member&MemberExtension $member */
37
        $member = $this->objFromFixture(Member::class, 'user');
38
        $this->logInAs($member);
39
40
        $token = $member->generateAccountResetTokenAndStoreHash();
41
42
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
43
        $response = $this->get($url);
44
45
        $this->assertEquals(400, $response->getStatusCode());
46
        $this->assertContains('Already authenticated', $response->getBody());
47
    }
48
49
    public function testResetAccountFailsWithInvalidToken()
50
    {
51
        /** @var Member&MemberExtension $member */
52
        $member = $this->objFromFixture(Member::class, 'user');
53
        $member->generateAccountResetTokenAndStoreHash();
54
55
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, 'not-actually-the-token');
56
        $response = $this->get($url);
57
58
        $this->assertEquals(400, $response->getStatusCode());
59
        $this->assertContains('Invalid member or token', $response->getBody());
60
    }
61
62
    public function testResetAccountFailsWithExpiredToken()
63
    {
64
        /** @var Member&MemberExtension $member */
65
        $member = $this->objFromFixture(Member::class, 'user');
66
67
        // Wrap token generation in old timestamp to guarantee token expiry
68
        DBDatetime::set_mock_now('2011-11-26 17:00');
69
        $token = $member->generateAccountResetTokenAndStoreHash();
70
        DBDatetime::clear_mock_now();
71
72
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
73
        $response = $this->get($url);
74
75
        $this->assertEquals(400, $response->getStatusCode());
76
        $this->assertContains('Invalid member or token', $response->getBody());
77
    }
78
79
    public function testResetAccountSubmissionFailsWithExpiredSession()
80
    {
81
        /** @var Member&MemberExtension $member */
82
        $member = $this->objFromFixture(Member::class, 'user');
83
        $token = $member->generateAccountResetTokenAndStoreHash();
84
85
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
86
        $response = $this->get($url);
87
88
        $this->assertEquals(200, $response->getStatusCode(), $response->getBody());
89
90
        // Simulate expired session (can't call destroy() due to issue in SilverStripe 4.1
91
        $this->session()->restart(new HTTPRequest('GET', '/'));
92
93
        $response = $this->submitForm(
94
            'Form_ResetAccountForm',
95
            null,
96
            ['NewPassword1' => 'testtest', 'NewPassword2' => 'testtest']
97
        );
98
99
        $this->assertContains('The account reset process timed out', $response->getBody());
100
    }
101
102
    public function testResetAccountSubmissionPasses()
103
    {
104
        /** @var Member&MemberExtension $member */
105
        $member = $this->objFromFixture(Member::class, 'user');
106
        $token = $member->generateAccountResetTokenAndStoreHash();
107
108
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
109
        $response = $this->get($url);
110
111
        $this->assertEquals(200, $response->getStatusCode(), $response->getBody());
112
113
        $response = $this->submitForm(
114
            'Form_ResetAccountForm',
115
            null,
116
            ['NewPassword1' => 'testtest', 'NewPassword2' => 'testtest']
117
        );
118
119
        // User should have been redirected to Login form with session message
120
        $this->assertContains('Login', $response->getBody());
121
        $this->assertContains('Reset complete', $response->getBody());
122
    }
123
}
124