<?php
namespace App\Controller;
use App\Model\User;
use App\Service\UserBackend;
use App\Form\RegisterConfirmType;
use App\Utils\SessionUtils;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class SecurityController extends AbstractController
{
use SessionUtils;
/**
* login
*
* @param Request $request
* @param AuthenticationUtils $authenticationUtils
* @return Response
*
* @Route("/login", name="login")
*/
public function login(
Request $request,
AuthenticationUtils $authenticationUtils
): Response {
$request->setLocale('en');
$content = [
'title' => "Connection",
'subTitle' => "Please connect to your account",
'email' => "Address E-mail",
'button' => "Connection",
'mdp' => 'Enter your password',
'forget' => 'Forgot password ?'
];
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
if ($error) {
$this->addFlash('errors', 'Problème d\'identifiant');
}
return $this->render('security/login.html.twig', [
'error' => $error,
'content' => $content
]);
}
/**
* logout
*
* @return mixed
*
* @Route("/logout", name="logout")
*/
public function logout()
{
$session = $this->sessionByRequestStack();
$session->remove('apiJwtToken');
$session->clear();
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* register
*
* @return Response
*
* @Route("/register", name="register")
*/
public function register(): Response
{
return $this->render('security/register.html.twig', []);
}
/**
* registerConfirmation
*
* @param $token
* @param Request $request
* @param UserBackend $userBackend
* @param UserPasswordHasherInterface $passwordHasher
* @return RedirectResponse|Response
* @throws TransportExceptionInterface
*
* @Route("/register/confirm/{token}", name="register_confirmation")
*/
public function registerConfirmation(
$token,
Request $request,
UserBackend $userBackend,
UserPasswordHasherInterface $passwordHasher
) {
$user = new User;
if(!empty($token) && !$this->isGranted('IS_AUTHENTICATED_FULLY')){
$user->setToken($token);
$user = $userBackend->getUserByToken($token);
}
$form = $this->createForm(RegisterConfirmType::class, $user, ['uemail' => $user->getUEmail()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setUPwd($passwordHasher->hashPassword($user, $user ->getUPwd()));
$response = $userBackend->activateAccount($user, $token);
if ($response === Response::HTTP_OK) {
$this->addFlash('success', 'Votre compte est validé, vous pouvez maintenant vous connecter à MainChain');
return $this->redirectToRoute('dashboard');
}
if ($response === Response::HTTP_CONFLICT) {
$this->addFlash('warning', 'Vous possédez déjà un compte validé. Vous pouvez vous connecter');
return $this->redirectToRoute('dashboard');
} else {
$this->addFlash('errors', 'Une erreur est survenue durant le processus, veuillez réessayer ultérieusement');
}
}
return $this->render('security/register_confirmation.html.twig', [
'confirmForm' => $form->createView(),
'action' => 'confirm'
]);
}
/**
* Forget Password
*
* @param Request $request
* @param UserBackend $userBackend
* @return Response
* @throws TransportExceptionInterface
*
* @Route("/forgot_password", name="forgot_password")
*/
public function forgetPassword (
Request $request,
UserBackend $userBackend
): Response {
if($request->getMethod() == "POST") {
$email = $request->request->get('u_email');
} else {
$email = '';
}
$result = '';
if (!empty($email)) {
$response = $userBackend->getUserExistByEmail($email);
if($response === Response::HTTP_OK){
$result = 'success';
} elseif ($response === Response::HTTP_FORBIDDEN) {
$this->addFlash('success', sprintf("<h3>E-mail envoyé</h3>Un e-mail a été envoyé à votre adresse %s . Suivez les instructions fournies pour réinitialiser votre mot de passe.", '<b>' . $email . "</b>"));
} elseif ($response === Response::HTTP_NOT_FOUND){
$this->addFlash('success', sprintf("<h3>E-mail envoyé</h3>Un e-mail a été envoyé à votre adresse %s . Suivez les instructions fournies pour réinitialiser votre mot de passe.", '<b>' . $email . "</b>"));
} else {
$this->addFlash('errors', 'Une erreur est survenue durant le processus, veuillez réessayer ultérieusement');
}
} else {
$response = $userBackend->getUserExistByEmail($email);
if($response === Response::HTTP_OK){
$result = 'success';
$this->addFlash('success', sprintf("<h3>E-mail envoyé</h3>Un e-mail a été envoyé à votre adresse %s . Suivez les instructions fournies pour réinitialiser votre mot de passe.", '<b>' . $email . "</b>"));
}
}
return $this->render('security/forget_password.html.twig', [
'previous_email' => $email,
'result' => $result,
]);
}
/**
* registerConfirmation
*
* @param $token
* @param Request $request
* @param UserBackend $userBackend
* @param UserPasswordHasherInterface $passwordHasher
* @return RedirectResponse|Response
* @throws TransportExceptionInterface|\MiladRahimi\Jwt\Exceptions\InvalidKeyException
*
* @Route("/reset_password/{token}", name="reset_password")
*/
public function resetPassword(
$token,
Request $request,
UserBackend $userBackend,
UserPasswordHasherInterface $passwordHasher
) {
$user = new User;
if (!empty($token) && !$this->isGranted('IS_AUTHENTICATED_FULLY')) {
$user->setToken($token);
$user = $userBackend->getUserByToken($token);
}
$form = $this->createForm(RegisterConfirmType::class, $user, ['uemail' => $user->getUEmail()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setUPwd($passwordHasher->hashPassword($user, $user ->getUPwd()));
$response = $userBackend->putUserResetPwd($user);
if ($response === Response::HTTP_OK) {
$this->addFlash('success', 'Votre mot de passe a bien été mis à jour, vous pouvez-vous connecter');
return $this->redirectToRoute('login');
}
if ($response === Response::HTTP_UNAUTHORIZED) {
$this->addFlash('warning', 'Votre lien de réinitalisation est périmé, veuillez tenter de réinitialiser votre mot de passe à nouveau');
return $this->redirectToRoute('forgot_password');
} else {
$this->addFlash('errors', 'Une erreur est survenue durant le processus, veuillez réessayer ultérieusement');
}
}
return $this->render('security/register_confirmation.html.twig', [
'confirmForm' => $form->createView(),
'action' => 'reset'
]);
}
}