BackupCode::getSalt()   A
last analyzed

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