Completed
Push — ezp_30973 ( feb262...9f83f6 )
by
unknown
14:39
created

PasswordHashService::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
5
 * @license For full copyright and license information view LICENSE file distributed with this source code.
6
 */
7
declare(strict_types=1);
8
9
namespace eZ\Publish\Core\Repository\User;
10
11
use eZ\Publish\API\Repository\Values\User\User;
12
use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException;
13
14
/**
15
 * @internal
16
 */
17
final class PasswordHashService implements PasswordHashServiceInterface
18
{
19
    /** @var int */
20
    private $hashType;
21
22
    public function __construct(int $hashType = User::DEFAULT_PASSWORD_HASH)
23
    {
24
        $this->hashType = $hashType;
25
    }
26
27
    public function getDefaultHashType(): int
28
    {
29
        return $this->hashType;
30
    }
31
32
    public function createPasswordHash(string $password, ?int $hashType = null): string
33
    {
34
        $hashType = $hashType ?? $this->hashType;
35
36
        switch ($hashType) {
37
            case User::PASSWORD_HASH_BCRYPT:
38
                return password_hash($password, PASSWORD_BCRYPT);
39
40
            case User::PASSWORD_HASH_PHP_DEFAULT:
41
                return password_hash($password, PASSWORD_DEFAULT);
42
43
            default:
44
                throw new InvalidArgumentException('hashType', "Password hash type '$hashType' is not recognized");
45
        }
46
    }
47
48
    public function isValidPassword(string $plainPassword, string $passwordHash, ?int $hashType = null): bool
49
    {
50
        if ($hashType === User::PASSWORD_HASH_BCRYPT || $hashType === User::PASSWORD_HASH_PHP_DEFAULT) {
51
            // In case of bcrypt let php's password functionality do it's magic
52
            return password_verify($plainPassword, $passwordHash);
53
        }
54
55
        // Randomize login time to protect against timing attacks
56
        usleep(random_int(0, 30000));
57
58
        return $passwordHash === $this->createPasswordHash($plainPassword, $hashType);
59
    }
60
}
61