|
|
|
@ -5,6 +5,7 @@ namespace App\Controller; |
|
|
|
use App\Entity\User; |
|
|
|
use App\Entity\User; |
|
|
|
use App\Form\ChangePasswordFormType; |
|
|
|
use App\Form\ChangePasswordFormType; |
|
|
|
use App\Form\ResetPasswordRequestFormType; |
|
|
|
use App\Form\ResetPasswordRequestFormType; |
|
|
|
|
|
|
|
use Doctrine\ORM\EntityManagerInterface; |
|
|
|
use Symfony\Bridge\Twig\Mime\TemplatedEmail; |
|
|
|
use Symfony\Bridge\Twig\Mime\TemplatedEmail; |
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
|
|
|
use Symfony\Component\HttpFoundation\RedirectResponse; |
|
|
|
use Symfony\Component\HttpFoundation\RedirectResponse; |
|
|
|
@ -12,8 +13,9 @@ use Symfony\Component\HttpFoundation\Request; |
|
|
|
use Symfony\Component\HttpFoundation\Response; |
|
|
|
use Symfony\Component\HttpFoundation\Response; |
|
|
|
use Symfony\Component\Mailer\MailerInterface; |
|
|
|
use Symfony\Component\Mailer\MailerInterface; |
|
|
|
use Symfony\Component\Mime\Address; |
|
|
|
use Symfony\Component\Mime\Address; |
|
|
|
|
|
|
|
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; |
|
|
|
use Symfony\Component\Routing\Annotation\Route; |
|
|
|
use Symfony\Component\Routing\Annotation\Route; |
|
|
|
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; |
|
|
|
use Symfony\Contracts\Translation\TranslatorInterface; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface; |
|
|
|
use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface; |
|
|
|
@ -25,11 +27,13 @@ class ResetPasswordController extends AbstractController |
|
|
|
{ |
|
|
|
{ |
|
|
|
use ResetPasswordControllerTrait; |
|
|
|
use ResetPasswordControllerTrait; |
|
|
|
|
|
|
|
|
|
|
|
private $resetPasswordHelper; |
|
|
|
private ResetPasswordHelperInterface $resetPasswordHelper; |
|
|
|
|
|
|
|
private EntityManagerInterface $entityManager; |
|
|
|
|
|
|
|
|
|
|
|
public function __construct(ResetPasswordHelperInterface $resetPasswordHelper) |
|
|
|
public function __construct(ResetPasswordHelperInterface $resetPasswordHelper, EntityManagerInterface $entityManager) |
|
|
|
{ |
|
|
|
{ |
|
|
|
$this->resetPasswordHelper = $resetPasswordHelper; |
|
|
|
$this->resetPasswordHelper = $resetPasswordHelper; |
|
|
|
|
|
|
|
$this->entityManager = $entityManager; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -37,7 +41,7 @@ class ResetPasswordController extends AbstractController |
|
|
|
* |
|
|
|
* |
|
|
|
* @Route("", name="app_forgot_password_request") |
|
|
|
* @Route("", name="app_forgot_password_request") |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function request(Request $request, MailerInterface $mailer): Response |
|
|
|
public function request(Request $request, MailerInterface $mailer, TranslatorInterface $translator): Response |
|
|
|
{ |
|
|
|
{ |
|
|
|
$form = $this->createForm(ResetPasswordRequestFormType::class); |
|
|
|
$form = $this->createForm(ResetPasswordRequestFormType::class); |
|
|
|
$form->handleRequest($request); |
|
|
|
$form->handleRequest($request); |
|
|
|
@ -45,7 +49,8 @@ class ResetPasswordController extends AbstractController |
|
|
|
if ($form->isSubmitted() && $form->isValid()) { |
|
|
|
if ($form->isSubmitted() && $form->isValid()) { |
|
|
|
return $this->processSendingPasswordResetEmail( |
|
|
|
return $this->processSendingPasswordResetEmail( |
|
|
|
$form->get('email')->getData(), |
|
|
|
$form->get('email')->getData(), |
|
|
|
$mailer |
|
|
|
$mailer, |
|
|
|
|
|
|
|
$translator |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -77,7 +82,7 @@ class ResetPasswordController extends AbstractController |
|
|
|
* |
|
|
|
* |
|
|
|
* @Route("/reset/{token}", name="app_reset_password") |
|
|
|
* @Route("/reset/{token}", name="app_reset_password") |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public function reset(Request $request, UserPasswordEncoderInterface $passwordEncoder, string $token = null): Response |
|
|
|
public function reset(Request $request, UserPasswordHasherInterface $userPasswordHasher, TranslatorInterface $translator, string $token = null): Response |
|
|
|
{ |
|
|
|
{ |
|
|
|
if ($token) { |
|
|
|
if ($token) { |
|
|
|
// We store the token in session and remove it from the URL, to avoid the URL being |
|
|
|
// We store the token in session and remove it from the URL, to avoid the URL being |
|
|
|
@ -96,8 +101,9 @@ class ResetPasswordController extends AbstractController |
|
|
|
$user = $this->resetPasswordHelper->validateTokenAndFetchUser($token); |
|
|
|
$user = $this->resetPasswordHelper->validateTokenAndFetchUser($token); |
|
|
|
} catch (ResetPasswordExceptionInterface $e) { |
|
|
|
} catch (ResetPasswordExceptionInterface $e) { |
|
|
|
$this->addFlash('reset_password_error', sprintf( |
|
|
|
$this->addFlash('reset_password_error', sprintf( |
|
|
|
'There was a problem validating your reset request - %s', |
|
|
|
'%s - %s', |
|
|
|
$e->getReason() |
|
|
|
$translator->trans(ResetPasswordExceptionInterface::MESSAGE_PROBLEM_VALIDATE, [], 'ResetPasswordBundle'), |
|
|
|
|
|
|
|
$translator->trans($e->getReason(), [], 'ResetPasswordBundle') |
|
|
|
)); |
|
|
|
)); |
|
|
|
|
|
|
|
|
|
|
|
return $this->redirectToRoute('app_forgot_password_request'); |
|
|
|
return $this->redirectToRoute('app_forgot_password_request'); |
|
|
|
@ -111,14 +117,14 @@ class ResetPasswordController extends AbstractController |
|
|
|
// A password reset token should be used only once, remove it. |
|
|
|
// A password reset token should be used only once, remove it. |
|
|
|
$this->resetPasswordHelper->removeResetRequest($token); |
|
|
|
$this->resetPasswordHelper->removeResetRequest($token); |
|
|
|
|
|
|
|
|
|
|
|
// Encode the plain password, and set it. |
|
|
|
// Encode(hash) the plain password, and set it. |
|
|
|
$encodedPassword = $passwordEncoder->encodePassword( |
|
|
|
$encodedPassword = $userPasswordHasher->hashPassword( |
|
|
|
$user, |
|
|
|
$user, |
|
|
|
$form->get('plainPassword')->getData() |
|
|
|
$form->get('plainPassword')->getData() |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
$user->setPassword($encodedPassword); |
|
|
|
$user->setPassword($encodedPassword); |
|
|
|
$this->getDoctrine()->getManager()->flush(); |
|
|
|
$this->entityManager->flush(); |
|
|
|
|
|
|
|
|
|
|
|
// The session is cleaned up after the password has been changed. |
|
|
|
// The session is cleaned up after the password has been changed. |
|
|
|
$this->cleanSessionAfterReset(); |
|
|
|
$this->cleanSessionAfterReset(); |
|
|
|
@ -131,9 +137,9 @@ class ResetPasswordController extends AbstractController |
|
|
|
]); |
|
|
|
]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private function processSendingPasswordResetEmail(string $emailFormData, MailerInterface $mailer): RedirectResponse |
|
|
|
private function processSendingPasswordResetEmail(string $emailFormData, MailerInterface $mailer, TranslatorInterface $translator): RedirectResponse |
|
|
|
{ |
|
|
|
{ |
|
|
|
$user = $this->getDoctrine()->getRepository(User::class)->findOneBy([ |
|
|
|
$user = $this->entityManager->getRepository(User::class)->findOneBy([ |
|
|
|
'email' => $emailFormData, |
|
|
|
'email' => $emailFormData, |
|
|
|
]); |
|
|
|
]); |
|
|
|
|
|
|
|
|
|
|
|
@ -150,15 +156,16 @@ class ResetPasswordController extends AbstractController |
|
|
|
// Caution: This may reveal if a user is registered or not. |
|
|
|
// Caution: This may reveal if a user is registered or not. |
|
|
|
// |
|
|
|
// |
|
|
|
// $this->addFlash('reset_password_error', sprintf( |
|
|
|
// $this->addFlash('reset_password_error', sprintf( |
|
|
|
// 'There was a problem handling your password reset request - %s', |
|
|
|
// '%s - %s', |
|
|
|
// $e->getReason() |
|
|
|
// $translator->trans(ResetPasswordExceptionInterface::MESSAGE_PROBLEM_HANDLE, [], 'ResetPasswordBundle'), |
|
|
|
|
|
|
|
// $translator->trans($e->getReason(), [], 'ResetPasswordBundle') |
|
|
|
// )); |
|
|
|
// )); |
|
|
|
|
|
|
|
|
|
|
|
return $this->redirectToRoute('app_check_email'); |
|
|
|
return $this->redirectToRoute('app_check_email'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
$email = (new TemplatedEmail()) |
|
|
|
$email = (new TemplatedEmail()) |
|
|
|
->from(new Address('k.jouini@tyr.local', 'SfyCAS Mail Bot')) |
|
|
|
->from(new Address('mailer@sfycas.local', '"Sfycas mail bot"')) |
|
|
|
->to($user->getEmail()) |
|
|
|
->to($user->getEmail()) |
|
|
|
->subject('Your password reset request') |
|
|
|
->subject('Your password reset request') |
|
|
|
->htmlTemplate('reset_password/email.html.twig') |
|
|
|
->htmlTemplate('reset_password/email.html.twig') |
|
|
|
|