91 lines
2.9 KiB
PHP
91 lines
2.9 KiB
PHP
<?php
|
|
namespace Incoviba\API\Common\Service;
|
|
|
|
use Carbon\Carbon;
|
|
use Incoviba\Mapper\User as UserMapper;
|
|
use Incoviba\Mapper\Login as LoginMapper;
|
|
use Incoviba\Mapper\Config as ConfigMapper;
|
|
use Incoviba\Model\Auth\User;
|
|
|
|
class Login
|
|
{
|
|
protected UserMapper $userMapper;
|
|
protected LoginMapper $loginMapper;
|
|
protected ConfigMapper $configMapper;
|
|
public function __construct(UserMapper $userMapper, LoginMapper $loginMapper, ConfigMapper $configMapper)
|
|
{
|
|
$this->userMapper = $userMapper;
|
|
$this->loginMapper = $loginMapper;
|
|
$this->configMapper = $configMapper;
|
|
}
|
|
|
|
public function setToken(User $user, string $selector, string $token)
|
|
{
|
|
$this->logout($user);
|
|
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
|
|
$data = [
|
|
'user_id' => $user->id,
|
|
'time' => (new \DateTimeImmutable())->format('Y-m-d H:i:s '),
|
|
'selector' => $selector,
|
|
'token' => $token,
|
|
'status' => 1
|
|
];
|
|
$status = false;
|
|
try {
|
|
$login = $this->loginMapper->create($data);
|
|
$status = $this->loginMapper->save($login);
|
|
} catch (\PDOException $e) {
|
|
$login = false;
|
|
}
|
|
$output = [
|
|
'input' => $data,
|
|
'login' => $login,
|
|
'logged_in' => $status
|
|
];
|
|
if ($login !== false) {
|
|
$output['expires'] = $login->time->modify("+{$expiration->value} second")->getTimestamp();
|
|
}
|
|
return $output;
|
|
}
|
|
public function logout(User $user): bool
|
|
{
|
|
$logins = $this->validLogins($user);
|
|
if ($logins === false or count($logins) === 0) {
|
|
return true;
|
|
}
|
|
$bool = true;
|
|
foreach ($logins as $login) {
|
|
$login->status = false;
|
|
$bool &= $this->loginMapper->save($login);
|
|
}
|
|
return $bool;
|
|
}
|
|
public function validLogins(User $user): bool|array {
|
|
return $this->loginMapper->fetchActiveByUser($user->id);
|
|
}
|
|
public function validate($request): bool
|
|
{
|
|
list($selector, $token) = explode(':', $request->token);
|
|
$login = $this->loginMapper->fetchBySelector($selector);
|
|
if (!$login or !$login->status or !password_verify($token, $login->token)) {
|
|
return false;
|
|
}
|
|
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
|
|
if ((Carbon::createFromTimestamp($login->time->getTimestamp()))->diffInSeconds() > $expiration->value) {
|
|
$login->status = false;
|
|
$this->loginMapper->save($login);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
public function getUser($request): User|bool
|
|
{
|
|
list($selector, $token) = explode(':', $request->token);
|
|
$login = $this->loginMapper->fetchBySelector($selector);
|
|
if (!$login or !$login->status) {
|
|
return false;
|
|
}
|
|
return $login->user;
|
|
}
|
|
}
|