Passed
Pull Request — master (#34)
by
unknown
03:20
created

WebAuth::verify()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
c 0
b 0
f 0
dl 0
loc 17
rs 9.9666
cc 2
nc 2
nop 0
1
<?php
2
3
/**
4
 * Quantum PHP Framework
5
 *
6
 * An open source software development framework for PHP
7
 *
8
 * @package Quantum
9
 * @author Arman Ag. <[email protected]>
10
 * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org)
11
 * @link http://quantum.softberg.org/
12
 * @since 2.0.0
13
 */
14
15
namespace Quantum\Libraries\Auth;
16
17
use Quantum\Exceptions\ExceptionMessages;
18
use Quantum\Exceptions\AuthException;
19
use Quantum\Libraries\Hasher\Hasher;
20
use Quantum\Libraries\JWToken\JWToken;
21
22
/**
23
 * Class WebAuth
24
 * @package Quantum\Libraries\Auth
25
 */
26
class WebAuth extends BaseAuth implements AuthenticableInterface
27
{
28
29
    /**
30
     * @var Hasher
31
     */
32
    protected $hasher;
33
34
    /**
35
     * @var AuthServiceInterface
36
     */
37
    protected $authService;
38
39
    /**
40
     * @var array
41
     */
42
    protected $keys = [];
43
44
    /**
45
     * @var string
46
     */
47
    protected $authUserKey = 'auth_user';
48
49
    /**
50
     * WebAuth constructor.
51
     * @param AuthServiceInterface $authService
52
     * @param Hasher $hasher
53
     * @param JWToken|null $jwt
54
     */
55
    public function __construct(AuthServiceInterface $authService, Hasher $hasher, JWToken $jwt = null)
56
    {
57
        $this->hasher = $hasher;
58
        $this->authService = $authService;
59
        $this->keys = $this->authService->getDefinedKeys();
60
    }
61
62
    /**
63
     * Sign In
64
     * @param string $username
65
     * @param string $password
66
     * @param boolean $remember
67
     * @return boolean
68
     * @throws AuthException
69
     */
70
    public function signin($mailer, $username, $password, $remember = false)
71
    {
72
        $user = $this->authService->get($this->keys['usernameKey'], $username);
73
74
        if (empty($user)) {
75
            throw new AuthException(ExceptionMessages::INCORRECT_AUTH_CREDENTIALS);
76
        }
77
78
        if (!$this->hasher->check($password, $user[$this->keys['passwordKey']])) {
79
            throw new AuthException(ExceptionMessages::INCORRECT_AUTH_CREDENTIALS);
80
        }
81
82
        if (!$this->isActivated($user)) {
83
            throw new AuthException(ExceptionMessages::INACTIVE_ACCOUNT);
84
        }
85
86
        if ($remember) {
87
            $this->setRememberToken($user);
88
        }
89
90
        if (config()->get('tow_step_verification')) {
91
92
            $user = $this->towStepVerification($mailer, $user);
93
        }
94
95
        session()->set($this->authUserKey, $this->filterFields($user));
96
97
        return true;
98
    }
99
100
    /**
101
     * Sign Out
102
     * @throws \Exception
103
     */
104
    public function signout()
105
    {
106
        if (session()->has($this->authUserKey)) {
107
            session()->delete($this->authUserKey);
108
            $this->removeRememberToken();
109
        }
110
    }
111
112
    /**
113
     * User
114
     * @return mixed|null
115
     * @throws \Exception
116
     */
117
    public function user()
118
    {
119
        if (session()->has($this->authUserKey)) {
120
            return (object) session()->get($this->authUserKey);
121
        } else if (cookie()->has($this->keys['rememberTokenKey'])) {
122
            $user = $this->checkRememberToken();
123
            if ($user) {
124
                return $this->user();
125
            }
126
        }
127
        return null;
128
    }
129
130
    /**
131
     * Verify
132
     * @return bool
133
     * @throws \Exception
134
     */
135
136
    public function verify()
137
    {
138
        if (session()->has($this->authUserKey)) {
139
140
            $user = (array) $this->user();
141
142
            $this->authService->update($this->keys['usernameKey'], $user[$this->keys['usernameKey']], [
143
                $this->keys['verificationCode'] => null
144
            ]);
145
146
            $user = $this->authService->get($this->keys['usernameKey'], $user[$this->keys['usernameKey']]);
147
148
            session()->set($this->authUserKey, $this->filterFields($user));
149
            return true;
150
        } else  {
151
152
            return false;
153
        }
154
    }
155
156
    /**
157
     * Check Remember Token
158
     * @return bool|mixed
159
     * @throws \Exception
160
     */
161
    private function checkRememberToken()
162
    {
163
        $user = $this->authService->get($this->keys['rememberTokenKey'], cookie()->get($this->keys['rememberTokenKey']));
164
        if (!empty($user)) {
165
            $this->setRememberToken($user);
166
            return $user;
167
        }
168
        return false;
169
    }
170
171
    /**
172
     * Set Remember Token
173
     * @param array $user
174
     * @throws \Exception
175
     */
176
    private function setRememberToken(array $user)
177
    {
178
        $rememberToken = $this->generateToken();
179
180
        $this->authService->update($this->keys['usernameKey'], $user[$this->keys['usernameKey']], [
181
            $this->keys['rememberTokenKey'] => $rememberToken
182
        ]);
183
184
        session()->set($this->authUserKey, $this->filterFields($user));
185
        cookie()->set($this->keys['rememberTokenKey'], $rememberToken);
186
    }
187
188
    /**
189
     * Remove Remember Token
190
     * @throws \Exception
191
     */
192
    private function removeRememberToken()
193
    {
194
        if (cookie()->has($this->keys['rememberTokenKey'])) {
195
            $user = $this->authService->get($this->keys['rememberTokenKey'], cookie()->get($this->keys['rememberTokenKey']));
196
            
197
            if (!empty($user)) {
198
                $this->authService->update($this->keys['rememberTokenKey'], $user[$this->keys['rememberTokenKey']], [
199
                    $this->keys['rememberTokenKey'] => ''
200
                ]);
201
            }
202
203
            cookie()->delete($this->keys['rememberTokenKey']);
204
        }
205
    }
206
207
}
208