src/Controller/ResetPasswordController.php line 41
<?phpnamespace App\Controller;use App\Entity\Settings;use App\Entity\User;use App\IlaveU\FrontBundle\Entity\Page;use App\Form\ChangePasswordFormType;use App\Form\ResetPasswordRequestFormType;use App\Repository\SettingsRepository;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mime\Address;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Contracts\Translation\TranslatorInterface;use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;#[Route('/{_locale}/reset-password')]class ResetPasswordController extends AbstractController{use ResetPasswordControllerTrait;public function __construct(private ResetPasswordHelperInterface $resetPasswordHelper,private EntityManagerInterface $entityManager) {}/*** Display & process form to request a password reset.*/#[Route('', name: 'app_forgot_password_request')]public function request(Request $request, MailerInterface $mailer, TranslatorInterface $translator,SettingsRepository $settingsRepository): Response{$form = $this->createForm(ResetPasswordRequestFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {return $this->processSendingPasswordResetEmail($form->get('username')->getData(),$mailer,$translator);}$settingsMain = $settingsRepository->findOneBy(["code"=>"main"]);$templatesPath = "@IlaveU/FrontBundle/Themes/".$settingsMain->getAssetFolderName()."/templates/reset_password/request.html.twig";return $this->render($templatesPath, ['requestForm' => $form->createView(),'background_body'=>"url('/themes/".strtolower($settingsMain->getAssetFolderName())."/admin/images/bg-body.jpg')",]);}/*** Confirmation page after a user has requested a password reset.*/#[Route('/check-email', name: 'app_check_email')]public function checkEmail(SettingsRepository $settingsRepository): Response{// Generate a fake token if the user does not exist or someone hit this page directly.// This prevents exposing whether or not a user was found with the given email address or notif (null === ($resetToken = $this->getTokenObjectFromSession())) {$resetToken = $this->resetPasswordHelper->generateFakeResetToken();}$settingsMain = $settingsRepository->findOneBy(["code"=>"main"]);$templatesPath = "@IlaveU/FrontBundle/Themes/".$settingsMain->getAssetFolderName()."/templates/reset_password/check_email.html.twig";return $this->render($templatesPath, ['resetToken' => $resetToken,'background_body'=>"url('/themes/".strtolower($settingsMain->getAssetFolderName())."/admin/images/bg-body.jpg')",]);}/*** Validates and process the reset URL that the user clicked in their email.*/#[Route('/reset/{token}', name: 'app_reset_password')]public function reset(string $token = null,Request $request, UserPasswordHasherInterface $passwordHasher, TranslatorInterface $translator, SettingsRepository $settingsRepository): Response{if ($token) {// We store the token in session and remove it from the URL, to avoid the URL being// loaded in a browser and potentially leaking the token to 3rd party JavaScript.$this->storeTokenInSession($token);//return $this->redirectToRoute('app_reset_password');}$token = $this->getTokenFromSession();if (null === $token) {throw $this->createNotFoundException('No reset password token found in the URL or in the session.');}try {$user = $this->resetPasswordHelper->validateTokenAndFetchUser($token);} catch (ResetPasswordExceptionInterface $e) {/*$this->addFlash('reset_password_error', sprintf('%s - %s',$translator->trans(ResetPasswordExceptionInterface::MESSAGE_PROBLEM_VALIDATE, [], 'ResetPasswordBundle'),$translator->trans($e->getReason(), [], 'ResetPasswordBundle')));*/return $this->redirectToRoute('app_forgot_password_request',["tokenAlreadyExist"=>true]);}// The token is valid; allow the user to change their password.$form = $this->createForm(ChangePasswordFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {// A password reset token should be used only once, remove it.$this->resetPasswordHelper->removeResetRequest($token);// Encode(hash) the plain password, and set it.$encodedPassword = $passwordHasher->hashPassword($user,$form->get('plainPassword')->getData());$user->setPassword($encodedPassword);$this->entityManager->flush();// The session is cleaned up after the password has been changed.$this->cleanSessionAfterReset();$html = <<<HTML<!DOCTYPE html><html><head><title>Redirecting...</title><meta charset="UTF-8"><script type="text/javascript">window.onload = function () {window.location.href = "ilaveuapp://(tabs)/myAccount";setTimeout(function () {window.location.href = "https://ilaveu.gebanalysis.cloud/login";}, 6000);};</script></head><body><p>Redirectiion vers l'application I Lave U...</p></body></html>HTML;return new Response($html);return $this->redirectToRoute('login',["passwordUpdated"=>true]);}$settingsMain = $settingsRepository->findOneBy(["code"=>"main"]);$templatesPath = "@IlaveU/FrontBundle/Themes/".$settingsMain->getAssetFolderName()."/templates/reset_password/reset.html.twig";return $this->render($templatesPath, ['resetForm' => $form->createView(),'background_body'=>"url('/themes/".strtolower($settingsMain->getAssetFolderName())."/admin/images/bg-body.jpg')",]);}private function processSendingPasswordResetEmail(string $emailFormData, MailerInterface $mailer, TranslatorInterface $translator): RedirectResponse{$settingsMain = $this->entityManager->getRepository(Settings::class)->findOneBy(["code"=>"main"]);$user = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $emailFormData,]);// Do not reveal whether a user account was found or not.if (!$user) {return $this->redirectToRoute('app_check_email');}try {$resetToken = $this->resetPasswordHelper->generateResetToken($user);} catch (ResetPasswordExceptionInterface $e) {// If you want to tell the user why a reset email was not sent, uncomment// the lines below and change the redirect to 'app_forgot_password_request'.// Caution: This may reveal if a user is registered or not.//// $this->addFlash('reset_password_error', sprintf(// '%s - %s',// $translator->trans(ResetPasswordExceptionInterface::MESSAGE_PROBLEM_HANDLE, [], 'ResetPasswordBundle'),// $translator->trans($e->getReason(), [], 'ResetPasswordBundle')// ));return $this->redirectToRoute('app_check_email');}$mailPageInstance = $this->entityManager->getRepository(Page::class)->findOneBy(["slug"=>"reset-password"]);$linkPath = $settingsMain->getRootUrl().$this->generateUrl("app_reset_password",["token"=>$resetToken->getToken()]);$pathTemplate = '@IlaveU/FrontBundle/Themes/'.$settingsMain->getAssetFolderName().'/templates/pages/mailPage.html.twig';if($settingsMain->getAssetFolderName() == "Taxiciel"){$pathTemplate = '@IlaveU/FrontBundle/Themes/'.$settingsMain->getAssetFolderName().'/templates/front/pages/mailPage.html.twig';}$email = (new TemplatedEmail())->from(new Address($settingsMain->getEmail(), $settingsMain->getProjectName()))->to($user->getUsername())//->cc("new Address('samir.mengadi@gmail.com', $settingsMain->getProjectName())")->subject('Votre demande de réinitialisation de mot de passe')->htmlTemplate($pathTemplate)->context(['page' => $mailPageInstance,"entity"=>["resetTokenLink"=>'<a href="'.$linkPath.'">Cliquez ici pour confirmer la réinitialisation de mot de passe </a>'],]);$mailer->send($email);// Store the token object in session for retrieval in check-email route.$this->setTokenObjectInSession($resetToken);return $this->redirectToRoute('app_check_email');}}