<?php
namespace App\EventListener;
use FOS\UserBundle\Event\GetResponseNullableUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
class ResetPasswordListener implements EventSubscriberInterface
{
private UrlGeneratorInterface $router;
private TranslatorInterface $translator;
private ParameterBagInterface $parameterBag;
public function __construct(
UrlGeneratorInterface $router,
TranslatorInterface $translator,
ParameterBagInterface $parameterBag
) {
$this->router = $router;
$this->translator = $translator;
$this->parameterBag = $parameterBag;
}
public static function getSubscribedEvents(): array
{
return [
FOSUserEvents::RESETTING_RESET_INITIALIZE => [
['onResettingResetInitialize', -10]
],
FOSUserEvents::RESETTING_RESET_SUCCESS => [
['onResetPasswordComplete', -10]
],
FOSUserEvents::RESETTING_SEND_EMAIL_INITIALIZE => [
['onResettingSendEmailInitialize', -10]
],
FOSUserEvents::RESETTING_SEND_EMAIL_COMPLETED => [
['onResettingSendEmailCompleted', -10]
]
];
}
public function onResettingResetInitialize(GetResponseUserEvent $event): void
{
if (!$event->getUser()->isPasswordRequestNonExpired($this->parameterBag->get( 'fos_user_token_ttl')))
{
$session = $event->getRequest()->getSession();
$session->getFlashBag()->set(
'danger',
$this->translator->trans(
'errors.account.linkExpired',
[],
'messages',
$session->get('userLocale', 'pl')
)
);
$event->setResponse(new RedirectResponse($this->router->generate('fos_user_resetting_request')));
}
}
public function onResetPasswordComplete(FormEvent $event): void
{
$url = $this->router->generate('fos_user_security_login');
$event->setResponse( new RedirectResponse($url) );
}
public function onResettingSendEmailInitialize(GetResponseNullableUserEvent $event): void
{
$request = $event->getRequest();
$origin = $request->request->get('origin');
if ($event->getUser() === null)
{
$request->getSession()->getFlashBag()->set('danger',
$this->translator->trans(
'errors.account.emailNotExists',
[],
'messages',
$request->getSession()->get('userLocale', 'pl')
));
if ($request->request->get('from_app'))
{
$event->setResponse(new JsonResponse([
'status' => false,
'message' => $this->translator->trans(
'errors.account.emailNotExists',
[],
'messages',
$request->getSession()->get('userLocale', 'pl')
)
]));
}
elseif ($origin == 'eforum')
{
$event->setResponse(new RedirectResponse($this->router->generate('eforum_reset')));
}
elseif ($origin == 'uniqskills')
{
$event->setResponse(new RedirectResponse($this->router->generate('uniqskills_reset')));
}
else
{
$event->setResponse(new RedirectResponse($this->router->generate('fos_user_resetting_request')));
}
}
}
public function onResettingSendEmailCompleted(GetResponseUserEvent $event): void
{
$request = $event->getRequest();
$origin = $request->request->get('origin');
if ($origin == 'eforum')
{
$request->getSession()->set('origin', 'eforum');
}
elseif ($origin == 'uniqskills')
{
$request->getSession()->set('origin', 'uniqskills');
}
}
}