<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\User;
use App\Entity\Demandeur;
use App\Entity\Jury;
use App\Service\sendNotification;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use App\Security\AppCustomAuthenticator;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use App\Form\RegistrationFormType;
use App\Form\RenewPasswordType;
use App\Form\AccountFormType;
class SecurityController extends AbstractController
{
/**
* @Route("/", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// si déja connecté
if ($this->getUser()) {
if($this->isGranted('ROLE_DEPOSANT')) {
return $this->redirectToRoute('app_demande_list');
}
else {
return $this->redirectToRoute('app_offres_index');
}
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout()
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/inscription", name="app_inscription")
*/
public function register( sendNotification $sendNotification,
Request $request,
UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $appAuthenticator): Response
{
$user = new User();
$formRegister = $this->createForm(RegistrationFormType::class, $user);
$formRegister->handleRequest($request);
if ($formRegister->isSubmitted() && $formRegister->isValid()) {
// username = email
$user->setUsername($formRegister->get('plainPassword')->getData());
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$formRegister->get('plainPassword')->getData()
)
);
// Role
$user->setRoles(['ROLE_EN_ATTENTE']);
$entityManager->persist($user);
$entityManager->flush();
$sendNotification->send("nouvelle-demande-admin-RH", NULL, $user);
//return $userAuthenticator->authenticateUser($user, $appAuthenticator, $request);
$session = $request->getSession();
$session->getFlashBag()->add('message', "Votre inscription sera finalisée après validation de votre adresse email. Vous allez recevoir un message contenant un lien permettant de finaliser l'inscription.");
return $this->redirectToRoute('app_edito');
}
return $this->render('security/register.html.twig', [
'registrationForm' => $formRegister->createView(),
]);
}
/**
* @Route("/validation/{checksum}", name="app_validate_account")
*/
public function validation( $checksum,
EntityManagerInterface $entityManager,
Request $request,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $appAuthenticator )
{
$session = $request->getSession();
if(!$checksum) {
$session->getFlashBag()->add('error', "Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
return $this->redirectToRoute('app_edito');
}
$user = $entityManager->getRepository(User::class)->findOneBy(
array('emailValidationChecksum' => $checksum)
);
if(!$user) {
$session->getFlashBag()->add('error', "Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
return $this->redirectToRoute('app_edito');
}
$user->setEmailValidationChecksum("");
$user->setRoles(['ROLE_CANDIDAT']);
$entityManager->persist($user);
$entityManager->flush();
$session->getFlashBag()->add('message', "Votre compte a été validé, vous pouvez poursuivre votre navigation.");
return $userAuthenticator->authenticateUser($user, $appAuthenticator, $request);
}
/**
* @Route("/invitation-jury/{id}/{checksum}", name="app_invitation_jury")
*/
public function invitationJury( $checksum, $id,
EntityManagerInterface $entityManager,
Request $request,
UserPasswordHasherInterface $userPasswordHasher,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $appAuthenticator )
{
$session = $request->getSession();
if(!$checksum) {
$session->getFlashBag()->add('error', "L'invitation n'a pas été trouvée ou a déjà été validée");
return $this->redirectToRoute('app_edito');
}
$user = $entityManager->getRepository(User::class)->findOneBy(
array('emailValidationChecksum' => $checksum)
);
if(!$user) {
$session->getFlashBag()->add('error', "L'invitation n'a pas été trouvée ou a déjà été validée");
return $this->redirectToRoute('app_edito');
}
// si déja connecté
$user_connected = $this->getUser();
if($user_connected) {
if($user_connected->getId() != $user->getId()) {
$session->getFlashBag()->add('error', "Vous êtes connecté avec un compte différent de celui concerné par l'invitation, veuillez vous déconnecter préalablement");
return $this->redirectToRoute('app_edito');
}
}
$demandeur = $entityManager->getRepository(Demandeur::class)->find($id);
if(!$demandeur) {
throw new InvalidArgumentException("Cette demande n'existe pas");
}
// tester l'invitation au jury
$jury = $entityManager->getRepository(Jury::class)->findOneBy(['user' => $user, 'demandeur' => $demandeur]);
if(!$jury) {
throw new InvalidArgumentException("Cette invitation au jury n'existe pas");
}
//$user->setEmailValidationChecksum("");
//$user->setRoles(['ROLE_CANDIDAT']);
//$entityManager->persist($user);
//$entityManager->flush();
if($request->get('valider_compte_ok')) {
// Validation avec compte existante complet
$user->setEmailValidationChecksum("");
$entityManager->persist($user);
$entityManager->flush();
// valider l'invitation au jury
$jury->setValide(true);
$entityManager->persist($jury);
$entityManager->flush();
$session->getFlashBag()->add('message', "Votre participation au jury a été validée");
return $this->redirectToRoute('app_demande_jury', ['id' => $id]);
}
$formAccount = $this->createForm(AccountFormType::class, $user);
$formAccount->handleRequest($request);
if ($formAccount->isSubmitted() && $formAccount->isValid()) {
// username = email
$user->setUsername($formAccount->get('email')->getData());
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$formAccount->get('plainPassword')->getData()
)
);
$user->setEmailValidationChecksum("");
$entityManager->persist($user);
$entityManager->flush();
// valider l'invitation au jury
$jury->setValide(true);
$entityManager->persist($jury);
$entityManager->flush();
$session->getFlashBag()->add('message', "Votre compte a été finalisé, votre participation au jury a été validée");
return $userAuthenticator->authenticateUser($user, $appAuthenticator, $request);
}
//$session->getFlashBag()->add('message', "Votre compte a été validé, vous pouvez poursuivre votre navigation.");
//
return $this->renderForm('security/invitation_jury.html.twig', [
'user' => $user,
'demandeur' => $demandeur,
'accountForm' => $formAccount,
]);
}
/**
* @Route("/validation/send-new/{id}/{checksum}", name="app_validate_send_new")
*/
public function send_again( $id, $checksum,
EntityManagerInterface $entityManager,
Request $request,
sendNotification $sendNotification )
{
$session = $request->getSession();
if($id && $checksum == md5('P13'.$id)) {
$user = $entityManager->getRepository(User::class)->find($id);
if($user) {
$user->setEmailValidationChecksum(md5("P13".time()));
$entityManager->persist($user);
$entityManager->flush();
$sendNotification->send("validation-email-creation-compte", NULL, $user);
$session->getFlashBag()->add('message', "Votre inscription sera finalisée après validation de votre adresse email. Vous allez recevoir un message contenant un lien permettant de finaliser l'inscription.");
return $this->redirectToRoute('app_edito');
}
}
$session->getFlashBag()->add('error', "Erreur lors du réenvoi du message");
return $this->redirectToRoute('app_edito');
}
/**
* @Route("/send-email-validation", name="app_validate_send_email_validation")
*/
public function send_again_connected( EntityManagerInterface $entityManager,
Request $request,
sendNotification $sendNotification )
{
$session = $request->getSession();
$user_connected = $this->getUser();
$user = $entityManager->getRepository(User::class)->find($user_connected->getId());
$user->setEmailValidationChecksum(md5("P13".time()));
$entityManager->persist($user);
$entityManager->flush();
$sendNotification->send("validation-email-creation-compte", NULL, $user);
return $this->redirectToRoute('app_edito');
}
/**
* @Route("/renew-pass", name="app_renew")
*/
public function renew_pass( EntityManagerInterface $entityManager,
Request $request,
sendNotification $sendNotification )
{
$session = $request->getSession();
$formRenew = $this->createForm(RenewPasswordType::class);
$formRenew->handleRequest($request);
if ($formRenew->isSubmitted() && $formRenew->isValid()) {
$user = $entityManager->getRepository(User::class)->findOneBy(
array('email' => $formRenew->get('email')->getData())
);
if($user) {
$user->setEmailValidationChecksum(md5("P13".time()));
$entityManager->persist($user);
$entityManager->flush();
$sendNotification->send("renouvellement-password", NULL, $user);
$session->getFlashBag()->add('message', "Vous allez recevoir un message contenant un lien permettant de vous connecter.");
return $this->redirectToRoute('app_edito');
}
else {
$session->getFlashBag()->add('error', "Votre compte n'a pas été retrouvé");
return $this->redirectToRoute('app_edito');
}
}
return $this->renderForm('security/renew.html.twig', [
'renewForm' => $formRenew,
]);
}
/**
* @Route("/user/mes-informations", name="mes_informations")
*/
public function mes_informations( EntityManagerInterface $entityManager,
Request $request,
UserPasswordHasherInterface $userPasswordHasher,
sendNotification $sendNotification )
{
$session = $request->getSession();
$user = $this->getUser();
$formAccount = $this->createForm(AccountFormType::class, $user);
$formAccount->handleRequest($request);
if ($formAccount->isSubmitted() && $formAccount->isValid()) {
// username = email
$user->setUsername($formAccount->get('email')->getData());
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$formAccount->get('plainPassword')->getData()
)
);
$entityManager->persist($user);
$entityManager->flush();
$session->getFlashBag()->add('message', "Vos informations sont enregistrées");
}
return $this->renderForm('security/mes_informations.html.twig', [
'accountForm' => $formAccount,
]);
}
/**
* @Route("/renew-pass/{checksum}", name="app_renew_pass")
*/
public function do_renew_pass( $checksum,
EntityManagerInterface $entityManager,
Request $request,
UserAuthenticatorInterface $userAuthenticator,
AppCustomAuthenticator $appAuthenticator )
{
$session = $request->getSession();
if(!$checksum) {
$session->getFlashBag()->add('error', "Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
return $this->redirectToRoute('app_edito');
}
$user = $entityManager->getRepository(User::class)->findOneBy(
array('emailValidationChecksum' => $checksum)
);
if(!$user) {
$session->getFlashBag()->add('error', "Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
return $this->redirectToRoute('app_edito');
}
$user->setEmailValidationChecksum("");
$roles = $user->getRoles();
if($roles[0]=='ROLE_EN_ATTENTE') {
$user->setRoles(['ROLE_CANDIDAT']);
}
$entityManager->persist($user);
$entityManager->flush();
$session->getFlashBag()->add('message', "Vous êtes maintenant connecté, vous pouvez modifier votre mot de passe sur la page 'Mon Compte'");
return $userAuthenticator->authenticateUser($user, $appAuthenticator, $request);
}
}