Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.25% covered (warning)
85.25%
52 / 61
84.62% covered (warning)
84.62%
11 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
Users
85.25% covered (warning)
85.25%
52 / 61
84.62% covered (warning)
84.62%
11 / 13
15.72
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 byLogin
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byAuthToken
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byOneTimeToken
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
2
 bySession
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 byUid
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 byId
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 savePanelLocale
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 remember
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 forget
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 createOneTimeToken
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 removeOneTimeToken
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getUserOrNull
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray;
6
7use Celema\Quma\Database;
8
9class Users
10{
11    public function __construct(
12        protected Database $db,
13    ) {}
14
15    public function byLogin(string $login): ?User
16    {
17        return $this->getUserOrNull(
18            $this->db->users->get([
19                'login' => $login,
20            ])->first(),
21        );
22    }
23
24    public function byAuthToken(#[\SensitiveParameter] string $token): ?User
25    {
26        return $this->getUserOrNull(
27            $this->db->users->get([
28                'token' => hash('sha256', $token),
29            ])->first(),
30        );
31    }
32
33    public function byOneTimeToken(#[\SensitiveParameter] string $token): ?User
34    {
35        $hashedToken = hash('sha256', $token);
36
37        $user = $this->getUserOrNull(
38            $this->db->users->get([
39                'onetimetoken' => $hashedToken,
40            ])->first(),
41        );
42
43        if ($user) {
44            $this->db->users->removeOneTimeToken([
45                'token' => $hashedToken,
46            ])->run();
47        }
48
49        return $user;
50    }
51
52    public function bySession(string $hash): ?User
53    {
54        return $this->getUserOrNull(
55            $this->db->users->get([
56                'sessionhash' => $hash,
57            ])->first(),
58        );
59    }
60
61    public function byUid(string $uid): ?User
62    {
63        return $this->getUserOrNull(
64            $this->db->users->get([
65                'uid' => $uid,
66            ])->first(),
67        );
68    }
69
70    public function byId(int $id): ?User
71    {
72        return $this->getUserOrNull(
73            $this->db->users->get([
74                'usr' => $id,
75            ])->first(),
76        );
77    }
78
79    public function savePanelLocale(int $userId, ?string $locale): bool
80    {
81        return $this->db->users->savePanelLocale([
82            'usr' => $userId,
83            'locale' => $locale,
84        ])->run();
85    }
86
87    public function remember(string $hash, int $userId, string $expires): bool
88    {
89        return $this->db->users->remember([
90            'hash' => $hash,
91            'user' => $userId,
92            'expires' => $expires,
93        ])->run();
94    }
95
96    public function forget(string $hash): bool
97    {
98        return $this->db->users->forget([
99            'hash' => $hash,
100        ])->run();
101    }
102
103    public function createOneTimeToken(int $userId): string
104    {
105        $token = bin2hex(random_bytes(32));
106
107        $this->db->users->saveOneTimeToken([
108            'token' => hash('sha256', $token),
109            'usr' => $userId,
110        ])->run();
111
112        return $token;
113    }
114
115    public function removeOneTimeToken(#[\SensitiveParameter] string $token): void
116    {
117        $this->db->users->removeOneTimeToken([
118            'token' => hash('sha256', $token),
119        ])->run();
120    }
121
122    protected function getUserOrNull(?array $data): ?User
123    {
124        if ($data) {
125            return new User($data);
126        }
127
128        return null;
129    }
130}