<?php/** * Created by PhpStorm. * User: grego * Date: 02/06/2022 * Time: 11:02 */namespace App\EventListener;use App\Entity\BruteForceLogs;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\DependencyInjection\ContainerInterface;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Symfony\Component\Security\Core\User\UserProviderInterface;use Trikoder\Bundle\OAuth2Bundle\Event\UserResolveEvent;final class UserResolveListener{ /** * @var UserProviderInterface */ private $userProvider; /** * @var UserPasswordEncoderInterface */ private $userPasswordEncoder; private $container; private $em; /** * @param UserProviderInterface $userProvider * @param UserPasswordEncoderInterface $userPasswordEncoder */ public function __construct(UserProviderInterface $userProvider, UserPasswordEncoderInterface $userPasswordEncoder, ContainerInterface $container, EntityManagerInterface $em) { $this->userProvider = $userProvider; $this->userPasswordEncoder = $userPasswordEncoder; $this->container = $container; $this->em = $em; } /** * @param UserResolveEvent $event */ public function onUserResolve(UserResolveEvent $event): void { $user = $this->userProvider->loadUserByUsername($event->getUsername()); $ip = $this->container->get('request_stack')->getCurrentRequest()->getClientIp(); $brutForceLogs = $this->em->getRepository(BruteForceLogs::class)->findBy(array('ipAddress' => $ip), array('id' => 'DESC')); if($brutForceLogs){ $brutForceLog = $brutForceLogs[0]; } else { $brutForceLog = new BruteForceLogs(); $brutForceLog->setIpAddress($ip); $brutForceLog->setAttempts(0); } $loginAttempts = $brutForceLog->getAttempts() + 1; $brutForceLog->setAttempts($loginAttempts); if ($loginAttempts == 3) { $unlockDate = new \DateTime(); $unlockDate->modify('+3 minutes'); $brutForceLog->setUnlockDate($unlockDate); } elseif ($loginAttempts == 6) { $unlockDate = new \DateTime(); $unlockDate->modify('+10 minutes'); $brutForceLog->setUnlockDate($unlockDate); } elseif ($loginAttempts == 9) { $unlockDate = new \DateTime(); $unlockDate->modify('+60 minutes'); $brutForceLog->setUnlockDate($unlockDate); } elseif($loginAttempts > 9){ $brutForceLog->setUnlockDate(null); $brutForceLog->setAttempts(1); } $this->em->persist($brutForceLog); $this->em->flush(); if (null === $user) { return; } if (!$this->userPasswordEncoder->isPasswordValid($user, $event->getPassword())) { return; } $now = new \DateTime(); if ($brutForceLog->getUnlockDate() >= $now) { return; } $brutForceLog->setAttempts(0); $this->em->persist($brutForceLog); $this->em->flush(); $event->setUser($user); }}