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 — 2.x (#64)
by Jindřich
07:10
created

User::setAuthConfirmed()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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