src/EventSubscriber/ResetPasswordBlockedCreator.php line 52

  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface,
  4.     Symfony\Component\HttpKernel\KernelEvents,
  5.     Symfony\Component\HttpKernel\Event\ViewEvent,
  6.     Symfony\Component\HttpFoundation\RequestStack;
  7. use ApiPlatform\Symfony\EventListener\EventPriorities;
  8. use App\DTO\ResetPasswordLinkDTO,
  9.     App\DTO\ResetPasswordChangeDTO,
  10.     App\DTO\CustomerResetPasswordLinkDTO,
  11.     App\DTO\CustomerResetPasswordChangeDTO,
  12.     App\Repository\ResetPasswordBlockedRepository,
  13.     App\Repository\ResetPasswordEntryRepository,
  14.     App\StateProcessor\ResetPassword\EntityCreator,
  15.     App\Entity\Admin,
  16.     App\Entity\Customer;
  17. final class ResetPasswordBlockedCreator implements EventSubscriberInterface
  18. {
  19.     const PERIOD '15 secs';
  20.     const MAX 3;
  21.     private RequestStack $requestStack;
  22.     private ResetPasswordBlockedRepository $blockedRepository;
  23.     private ResetPasswordEntryRepository $entryRepository;
  24.     private EntityCreator $entityCreator;
  25.     public function __construct(
  26.         RequestStack $requestStack,
  27.         ResetPasswordBlockedRepository $blockedRepository,
  28.         ResetPasswordEntryRepository $entryRepository,
  29.         EntityCreator $entityCreator
  30.     ) {
  31.         $this->requestStack $requestStack;
  32.         $this->blockedRepository $blockedRepository;
  33.         $this->entryRepository $entryRepository;
  34.         $this->entityCreator $entityCreator;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             KernelEvents::VIEW => [
  40.                 ['create'EventPriorities::PRE_VALIDATE]
  41.             ]
  42.         ];
  43.     }
  44.     public function create(ViewEvent $event): void
  45.     {
  46.         $entity $event->getControllerResult();
  47.         if (! $entity instanceof ResetPasswordLinkDTO
  48.             && ! $entity instanceof ResetPasswordChangeDTO
  49.             && ! $entity instanceof CustomerResetPasswordLinkDTO
  50.             && ! $entity instanceof CustomerResetPasswordChangeDTO
  51.         ) {
  52.             return;
  53.         }
  54.         $className $entity instanceof ResetPasswordLinkDTO || $entity instanceof ResetPasswordChangeDTO
  55.             Admin::class
  56.             : Customer::class;
  57.         $failedAttempts $this->entryRepository->findAllFailedAttemptsSince(
  58.             ip$this->requestStack->getCurrentRequest()?->getClientIp() ?? 'unkown',
  59.             since: new \DateTimeImmutable('- ' self::PERIOD),
  60.             limitself::MAX,
  61.             className$className
  62.         );
  63.         if (count($failedAttempts) < self::MAX) {
  64.             return;
  65.         }
  66.         $this->blockedRepository->persist(
  67.             $this->entityCreator->block($className),
  68.             true
  69.         );
  70.         return;
  71.     }
  72. }