Passed
Push — master ( 9a4b58...860dbf )
by Cesar
07:21 queued 18s
created

AccessCode::getAccessCodeFromCookie()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 8
c 1
b 0
f 1
dl 0
loc 14
rs 10
cc 3
nc 4
nop 0
1
<?php
2
3
namespace MagicLink;
4
5
use Illuminate\Contracts\Encryption\DecryptException;
6
use Illuminate\Support\Arr;
7
use Illuminate\Support\Facades\Hash;
8
9
trait AccessCode
10
{
11
    protected $cookieName = 'magic-link-access-code';
12
13
    public function getResponseAccessCode()
14
    {
15
        $responseFromForm = $this->getResponseAccessCodeFromForm();
16
17
        return $responseFromForm
18
            ? $responseFromForm
19
            : $this->getResponseAccessCodeFromCookie();
20
    }
21
22
    /**
23
     * Check if access code is right.
24
     */
25
    private function checkAccessCode(?string $accessCode): bool
26
    {
27
        if ($accessCode === null) {
28
            return false;
29
        }
30
31
        return Hash::check($accessCode, $this->access_code);
32
    }
33
34
    /**
35
     * The action was protected with an access code.
36
     */
37
    private function protectedWithAcessCode(): bool
38
    {
39
        return ! is_null($this->access_code ?? null);
40
    }
41
42
    private function getResponseAccessCodeFromForm()
43
    {
44
        $accessCode = $this->getAccessCodeFromForm();
45
46
        if (
47
            $this->protectedWithAcessCode()
48
            && $accessCode
49
            && $this->checkAccessCode($accessCode)
50
        ) {
51
            return redirect(request()->url())->withCookie(
52
                cookie(
53
                    $this->cookieName,
54
                    encrypt($accessCode),
55
                    0,
56
                    '/'
57
                )
58
            );
59
        }
60
61
        return null;
62
    }
63
64
    private function getResponseAccessCodeFromCookie()
65
    {
66
        if ($this->protectedWithAcessCode()) {
67
            if ($this->getAccessCodeFromCookie()) {
68
                if ($this->checkAccessCode($this->getAccessCodeFromCookie())) {
69
                    return null;
70
                }
71
            }
72
73
            return response(view('magiclink::ask-for-access-code-form'), 403);
74
        }
75
76
        return null;
77
    }
78
79
    private function getAccessCodeFromForm()
80
    {
81
        return request()->get('access-code');
82
    }
83
84
    private function getAccessCodeFromCookie()
85
    {
86
        $accessCodeCookies = request()->cookie($this->cookieNam);
0 ignored issues
show
Bug introduced by
The property cookieNam does not exist on MagicLink\AccessCode. Did you mean cookieName?
Loading history...
87
88
        if (! $accessCodeCookies) {
89
            return null;
90
        }
91
92
        try {
93
            $cookie = Arr::last((array) $accessCodeCookies);
94
95
            return decrypt($cookie);
96
        } catch (DecryptException $e) {
97
            return null;
98
        }
99
    }
100
}
101