src/EventListener/UserResolveListener.php line 48

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: grego
  5.  * Date: 02/06/2022
  6.  * Time: 11:02
  7.  */
  8. namespace App\EventListener;
  9. use App\Entity\BruteForceLogs;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\DependencyInjection\ContainerInterface;
  12. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  13. use Symfony\Component\Security\Core\User\UserProviderInterface;
  14. use Trikoder\Bundle\OAuth2Bundle\Event\UserResolveEvent;
  15. final class UserResolveListener
  16. {
  17.     /**
  18.      * @var UserProviderInterface
  19.      */
  20.     private $userProvider;
  21.     /**
  22.      * @var UserPasswordEncoderInterface
  23.      */
  24.     private $userPasswordEncoder;
  25.     private $container;
  26.     private $em;
  27.     /**
  28.      * @param UserProviderInterface $userProvider
  29.      * @param UserPasswordEncoderInterface $userPasswordEncoder
  30.      */
  31.     public function __construct(UserProviderInterface $userProviderUserPasswordEncoderInterface $userPasswordEncoderContainerInterface $containerEntityManagerInterface $em)
  32.     {
  33.         $this->userProvider $userProvider;
  34.         $this->userPasswordEncoder $userPasswordEncoder;
  35.         $this->container $container;
  36.         $this->em $em;
  37.     }
  38.     /**
  39.      * @param UserResolveEvent $event
  40.      */
  41.     public function onUserResolve(UserResolveEvent $event): void
  42.     {
  43.         $user $this->userProvider->loadUserByUsername($event->getUsername());
  44.         $ip $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
  45.         $brutForceLogs $this->em->getRepository(BruteForceLogs::class)->findBy(array('ipAddress' => $ip), array('id' => 'DESC'));
  46.         if($brutForceLogs){
  47.             $brutForceLog $brutForceLogs[0];
  48.         } else {
  49.             $brutForceLog = new BruteForceLogs();
  50.             $brutForceLog->setIpAddress($ip);
  51.             $brutForceLog->setAttempts(0);
  52.         }
  53.         $loginAttempts $brutForceLog->getAttempts() + 1;
  54.         $brutForceLog->setAttempts($loginAttempts);
  55.         if ($loginAttempts == 3) {
  56.             $unlockDate = new \DateTime();
  57.             $unlockDate->modify('+3 minutes');
  58.             $brutForceLog->setUnlockDate($unlockDate);
  59.         } elseif ($loginAttempts == 6) {
  60.             $unlockDate = new \DateTime();
  61.             $unlockDate->modify('+10 minutes');
  62.             $brutForceLog->setUnlockDate($unlockDate);
  63.         } elseif ($loginAttempts == 9) {
  64.             $unlockDate = new \DateTime();
  65.             $unlockDate->modify('+60 minutes');
  66.             $brutForceLog->setUnlockDate($unlockDate);
  67.         } elseif($loginAttempts 9){
  68.             $brutForceLog->setUnlockDate(null);
  69.             $brutForceLog->setAttempts(1);
  70.         }
  71.         $this->em->persist($brutForceLog);
  72.         $this->em->flush();
  73.         if (null === $user) {
  74.             return;
  75.         }
  76.         if (!$this->userPasswordEncoder->isPasswordValid($user$event->getPassword())) {
  77.             return;
  78.         }
  79.         $now = new \DateTime();
  80.         if ($brutForceLog->getUnlockDate() >= $now) {
  81.             return;
  82.         }
  83.         $brutForceLog->setAttempts(0);
  84.         $this->em->persist($brutForceLog);
  85.         $this->em->flush();
  86.         $event->setUser($user);
  87.     }
  88. }