Passed
Pull Request — master (#39)
by Cesar
14:06 queued 07:20
created

AskForAccessCode::handle()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 20
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 9
c 2
b 0
f 0
dl 0
loc 20
rs 9.9666
cc 4
nc 6
nop 2
1
<?php
2
3
namespace MagicLink\Middlewares;
4
5
use Closure;
6
use Illuminate\Contracts\Encryption\DecryptException;
7
use Illuminate\Http\Request;
8
use Illuminate\Support\Arr;
9
use Illuminate\Support\Facades\Hash;
10
use MagicLink\MagicLink;
11
12
class AskForAccessCode
13
{
14
    /**
15
     * Handle an incoming request.
16
     *
17
     * @param  \Illuminate\Http\Request  $request
18
     * @param  \Closure  $next
19
     * @return mixed
20
     */
21
    public function handle(Request $request, Closure $next)
22
    {
23
        if ($this->isAccessCodeValid($request->route('token'), $request->get('magic.link-access-code'))) {
0 ignored issues
show
Bug introduced by
It seems like $request->route('token') can also be of type Illuminate\Routing\Route and null and object; however, parameter $token of MagicLink\Middlewares\As...de::isAccessCodeValid() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

23
        if ($this->isAccessCodeValid(/** @scrutinizer ignore-type */ $request->route('token'), $request->get('magic.link-access-code'))) {
Loading history...
24
            // access code is valid
25
            setcookie('magic.link-access-code', encrypt($request->get('magic.link-access-code')), 0, '/');
26
27
            return redirect($request->url());
28
        }
29
30
        try {
31
            $accessCode = decrypt(Arr::get($_COOKIE, 'magic.link-access-code'));
32
            // Validate access_code
33
            if ($this->isAccessCodeValid($request->route('token'), $accessCode)) {
34
                return $next($request);
35
            }
36
        } catch (DecryptException $e) {
37
            // empty value in cookie
38
        }
39
40
        return response(view('magiclink::ask-for-access-code-form'), 403);
41
    }
42
43
    private function isAccessCodeValid(string $token, ?string $accessCode): bool
44
    {
45
        if ($accessCode === null) {
46
            return false;
47
        }
48
49
        $magicLink = MagicLink::getValidMagicLinkByToken($token);
50
51
        return Hash::check($accessCode, $magicLink->access_code);
52
    }
53
}
54