<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\RegistrationFormType;
use App\Repository\UserRepository;
use App\Security\UserAuthenticator;
use App\Services\SendMail;
use App\Services\UploadRccm;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException as ExceptionAccessDeniedException;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Security\Http\RememberMe\ResponseListener;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegistrationController extends AbstractController
{
#[Route('/enregistrement', name: 'app_register')]
/**
* Cette fonction fait l'enrégistrement d'un compte utilisateur
* On génère un token pour chaque compte en fin qu'on puisse faire la confirmation du compte
* Si la création du compte est faite on envoie un email à l'utilisateur
*
* @param Request $request
* @param UserPasswordHasherInterface $userPasswordHasher
* @param EntityManagerInterface $entityManager
* @param SendMail $sendMail
* @param TokenGeneratorInterface $tokenGeneratorInterface
* @param SluggerInterface $slugger
* @return Response
*/
public function register(
Request $request,
UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager,
SendMail $sendMail,
TokenGeneratorInterface $tokenGeneratorInterface,
SluggerInterface $slugger
): Response {
$user = new User();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
#recupération du rccm et l'enregistrment
$fichier = $form->get('rccm')->getData();
if ($fichier) {
$nomOrigine = pathinfo($fichier->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $slugger->slug($nomOrigine);
$nouveauNom = $safeFilename . '-' . uniqid() . '.' . $fichier->guessExtension();
try {
$fichier->move(
$this->getParameter('pdf_directory'),
$nouveauNom
);
} catch (FileException $e) {
}
$user->setRccmFileName($nouveauNom);
}
//création du token
$tokenRegistration = $tokenGeneratorInterface->generateToken();
//utilisateur
$user->setRoles(['ROLE_USER']);
$user->setProfil('client');
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
//User token
$user->setTokenRegistration($tokenRegistration);
$entityManager->persist($user);
$entityManager->flush();
//envoi d'email
$sendMail->sendMail(
$user->getEmail(),
'Confirmation du compte utilisateur',
'registration_confirmation.html.twig',
[
'user' => $user,
'token' => $tokenRegistration,
'lifeTimeToken' => $user->getTokenRegistrationLifeTime()->format('d/m/Y'),
]
);
$this->addFlash('success', 'Votre compte à été créé, veuillez vérifier votre mail pour l\'activer.');
return $this->redirectToRoute('app_login');
}
return $this->render('registration/inscription.html.twig', [
'registrationForm' => $form->createView(),
]);
}
#[Route('/verify/{token}/{id}', name: 'account_verify', methods: ['GET'])]
/**
* Cette fonction fait la vérification du compte Utilisateur
*
* @param [type] $token
* @param [type] $id
* @param EntityManagerInterface $em
* @param UserRepository $userRepository
* @return Response
*/
public function verifyCompte($token, $id, EntityManagerInterface $em, UserRepository $userRepository): Response
{
/** @var User */
$user = new User();
$user = $userRepository->find($id);
/* On vérifie si le token est différent du token courent
si c'est différent on lève une exception */
if ($user->getTokenRegistration() !== $token) {
throw new ExceptionAccessDeniedException();
}
/* On vérifie si le token est égal à null
si c'est égale on lève une exception */
if ($user->getTokenRegistration() === null) {
throw new ExceptionAccessDeniedException();
}
/* On vérifie si la date de géneration du token est strictement inférieure à la date de l'instant présent
Si c'est strictement inférerieur on lève une exception
*/
if (new DateTime('now') > $user->getTokenRegistrationLifeTime()) {
throw new ExceptionAccessDeniedException();
}
/* Si aucune de ces conditions n'est vérifiée on modifie la bd
pour activer le compte */
$user->setIsVerified(true);
$user->setTokenRegistration(null);
$em->flush();
$this->addFlash("success", 'Votre compte a été activé veuillez vous connecter à présent');
return $this->redirectToRoute('app_login');
}
}