GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — 3.x (#86)
by
unknown
05:19
created

User::confirmAuth()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2.0185

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 6
cp 0.8333
rs 9.9666
c 0
b 0
f 0
cc 2
nc 3
nop 0
crap 2.0185
1
<?php
2
declare(strict_types = 1);
3
4
namespace Skautis;
5
6
use DateTime;
7
use Skautis\SessionAdapter\AdapterInterface;
8
use Skautis\Wsdl\WebServiceName;
9
use Skautis\Wsdl\WsdlManager;
10
11
/**
12
 * @author Petr Morávek <[email protected]>
13
 */
14
class User
15
{
16
17
    public const ID_LOGIN = 'ID_Login';
18
    public const ID_ROLE = 'ID_Role';
19
    public const ID_UNIT = 'ID_Unit';
20
    public const LOGOUT_DATE = 'LOGOUT_Date';
21
    private const AUTH_CONFIRMED = 'AUTH_Confirmed';
22
    private const SESSION_ID = 'skautis_user_data';
23
24
    /**
25
     * @var WsdlManager
26
     */
27
    private $wsdlManager;
28
29
    /**
30
     * @var AdapterInterface|null
31
     */
32
    private $session;
33
34
    /**
35
     * Informace o přihlášení uživatele
36
     *
37
     * @var array<string, mixed>
38
     */
39
    protected $loginData = [];
40
41
    /**
42
     * @param WsdlManager $wsdlManager
43
     * @param AdapterInterface|null $session
44
     */
45 6
    public function __construct(WsdlManager $wsdlManager, AdapterInterface $session = null)
46
    {
47 6
        $this->wsdlManager = $wsdlManager;
48 6
        $this->session = $session;
49
50 6
        if ($session !== null && $session->has(self::SESSION_ID)) {
51
            $this->loginData = (array)$session->get(self::SESSION_ID);
52
        }
53 6
    }
54
55 5
    public function getLoginId(): ?string
56
    {
57 5
        return $this->loginData[self::ID_LOGIN] ?? null;
58
    }
59
60 2
    public function getRoleId(): ?int
61
    {
62 2
        return $this->loginData[self::ID_ROLE] ?? null;
63
    }
64
65 2
    public function getUnitId(): ?int
66
    {
67 2
        return $this->loginData[self::ID_UNIT] ?? null;
68
    }
69
70
    /**
71
     * Vrací datum a čas automatického odhlášení ze skautISu
72
     */
73 3
    public function getLogoutDate(): ?DateTime
74
    {
75 3
        return $this->loginData[self::LOGOUT_DATE] ?? null;
76
    }
77
78
    /**+
79
     * Hromadné nastavení po přihlášení
80
     */
81 3
    public function setLoginData(
82
      ?string $loginId = null,
83
      ?int $roleId = null,
84
      ?int $unitId = null,
85
      ?DateTime $logoutDate = null
86
    ): self {
87 3
        $this->loginData = [];
88
89 3
        return $this->updateLoginData($loginId, $roleId, $unitId, $logoutDate);
90
    }
91
92
    /**
93
     * Hromadná změna údajů, bez vymazání stávajících
94
     */
95 3
    public function updateLoginData(
96
      ?string $loginId = null,
97
      ?int $roleId = null,
98
      ?int $unitId = null,
99
      ?DateTime $logoutDate = null
100
    ): self {
101 3
        if ($loginId !== null) {
102 3
            $this->loginData[self::ID_LOGIN] = $loginId;
103
        }
104
105 3
        if ($roleId !== null) {
106 3
            $this->loginData[self::ID_ROLE] = $roleId;
107
        }
108
109 3
        if ($unitId !== null) {
110 3
            $this->loginData[self::ID_UNIT] = $unitId;
111
        }
112
113 3
        if ($logoutDate !== null) {
114 3
            $this->loginData[self::LOGOUT_DATE] = $logoutDate;
115
        }
116
117 3
        $this->saveToSession();
118
119 3
        return $this;
120
    }
121
122
    /**
123
     * Hromadný reset dat po odhlášení
124
     */
125 1
    public function resetLoginData(): self
126
    {
127 1
        return $this->setLoginData();
128
    }
129
130
    /**
131
     * Kontoluje, jestli je přihlášení platné.
132
     * Pro správné fungování je nezbytně nutné, aby byl na serveru nastaven správný čas.
133
     *
134
     * @param bool $hardCheck vynutí kontrolu přihlášení na serveru
135
     */
136 2
    public function isLoggedIn(bool $hardCheck = false): bool
137
    {
138 2
        if (empty($this->loginData[self::ID_LOGIN])) {
139 1
            return false;
140
        }
141
142 1
        if ($hardCheck || !$this->isAuthConfirmed()) {
143 1
            $this->confirmAuth();
144
        }
145
146 1
        if ($this->getLogoutDate() === null) {
147
          return false;
148
        }
149
150 1
        return $this->isAuthConfirmed() && $this->getLogoutDate()->getTimestamp() > time();
151
    }
152
153
    /**
154
     * Bylo potvrzeno přihlášení dotazem na skautIS?
155
     */
156 1
    protected function isAuthConfirmed(): bool
157
    {
158 1
        return !empty($this->loginData[self::AUTH_CONFIRMED]);
159
    }
160
161 1
    protected function setAuthConfirmed(bool $isConfirmed): void
162
    {
163 1
        $this->loginData[self::AUTH_CONFIRMED] = $isConfirmed;
164 1
        $this->saveToSession();
165 1
    }
166
167
    /**
168
     * Potvrdí (a prodlouží) přihlášení dotazem na skautIS.
169
     */
170 1
    protected function confirmAuth(): void
171
    {
172
        try {
173 1
            $this->updateLogoutTime();
174
            $this->setAuthConfirmed(true);
175 1
        } catch (\Exception $e) {
176 1
            $this->setAuthConfirmed(false);
177
        }
178 1
    }
179
180
    /**
181
     * Prodloužení přihlášení o 30 min
182
     *
183
     * @throws UnexpectedValueException pokud se nepodaří naparsovat datum
184
     */
185 1
    public function updateLogoutTime(): self
186
    {
187 1
        $loginId = $this->getLoginId();
188 1
        if ($loginId === null) {
189
            // Nemáme token, uživatel není přihlášen a není, co prodlužovat
190
            return $this;
191
        }
192
193 1
        $result = $this->wsdlManager->getWebService(WebServiceName::USER_MANAGEMENT, $loginId)->call('LoginUpdateRefresh', ['ID' => $loginId]);
194
195
        $logoutDate = preg_replace('/\.(\d*)$/', '', $result->DateLogout); //skautIS vrací sekundy včetně desetinné části
196
        $tz = new \DateTimeZone('Europe/Prague');
197
        $logoutDate = DateTime::createFromFormat('Y-m-d\TH:i:s', $logoutDate, $tz);
198
        if ($logoutDate === false) {
199
            throw new UnexpectedValueException("Could not parse logout date '{$result->DateLogout}'.");
200
        }
201
        $this->loginData[self::LOGOUT_DATE] = $logoutDate;
202
203
        $this->saveToSession();
204
205
        return $this;
206
    }
207
208
    /**
209
     * Uloží nastavení do session
210
     */
211 3
    protected function saveToSession(): void
212
    {
213 3
        if ($this->session !== null) {
214
            $this->session->set(self::SESSION_ID, $this->loginData);
215
        }
216 3
    }
217
}
218