. */ namespace SP\Domain\Auth\Providers\Database; use Exception; use SP\Core\Crypt\Hash; use SP\Domain\Auth\Dtos\UserLoginDto; use SP\Domain\User\Dtos\UserDto; use SP\Domain\User\Ports\UserPassService; use SP\Domain\User\Ports\UserService; use function SP\processException; /** * Class DatabaseAuth */ final readonly class DatabaseAuth implements DatabaseAuthService { public function __construct( private UserService $userService, private UserPassService $userPassService ) { } /** * Authenticate using user's data * * @param UserLoginDto $userLoginDto * @return DatabaseAuthData */ public function authenticate(UserLoginDto $userLoginDto): DatabaseAuthData { $authUser = $this->authUser($userLoginDto); $authData = new DatabaseAuthData($this->isAuthGranted(), $authUser ?: null); return $authUser ? $authData->success() : $authData->fail(); } private function authUser(UserLoginDto $userLoginDto): UserDto|false { try { $userDto = UserDto::fromModel( $this->userService->getByLogin($userLoginDto->getLoginUser()) ); if ($userDto->isMigrate && $this->checkMigrateUser($userDto, $userLoginDto)) { $this->userPassService->migrateUserPassById($userDto->id, $userLoginDto->getLoginPass()); return $userDto; } if (Hash::checkHashKey($userLoginDto->getLoginPass(), $userDto->pass)) { return $userDto; } } catch (Exception $e) { processException($e); } return false; } private function checkMigrateUser(UserDto $userDto, UserLoginDto $userLoginDto): bool { $passHashSha = sha1($userDto->hashSalt . $userLoginDto->getLoginPass()); return ($userDto->pass === $passHashSha || $userDto->pass === md5($userLoginDto->getLoginPass()) || hash_equals( $userDto->pass, crypt($userLoginDto->getLoginPass(), $userDto->hashSalt) ) || Hash::checkHashKey($userLoginDto->getLoginPass(), $userDto->pass)); } /** * Indica si es requerida para acceder a la aplicación * * @return bool */ public function isAuthGranted(): bool { return true; } }