src/Controller/SecurityController.php line 49
<?phpnamespace App\Controller;use App\Entity\EmailEnvoi;use App\Entity\User;use Doctrine\Persistence\ManagerRegistry;use Doctrine\Persistence\ObjectManager;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\Exception\TransportExceptionInterface;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;class SecurityController extends AbstractController{private ObjectManager $em;public function __construct(ManagerRegistry $doctrine){$this->em = $doctrine->getManager();}public function connexion(AuthenticationUtils $authenticationUtils): Response{$error = null;if ($this->getUser()) {return $this->redirectToRoute('homepage');}// get the login error if there is oneif($authenticationUtils->getLastAuthenticationError()){$error = "La connexion a échouée, merci de réessayer.";}// last username entered by the user$lastUsername = $authenticationUtils->getLastUsername();return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error, 'captcha_site_key' => $this->getParameter('captcha_site_key')]);}public function motDePassePerdu(Request $request, MailerInterface $mailer, TokenGeneratorInterface $tokenGenerator): Response{if ($request->isMethod('POST')) {$secret = $this->getParameter('captcha_secret_key');$verifyResponse = file_get_contents('https://hcaptcha.com/siteverify?secret=' . $secret . '&response=' . $request->request->get('h-captcha-response') . '&remoteip=' . $_SERVER['REMOTE_ADDR']);$responseData = json_decode($verifyResponse);if (!$responseData->success) {throw new CustomUserMessageAuthenticationException('Vous devez valider le captcha pour recevoir un nouveau mot de passe.');}$email = $request->request->get('email');$user = $this->em->getRepository(User::class)->findOneBy(['email'=>$email]);if ($user) {$this->sendResetPasswordMail($mailer, $tokenGenerator, $user);}$this->addFlash('info', 'Si cet email est lié à un compte, vous recevrez un email pour réinitialiser votre mot de passe');return $this->redirectToRoute('app_password_lost');}return $this->render('security/password_lost.html.twig', ['captcha_site_key' => $this->getParameter('captcha_site_key')]);}public function sendResetPasswordMail($mailer, $tokenGenerator, $user){$token = $tokenGenerator->generateToken();try{$user->setResetToken($token);$this->em->flush();} catch (\Exception $e) {$this->addFlash('warning', $e->getMessage());return $this->redirectToRoute('homepage');}$url = $this->generateUrl('app_reset_password', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);$expediteur = $this->getParameter('adresse_mail_default');$emailExp = $this->em->getRepository(EmailEnvoi::class)->findOneBy([]);if($emailExp){$expediteur = $emailExp->getEmail();}$mail = (new TemplatedEmail())->from($expediteur)->to($user->getEmail())->subject('Réinitialisation de mot de passe')->htmlTemplate('security/template_mail.html.twig')// pass variables (name => value) to the template->context(['url' => $url,'user' => $user,]);try {$mailer->send($mail);return true;}catch (TransportExceptionInterface $exception){throw new ($exception);}}public function reinitialisationMotDePasse(Request $request, string $token, UserPasswordHasherInterface $passwordEncoder): Response{$user = $this->em->getRepository(User::class)->findOneBy(['resetToken'=>$token]);if ($user === null) {$this->addFlash('danger', 'La demande a expirée ! Veuillez renouveller la procédure.');return $this->redirectToRoute('homepage');}//Reset avec le mail envoyéif ($request->isMethod('POST')) {$uppercase = preg_match('@[A-Z]@', $_POST['password']);$lowercase = preg_match('@[a-z]@', $_POST['password']);$number = preg_match('@[0-9]@', $_POST['password']);$char = preg_match('/[\/~`\!@#\$%\^&\*\(\)_\-\+=\{\}\[\]\|;:\<\>,\.\?]/', $_POST['password']);if(!$uppercase || !$lowercase || !$number || !$char || strlen($_POST['password']) < 12) {$request->getSession()->getFlashBag()->add('danger',"Le mot de passe ne respecte pas les conditions demandées ( au moins 1 minuscule, 1 majuscule, 1 chiffre, 1 caractère spécial et minimum 12 caractères )");return $this->redirectToRoute('app_reset_password',['token'=>$token]);}if($_POST['password'] != $_POST['confirm-password']){$request->getSession()->getFlashBag()->add('danger',"Les mots de passe doivent être identiques.");return $this->redirectToRoute('app_reset_password',['token'=>$token]);}$user->setResetToken(null);$user->setPassword($passwordEncoder->hashPassword($user, $request->request->get('password')));$this->em->flush();$this->addFlash('success', 'Mot de passe mis à jour !');return $this->redirectToRoute('app_login');}return $this->render('security/reset_password.html.twig', ['token' => $token]);}}