Completed
Push — master ( b0b47a...abbd86 )
by Arman
15s queued 11s
created

WebAuth::user()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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