Completed
Pull Request — master (#12)
by Simon
06:43
created

PartialUserFormVerifyController::init()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.6666
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
4
namespace Firesphere\PartialUserforms\Controllers;
5
6
use Exception;
7
use Firesphere\PartialUserforms\Forms\PasswordForm;
8
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
9
use Page;
10
use PageController;
11
use SilverStripe\Control\HTTPResponse;
12
use SilverStripe\Control\HTTPResponse_Exception;
13
use SilverStripe\UserForms\Model\UserDefinedForm;
14
15
/**
16
 * Class \Firesphere\PartialUserforms\Controllers\PartialUserFormVerifyController
17
 *
18
 */
19
class PartialUserFormVerifyController extends PageController
20
{
21
    public const PASSWORD_KEY = 'FormPassword';
22
23
    /**
24
     * @var array
25
     */
26
    private static $allowed_actions = [
27
        'getForm'
28
    ];
29
    /**
30
     * @var PartialFormSubmission
31
     */
32
    protected $partialFormSubmission;
33
34
    /**
35
     * @var PasswordForm
36
     */
37
    protected $form;
38
39
    /**
40
     * @return PartialUserFormVerifyController|void
41
     * @throws HTTPResponse_Exception
42
     */
43
    public function init()
44
    {
45
        parent::init();
46
        $session = $this->getRequest()->getSession();
47
        $sessionID = $session->get(PartialSubmissionController::SESSION_KEY);
48
        // Set the session if the last session has expired
49
        if (!$sessionID) {
50
            return $this->httpError(404);
51
        }
52
53
        /** @var PartialFormSubmission $partial */
54
        $partial = PartialFormSubmission::get()->byID($sessionID);
55
56
        $this->setPartialFormSubmission($partial);
57
        // Set data record and load the form
58
        /** @var UserDefinedForm dataRecord */
59
        $this->dataRecord = Page::create();
60
    }
61
62
    /**
63
     * @return PasswordForm
64
     */
65
    public function getForm()
66
    {
67
        return PasswordForm::create($this, __FUNCTION__);
68
    }
69
70
71
    /**
72
     * @param array $data
73
     * @param PasswordForm $form
74
     * @return HTTPResponse
75
     * @throws Exception
76
     */
77
    public function doValidate($data, $form)
78
    {
79
        /** @var PartialFormSubmission $partial */
80
        $partial = $this->getPartialFormSubmission();
81
82
        $password = hash_pbkdf2('SHA256', $data['Password'], $partial->TokenSalt, 1000);
83
        if (!hash_equals($password, $partial->Password)) {
84
            $form->sessionError(
85
                _t(
86
                    PasswordForm::class . '.PASSWORDERROR',
87
                    'Password incorrect, please check your password and try again'
88
                )
89
            );
90
91
            return $this->redirectBack();
92
        }
93
94
        $request = $this->getRequest();
95
        $request->getSession()->set(PasswordForm::PASSWORD_SESSION_KEY, $partial->ID);
96
        $request->getSession()->set(self::PASSWORD_KEY, $data['Password']);
97
98
        return $this->redirect($partial->getPartialLink());
99
    }
100
101
    /**
102
     * @return PartialFormSubmission
103
     */
104
    public function getPartialFormSubmission()
105
    {
106
        return $this->partialFormSubmission;
107
    }
108
109
    /**
110
     * @param PartialFormSubmission $partialFormSubmission
111
     */
112
    public function setPartialFormSubmission($partialFormSubmission): void
113
    {
114
        $this->partialFormSubmission = $partialFormSubmission;
115
    }
116
}
117