<?php
namespace App\EventSubscriber\User;
use App\Utils\Emails\UserEmail;
use App\Entity\User\User;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Event\GetResponseNullableUserEvent;
use FOS\UserBundle\Doctrine\UserManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ResettingSubscriber implements EventSubscriberInterface
{
private $router;
private $container;
private $userEmail;
private $translator;
private $userManager;
public function __construct(
UrlGeneratorInterface $router,
ContainerInterface $container,
UserEmail $userEmail,
TranslatorInterface $translator,
UserManager $userManager
) {
$this->router = $router;
$this->container = $container;
$this->userEmail = $userEmail;
$this->translator = $translator;
$this->userManager = $userManager;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::RESETTING_RESET_SUCCESS => array('onResettingResetSuccess', -10),
FOSUserEvents::RESETTING_SEND_EMAIL_INITIALIZE => array('onResettingSendEmailInitialize', -10),
FOSUserEvents::RESETTING_SEND_EMAIL_CONFIRM => array('onResettingSendEmailConfirm', -10),
FOSUserEvents::RESETTING_RESET_REQUEST => array('onResettingResetRequest', -10)
);
}
public function onResettingResetSuccess(FormEvent $event)
{
$request = $event->getRequest();
$user = $event->getForm()->getData();
// Envoi mail de notification
$redirect = $this->router->generate('fos_user_profile_show');
$this->userEmail->alerteModificationMotdepasse($user);
if ($request->isXmlHttpRequest()) {
$event->setResponse(new JsonResponse(array('success' => true)));
}
else {
$response = new RedirectResponse($redirect);
$event->setResponse($response);
}
}
public function onResettingSendEmailConfirm(GetResponseUserEvent $event)
{
$ttl = $this->container->getParameter('fos_user.resetting.retry_ttl');
$user = $event->getUser();
$this->userEmail->alerteReinitialisationMotdepasse($user);
$user->setPasswordRequestedAt(new \DateTime());
$this->userManager->updateUser($user);
$event->setResponse(new JsonResponse(array('success' => true, 'message' => $this->translator->trans('reset_password_email_success', ['%timeout%' => ceil($ttl/3600)]))));
}
public function onResettingSendEmailInitialize(GetResponseNullableUserEvent $event)
{
$ttl = $this->container->getParameter('fos_user.resetting.retry_ttl');
$user = $event->getUser();
$request = $event->getRequest();
if (is_null($user)) {
$event->setResponse(new JsonResponse(array('success' => false, 'errors' => $this->translator->trans('reset_password_email_not_found'))));
}
if (!is_null($user) && $user->isPasswordRequestNonExpired($ttl)) {
$event->setResponse(new JsonResponse(array('success' => false, 'errors' => $this->translator->trans('reset_password_email_ttl_ko', ['%timeout%' => ceil($ttl/3600)]))));
}
}
/**
* @param GetResponseUserEvent $event
*/
public function onResettingResetRequest(GetResponseUserEvent $event)
{
$request = $event->getRequest();
if (!$event->getUser()->isAccountNonLocked()) {
if ($request->isXmlHttpRequest()) {
$event->setResponse(new JsonResponse(array('success' => false, 'errors' => 'Votre compte est désactivé.')));
}
else {
$event->setResponse(new RedirectResponse($this->router->generate('fos_user_resetting_request')));
}
}
}
}