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