Passed
Push — master ( f57ca7...0b60a8 )
by Garion
02:37 queued 10s
created

BackupCode::getAlgorithm()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace SilverStripe\MFA\State;
4
5
use JsonSerializable;
6
use SilverStripe\Core\Injector\Injectable;
7
use SilverStripe\Security\PasswordEncryptor;
8
use SilverStripe\Security\PasswordEncryptor_NotFoundException;
9
10
/**
11
 * A container for a backup code and its hash, normally used during backup code generation
12
 */
13
class BackupCode implements JsonSerializable
14
{
15
    use Injectable;
16
17
    /**
18
     * @var string
19
     */
20
    protected $code = '';
21
22
    /**
23
     * @var string
24
     */
25
    protected $hash = '';
26
27
    /**
28
     * @var string
29
     */
30
    protected $algorithm = '';
31
32
    /**
33
     * @var string
34
     */
35
    protected $salt = '';
36
37
    /**
38
     * @param string $code
39
     * @param string $hash
40
     */
41
    public function __construct(string $code, string $hash, string $algorithm, string $salt)
42
    {
43
        $this->code = $code;
44
        $this->hash = $hash;
45
        $this->algorithm = $algorithm;
46
        $this->salt = $salt;
47
    }
48
49
    public function getCode(): string
50
    {
51
        return $this->code;
52
    }
53
54
    public function getHash(): string
55
    {
56
        return $this->hash;
57
    }
58
59
    public function getAlgorithm(): string
60
    {
61
        return $this->algorithm;
62
    }
63
64
    public function getSalt(): string
65
    {
66
        return $this->salt;
67
    }
68
69
    /**
70
     * Checks whether the provided code matches a set of provided salt, hash, and algorithm, using the
71
     * internal PasswordEncryptor API.
72
     *
73
     * @return bool
74
     */
75
    public function isValid(): bool
76
    {
77
        return PasswordEncryptor::create_for_algorithm($this->getAlgorithm())
78
            ->check($this->getHash(), $this->getCode(), $this->getSalt());
79
    }
80
81
    /**
82
     * Note: deliberately does not include "code", as this is the data that is stored in DB records
83
     */
84
    public function jsonSerialize(): array
85
    {
86
        return [
87
            'hash' => $this->getHash(),
88
            'algorithm' => $this->getAlgorithm(),
89
            'salt' => $this->getSalt(),
90
        ];
91
    }
92
}
93