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
Push — 3.x ( 52ff30...48a2e9 )
by Jindřich
12s queued 11s
created

User   A

Complexity

Total Complexity 30

Size/Duplication

Total Lines 213
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 87.5%

Importance

Changes 0
Metric Value
dl 0
loc 213
ccs 63
cts 72
cp 0.875
rs 10
c 0
b 0
f 0
wmc 30
lcom 1
cbo 3

14 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 3
A getLoginId() 0 4 1
A getRoleId() 0 4 1
A getUnitId() 0 4 1
A getLogoutDate() 0 4 1
A setLoginData() 0 10 1
A updateLoginData() 0 26 5
A resetLoginData() 0 7 1
A isLoggedIn() 0 16 6
A isAuthConfirmed() 0 4 1
A setAuthConfirmed() 0 5 1
A confirmAuth() 0 13 3
A updateLogoutTime() 0 22 3
A saveToSession() 0 6 2
1
<?php
2
declare(strict_types = 1);
3
4
namespace Skaut\Skautis;
5
6
use DateTime;
7
use Skaut\Skautis\SessionAdapter\AdapterInterface;
8
use Skaut\Skautis\Wsdl\WebServiceName;
9
use Skaut\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 7
    public function __construct(WsdlManager $wsdlManager, AdapterInterface $session = null)
46
    {
47 7
        $this->wsdlManager = $wsdlManager;
48 7
        $this->session = $session;
49
50 7
        if ($session !== null && $session->has(self::SESSION_ID)) {
51
            $this->loginData = (array)$session->get(self::SESSION_ID);
52
        }
53 7
    }
54
55 6
    public function getLoginId(): ?string
56
    {
57 6
        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,
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
        $this->loginData = [];
128 1
        $this->saveToSession();
129
130 1
        return $this;
131
    }
132
133
    /**
134
     * Kontoluje, jestli je přihlášení platné.
135
     * Pro správné fungování je nezbytně nutné, aby byl na serveru nastaven správný čas.
136
     *
137
     * @param bool $hardCheck vynutí kontrolu přihlášení na serveru
138
     */
139 3
    public function isLoggedIn(bool $hardCheck = false): bool
140
    {
141 3
        if (empty($this->loginData[self::ID_LOGIN])) {
142 2
            return false;
143
        }
144
145 1
        if ($hardCheck || !$this->isAuthConfirmed()) {
146 1
            $this->confirmAuth();
147
        }
148
149 1
        if ($this->getLogoutDate() === null) {
150
          return false;
151
        }
152
153 1
        return $this->isAuthConfirmed() && $this->getLogoutDate()->getTimestamp() > time();
154
    }
155
156
    /**
157
     * Bylo potvrzeno přihlášení dotazem na skautIS?
158
     */
159 1
    protected function isAuthConfirmed(): bool
160
    {
161 1
        return !empty($this->loginData[self::AUTH_CONFIRMED]);
162
    }
163
164 1
    protected function setAuthConfirmed(bool $isConfirmed): void
165
    {
166 1
        $this->loginData[self::AUTH_CONFIRMED] = $isConfirmed;
167 1
        $this->saveToSession();
168 1
    }
169
170
  /**
171
   * Potvrdí (a prodlouží) přihlášení dotazem na skautIS.
172
   *
173
   * @throws \Exception Pokud se authentikace nepovede
174
   */
175 1
    protected function confirmAuth(): void
176
    {
177
        try {
178 1
          $logoutTimeUpdated = $this->updateLogoutTime();
179 1
          if(!$logoutTimeUpdated) {
180
              throw new \RuntimeException('Updating logout time failed');
181
            }
182 1
            $this->setAuthConfirmed(true);
183
        } catch (\Exception $e) {
184
            $this->setAuthConfirmed(false);
185
            throw $e;
186
        }
187 1
    }
188
189
    /**
190
     * Prodloužení přihlášení o 30 min
191
     *
192
     * @throws UnexpectedValueException pokud se nepodaří naparsovat datum
193
     */
194 1
    public function updateLogoutTime(): bool
195
    {
196 1
        $loginId = $this->getLoginId();
197 1
        if ($loginId === null) {
198
            // Nemáme token, uživatel není přihlášen a není, co prodlužovat
199
            return false;
200
        }
201
202 1
        $result = $this->wsdlManager->getWebService(WebServiceName::USER_MANAGEMENT, $loginId)->LoginUpdateRefresh(['ID' => $loginId]);
203
204 1
        $logoutDate = preg_replace('/\.(\d*)$/', '', $result->DateLogout); //skautIS vrací sekundy včetně desetinné části
205 1
        $tz = new \DateTimeZone('Europe/Prague');
206 1
        $logoutDate = DateTime::createFromFormat('Y-m-d\TH:i:s', $logoutDate, $tz);
207 1
        if ($logoutDate === false) {
208
            throw new UnexpectedValueException("Could not parse logout date '{$result->DateLogout}'.");
209
        }
210 1
        $this->loginData[self::LOGOUT_DATE] = $logoutDate;
211
212 1
        $this->saveToSession();
213
214 1
        return true;
215
    }
216
217
    /**
218
     * Uloží nastavení do session
219
     */
220 3
    protected function saveToSession(): void
221
    {
222 3
        if ($this->session !== null) {
223
            $this->session->set(self::SESSION_ID, $this->loginData);
224
        }
225 3
    }
226
}
227