<?php
namespace Acme\SudcmsBundle\Controller;
use Acme\SudcmsBundle\Entity\AuthUser;
use Acme\SudcmsBundle\Form\ResetPassType;
use Acme\SudcmsBundle\Repository\AuthUserRepository;
use Acme\SudcmsBundle\Repository\SiteReferencementRepository;
use Acme\SudcmsBundle\Service\MailerService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController {
#[Route(path: ['/admin', '/administration'], name: 'admin_app_login')]
public function login(AuthenticationUtils $authenticationUtils, Request $request): Response {
$host = $this->getParameter('SITE1_HOST');
if (substr($_SERVER['HTTP_HOST'], 0, 3) != '127' && $request->getHost() != $host) {
return $this->redirect('https://'.$host.'/admin');
}
if ($this->getUser()) {
return $this->redirectToRoute('admin_pages');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('@AcmeSudcms/security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
#[Route(path: '/admin/logout', name: 'admin_app_logout')]
public function logout() {
if (isset($_SESSION["CkIsAuthorized"]))
unset($_SESSION["CkIsAuthorized"]);
if (isset($_SESSION["admin_site_uid"]))
unset($_SESSION["admin_site_uid"]);
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
#[Route(path: '/mot-de-passe-oublie-admin', name: 'admin_forgotten_password')]
public function forgotten_password(Request $request, AuthUserRepository $users, MailerService $mailerService, SiteReferencementRepository $repoRef): Response {
// On initialise le formulaire
$form = $this->createForm(ResetPassType::class);
// On traite le formulaire
$form->handleRequest($request);
// Si le formulaire est valide
if ($form->isSubmitted() && $form->isValid()) {
// On récupère les données
$donnees = $form->getData();
// On cherche un utilisateur ayant cet e-mail
$user = $users->findOneByEmail($donnees['email']);
// Si l'utilisateur n'existe pas
if ($user === null) {
// On envoie une alerte disant que l'adresse e-mail est inconnue
$this->addFlash('danger', 'Cette adresse e-mail est inconnue');
// On retourne sur la page de connexion
return $this->redirectToRoute('admin_app_login');
}
// On génère un token
$token = bin2hex(random_bytes(60));
// On essaie d'écrire le token en base de données
try {
$user->setResetToken($token);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
} catch (\Exception $e) {
$this->addFlash('danger', $e->getMessage());
return $this->redirectToRoute('admin_app_login');
}
// On génère l'URL de réinitialisation de mot de passe
$url = $this->generateUrl('admin_app_reset_password', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
// On récupère le nom du site pour l'ajouter en sujet
$nameSite = $repoRef->findBy(['id' => '1']);
$nameSite = $nameSite[0]->getAccRefNamesite();
if ($nameSite != "" || $nameSite != null) {
$subject = "Mot de passe oublié administration - $nameSite ";
} else {
$subject = "Mot de passe oublié administration - Sud-Cms ";
}
$mailerService->fromName = "Sud CMS";
$mailerService->subject = $subject;
$allRecipients[] = [
"nom" => $user->getLastName(),
"prenom" => $user->getFirstName(),
"email" => $user->getEmail(),
"type" => "to"
];
$htmlContent = $this->renderView("layouts/layouts_emails/forgotten_password.html.twig", [
'url' => $url
]);
$mailerService->sendMail($allRecipients, $htmlContent);
// On crée le message flash de confirmation
$this->addFlash('success', 'Un e-mail pour réinitialisater votre mot de passe vous a été envoyé !');
// On redirige vers la page de login
return $this->redirectToRoute('admin_app_login');
}
// On envoie le formulaire à la vue
return $this->render('security/forgotten_password.html.twig', ['emailForm' => $form->createView()]);
}
#[Route(path: '/nouveau-mot-de-passe/{token}', name: 'admin_app_reset_password')]
public function resetPassword(Request $request, string $token, UserPasswordEncoderInterface $passwordEncoder) {
// On cherche un utilisateur avec le token donné
$user = $this->getDoctrine()->getRepository(AuthUser::class)->findOneBy(['reset_token' => $token]);
// Si l'utilisateur n'existe pas
if ($user === null) {
// On affiche une erreur
$this->addFlash('danger', 'Token Inconnu');
return $this->redirectToRoute('admin_app_login');
}
// Si le formulaire est envoyé en méthode post
if ($request->isMethod('POST')) {
// On supprime le token
$user->setResetToken(null);
// On chiffre le mot de passe
$user->setPassword($passwordEncoder->encodePassword($user, $request->request->get('password')));
// On stocke
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
// On crée le message flash
$this->addFlash('message', 'Mot de passe mis à jour');
// On redirige vers la page de connexion
return $this->redirectToRoute('admin_app_login');
} else {
// Si on n'a pas reçu les données, on affiche le formulaire
return $this->render('security/reset_password.html.twig', ['token' => $token]);
}
}
}