<?php
namespace Entrepreneurs\Bundle\Enseignant\Controller;
use Entrepreneurs\Bundle\Admin\Controller\AdminController;
use Entrepreneurs\Bundle\AppBundle\Manager\MailManager;
use Entrepreneurs\Bundle\AppBundle\Propel\Enseignant;
use Entrepreneurs\Bundle\AppBundle\Propel\EnseignantQuery;
use Entrepreneurs\Bundle\AppBundle\Propel\EnseignantStatut;
use Entrepreneurs\Bundle\Enseignant\Form\MdpOublieType;
use Entrepreneurs\Bundle\Enseignant\Form\MdpReinitialisationType;
use Entrepreneurs\Bundle\Enseignant\Form\MdpType;
use Entrepreneurs\Bundle\Enseignant\Form\ProfilType;
use Entrepreneurs\Bundle\FrontBundle\Form\ConnexionMailType;
use Propel\Runtime\Exception\PropelException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class SecurityController extends AdminController
{
/**
* @Route(name="enseignant_security_connexion", path="/auth/connexion")
*/
public function connexionAction(Request $request): Response
{
$session = $request->getSession();
if ($this->getUser()) {
return $this->forward('Entrepreneurs\Bundle\Enseignant\Controller\DemandeInterventionController::listAction');
}
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
} else {
$error = $session->get(Security::AUTHENTICATION_ERROR);
$session->remove(Security::AUTHENTICATION_ERROR);
}
return $this->renderTwig('Enseignant:Security:connexion.html.twig', [
'last_username' => $session->get(Security::LAST_USERNAME),
'error' => $error,
]);
}
/**
* @Route(name="enseignant_profil_edition", path="/profil/edition")
*/
public function profilAction(Request $request): Response
{
$enseignant = $this->getUser();
$formProfil = $this->createForm(ProfilType::class, $this->getUser(), ['request' => $request, 'enseignant' => $enseignant]);
$formMdp = $this->createForm(MdpType::class, $this->getUser());
if ($request->isMethod('post') && $dataProfil = $request->get($formProfil->getName())) {
$formProfil->submit($dataProfil);
if ($formProfil->isValid()) {
$formProfil->getData()
->setDateMajFront(time())
->save();
$this->addFlash('success', 'Les informations de votre profil ont bien été mises à jour.');
return $this->redirectToRoute('enseignant_profil_edition');
} else {
$this->addFlash('warning', "Les informations de votre profil n'ont pu être enregistrées. Veuillez vérifier les informations renseignées et essayez à nouveau.");
}
}
if ($request->isMethod('post') && $dataMdp = $request->get($formMdp->getName())) {
$formMdp->submit($dataMdp);
if ($formMdp->isValid()) {
$enseignant = $formMdp->getData();
$enseignant
->setMotDePasse($enseignant->getPlainMotDePasse())
->setDateMajFront(time())
->save();
$this->addFlash('success', 'Votre mot de passe a correctement été mis à jour. Pensez à le renseigner lors de votre prochaine connexion.');
return $this->redirectToRoute('enseignant_profil_edition');
} else {
$this->addFlash('warning', "Votre mot de passe n'a pu être mis à jour. Veuillez vérifier qu'il a été correctement renseigné.");
}
}
return $this->render('Enseignant/Security/profil.html.twig', [
'formProfil' => $formProfil->createView(),
'formMdp' => $formMdp->createView(),
]);
}
/**
* @Route(name="enseignant_security_activation", path="/auth/activation/{mail}/{uid}")
*/
public function activationAction(Request $request, MailManager $manager, string $mail, string $uid): Response
{
$enseignant = EnseignantQuery::create()
->filterByEmail($mail)
->filterByUid($uid)
->findOne();
if (!$enseignant) {
$this->addFlash('warning', "Votre compte n\'a pu être activé. Si vous avez suivi le lien d\'activation renseigné dans notre précédent mail, merci de nous contacter.");
return $this->redirectToRoute('enseignant_homepage');
}
$form = $this->createForm(MdpReinitialisationType::class, $enseignant);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid()) {
$this->addFlash('warning', 'Une erreur est survenue lors de l\'enregistrement du mot passe.');
} else {
$enseignant = $form->getData();
$enseignant->setDateMajFront(time());
$enseignant->setStatutId(EnseignantStatut::ACTIF);
$enseignant->setDateActivation(new \DateTime());
$enseignant->save();
$this->addFlash('success', 'Votre mot de passe a bien été enregistrer.');
}
}
if (EnseignantStatut::EN_ATTENTE_ACTIVATION === $enseignant->getStatutId() || null === $enseignant->getMotDePasse()) {
return $this->render('Enseignant/Security/activation.html.twig', [
'enseignant' => $enseignant,
'form' => $form->createView(),
]);
}
return $this->render('Enseignant/Security/activation_suite.html.twig', [
'enseignant' => $enseignant,
]);
}
/**
* @Route(name="enseignant_security_mdp_oublie", path="/auth/mot-de-passe/oublie")
*/
public function mdpOublieAction(Request $request, MailManager $manager): Response
{
$params = [];
$form = $this->createForm(MdpOublieType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$enseignant = EnseignantQuery::create()
->filterByEnabled()
->findOneByEmail($data['email']);
if ($enseignant) {
$enseignant->setStatutId(EnseignantStatut::MDP_REINITIALISE);
$enseignant->setDateMajFront(time());
$enseignant->generateNewTokenReinitialisation();
$enseignant->save();
$manager->sendMailEnseignantMdpOublie($enseignant);
$params['enseignant'] = $enseignant;
$this->addFlash('success', 'La demande de changement de mot de passe a bien été prise en compte.');
} else {
$this->addFlash('warning', "Aucun utilisateur valide avec l'identifiant renseigné n'a pu être trouvé dans notre système.");
}
}
$params['form'] = $form->createView();
return $this->renderTwig('Enseignant:Security:mdp_oublie.html.twig', $params);
}
/**
* @Route(name="enseignant_security_mdp_reinitialisation", path="/auth/mot-de-passe/reinitialisation/{uid}/{mail}/{token}")
*/
public function mdpReinitialisationAction(Request $request, string $uid, string $mail, string $token): Response
{
$enseignant = EnseignantQuery::create()
->filterByUid($uid)
->filterByEmail($mail)
->filterByTokenReinitialisation($token)
->filterByStatutId(EnseignantStatut::MDP_REINITIALISE)
->findOne();
if (!$enseignant) {
$this->addFlash('warning', "Votre lien d'activation n'est plus valide.");
return $this->redirectToRoute('enseignant_homepage');
}
$form = $this->createForm(MdpReinitialisationType::class, $enseignant);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$enseignant->setDateMajFront(time());
$enseignant->setStatutId(EnseignantStatut::ACTIF)->save();
$this->addFlash('success', 'Votre mot de passe a bien été réinitialisé. Vous pouvez désormais vous connecter avec ce dernier.');
return $this->redirectToRoute('enseignant_security_connexion');
}
$this->addFlash('warning', 'Une erreur est survenue lors du changement de mot passe.');
}
return $this->renderTwig('Enseignant:Security:mdp_reinitialisation.html.twig', ['form' => $form->createView()]);
}
#[Route(path: '/auth/connexion/mail', name: 'enseignant_security_connexion_mail')]
public function connexionMailAction(
Request $request,
MailManager $mailManager,
LoginLinkHandlerInterface $loginLinkHandler
): Response {
if ($this->getUser() instanceof Enseignant) {
return $this->redirectToRoute('admin_homepage');
}
$form = $this->createForm(ConnexionMailType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$enseignant = EnseignantQuery::create()->findOneByEmail($data['email']);
if ($enseignant) {
try {
$mailManager->sendMailEnseignantConnexionMail($enseignant, $loginLinkHandler->createLoginLink($enseignant)->getUrl());
} catch (PropelException|LoaderError|RuntimeError|SyntaxError) {
$this->addFlash('danger', 'Une erreur est survenue.');
}
return $this->render('Front/Security/connexion_email.html.twig', [
'email' => $enseignant->getEmail(),
'bodyClass' => 'refonte-2023',
]);
}
$this->addFlash('warning', 'L\'identifiant est invalide.');
}
return $this->render('Front/Security/connexion_email.html.twig', [
'form' => $form->createView(),
'bodyClass' => 'refonte-2023',
'title' => 'Connexion pour les Enseignants',
'username' => $request->get('username', ''),
]);
}
#[Route(path: '/auth/connexion-link', name: 'enseignant_security_connexion_link')]
public function connexionLinkAction(LoginLinkHandlerInterface $loginLinkHandler): Response
{
return $this->redirectToRoute('enseignant_homepage');
}
}