<?php
namespace App\Controller;
use FOS\UserBundle\Controller\ResettingController as BaseResettingController;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class ResettingController extends BaseResettingController
{
private $retryTtl;
private $formFactory;
private $userManager;
private $eventDispatcher;
public function __construct(EventDispatcherInterface $eventDispatcher, FactoryInterface $formFactory, UserManagerInterface $userManager, TokenGeneratorInterface $tokenGenerator, MailerInterface $mailer, int $retryTtl = 120)
{
parent::__construct($eventDispatcher, $formFactory, $userManager, $tokenGenerator, $mailer, $retryTtl);
$this->retryTtl = $retryTtl;
$this->formFactory = $formFactory;
$this->userManager = $userManager;
$this->eventDispatcher = $eventDispatcher;
}
/**
* Request reset user password: show form.
* @return \Symfony\Component\HttpFoundation\ResponseBaseResettingController
*/
public function requestBack()
{
return $this->render('/admin/security/reset_password.html.twig');
}
/**
* Request reset user password: show form.
* @return Response
*/
public function requestFront()
{
return $this->render('/front/security/reset_password.html.twig');
}
public function sendEmail(Request $request): Response
{
$username = $request->request->get('username');
parent::sendEmailAction($request);
if ('admin_security_send_email' === $request->attributes->get('_route')) {
return new RedirectResponse($this->generateUrl('admin_security_check_email', ['username' => $username]));
} else {
return new RedirectResponse($this->generateUrl('fos_user_resetting_check_email', ['username' => $username]));
}
}
public function checkEmail(Request $request): Response
{
$username = $request->get('username');
if (empty($username)) {
if ('admin_security_check_email' === $request->attributes->get('_route')) {
return new RedirectResponse($this->generateUrl('admin_security_reset_password'));
} else {
return new RedirectResponse($this->generateUrl('front_security_reset_password'));
}
}
if ('admin_security_check_email' === $request->attributes->get('_route')) {
return $this->render('/admin/security/check_email.html.twig', [
'tokenLifetime' => ceil($this->retryTtl / 3600),
]);
} else {
return $this->render('/front/security/check_email.html.twig', [
'tokenLifetime' => ceil($this->retryTtl / 3600),
]);
}
}
public function reset(Request $request, $token): Response
{
$user = $this->userManager->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token));
}
$event = new GetResponseUserEvent($user, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::RESETTING_RESET_INITIALIZE);
$form = $this->formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$event = new FormEvent($form, $request);
$this->eventDispatcher->dispatch($event, FOSUserEvents::RESETTING_RESET_SUCCESS);
$this->userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
if ('admin_security_reset' === $request->attributes->get('_route')) {
$url = $this->generateUrl('admin_security_login');
} else {
$url = $this->generateUrl('fos_user_security_login');
}
$response = new RedirectResponse($url);
}
$this->eventDispatcher->dispatch(
new FilterUserResponseEvent($user, $request, $response),
FOSUserEvents::RESETTING_RESET_COMPLETED
);
return $response;
}
$new = $request->get('new') && boolval(intval($request->get('new')));
if ('admin_security_reset' === $request->attributes->get('_route')) {
return $this->render('/admin/security/reset.html.twig', [
'token' => $token,
'form' => $form->createView(),
]);
} else {
return $this->render('/front/security/reset.html.twig', [
'token' => $token,
'form' => $form->createView(),
'new' => $new
]);
}
}
}