Csrf   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 18
c 1
b 0
f 0
dl 0
loc 63
ccs 26
cts 26
cp 1
rs 10
wmc 9

8 Methods

Rating   Name   Duplication   Size   Complexity  
A addRule() 0 2 1
A checkToken() 0 9 2
A renderErrors() 0 3 1
A addRules() 0 2 1
A __construct() 0 3 1
A removeRules() 0 2 1
A getCsrfLib() 0 3 1
A setHidden() 0 8 1
1
<?php
2
3
namespace kalanis\kw_forms\Controls\Security;
4
5
6
use ArrayAccess;
7
use kalanis\kw_forms\Controls\Hidden;
8
use kalanis\kw_forms\Interfaces\ICsrf;
9
use kalanis\kw_rules\Interfaces\IRules;
10
11
12
/**
13
 * Class Csrf
14
 * @package kalanis\kw_forms\Controls\Security
15
 * Hidden entry which adds CSRF check
16
 * Must be child of hidden due necessity of pre-setting position in render
17
 * This one set another value to compare, on the other way multisend sets nothing
18
 */
19
class Csrf extends Hidden
20
{
21
    protected ICsrf $csrf;
22
    protected string $csrfTokenAlias = '';
23
24 3
    public function __construct()
25
    {
26 3
        $this->csrf = $this->getCsrfLib();
27 3
    }
28
29
    /**
30
     * @return ICsrf
31
     * @codeCoverageIgnore link adapter remote resource
32
     */
33 1
    protected function getCsrfLib(): ICsrf
34
    {
35 1
        return new Csrf\JWT();
36
    }
37
38 2
    public function setHidden(string $alias, ArrayAccess &$cookie, string $errorMessage): self
39
    {
40 2
        $this->csrf->init($cookie);
41 2
        $this->setEntry($alias);
42 2
        $this->csrfTokenAlias = "{$alias}SubmitCheck";
43 2
        $this->setValue($this->csrf->getToken($this->csrfTokenAlias));
44 2
        parent::addRule(IRules::SATISFIES_CALLBACK, $errorMessage, [$this, 'checkToken']);
45 2
        return $this;
46
    }
47
48
    /**
49
     * @param mixed $incomingValue
50
     * @return bool
51
     */
52 2
    public function checkToken($incomingValue): bool
53
    {
54 2
        if ($this->csrf->checkToken(strval($incomingValue), $this->csrfTokenAlias)) {
55
            // token reload
56 2
            $this->csrf->removeToken($this->csrfTokenAlias);
57 2
            $this->setValue($this->csrf->getToken($this->csrfTokenAlias));
58 2
            return true;
59
        } else {
60 2
            return false;
61
        }
62
    }
63
64 2
    public function addRule(/** @scrutinizer ignore-unused */ string $ruleName, /** @scrutinizer ignore-unused */ string $errorText, /** @scrutinizer ignore-unused */ ...$args): void
65
    {
66
        // no additional rules applicable
67 2
    }
68
69 2
    public function addRules(/** @scrutinizer ignore-unused */ iterable $rules = []): void
70
    {
71
        // no rules add applicable
72 2
    }
73
74 2
    public function removeRules(): void
75
    {
76
        // no rules removal applicable
77 2
    }
78
79 2
    public function renderErrors($errors): string
80
    {
81 2
        return '';
82
    }
83
}
84