<?php
namespace App\Controller;
use App\Entity\Admin;
use App\Form\AdminType;
use App\Entity\SetPassword;
use App\Entity\ResetPassword;
use App\Form\SetPasswordType;
use App\Entity\PasswordUpdate;
use App\Form\ResetPasswordType;
use App\Form\PasswordUpdateType;
use App\EmailNotification\ToUser;
use App\Repository\UserRepository;
use Symfony\Component\Form\FormError;
use Doctrine\Persistence\ObjectManager;
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\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class AccountController extends AbstractController
{
private function str_rand(int $length = 64)
{
$length = ($length < 4) ? 4 : $length;
return bin2hex(random_bytes(($length - ($length % 2)) / 2));
}
#[Route(path: '/connexion', name: 'app_login')]
public function login(AuthenticationUtils $utils): Response
{
$user = $this->getUser();
if ($user != null) {
return $this->redirectToRoute("homepage");
}
else
{
$error = $utils->getLastAuthenticationError();
$username = $utils->getLastUsername();
return $this->render('/account/login.html.twig',[
'error' => $error,
'username' => $username,
]);
}
}
#[Route(path: '/verification-compte', name: 'account_check')]
public function accountCheck(AuthenticationUtils $utils, TokenStorageInterface $tokenStorage)
{
$admin = $this->getUser();
if ($admin->getStatus() == 'deleted') {
$tokenStorage->setToken();
return $this->redirectToRoute('homepage');
}
if ($admin->getHasAlreadyLoggedIn()) {
return $this->redirectToRoute('homepage');
}
else {
return $this->redirectToRoute('set_password');
}
}
#[Route(path: '/securite/configurer-mot-de-passe', name: 'set_password')]
public function setPassword(Request $request, UserPasswordEncoderInterface $encoder, ObjectManager $manager)
{
$admin = $this->getUser();
$password = new SetPassword();
$form = $this->createForm(SetPasswordType::class, $password);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$newPass = $password->getNewPassword();
$hash = $encoder->encodePassword($admin, $newPass);
$admin->setPassword($hash)
->setHasAlreadyLoggedIn(true)
->setStatus('active');
$manager->persist($admin);
$manager->flush();
$this->addFlash(
'success',
'Votre mot de passe a bien été sauvegardé'
);
return $this->redirectToRoute('homepage');
}
return $this->render('admin/set-password.html.twig', [
'form' => $form->createView()
]);
}
#[Route(path: '/mot-de-passe-oublie', name: 'forgot_password')]
public function forgotPassword(UserRepository $userRepository, ToUser $toUser)
{
if (isset($_POST['forgot_submit'])) {
$email = $_POST['forgot_email'];
$user = $userRepository->findOneBy(['email' => $email]);
if ($user) {
// $toUser->forgotPassword($user);
}
return $this->redirectToRoute('forgot_password');
}
return $this->render('account/forgot-password.html.twig');
}
#[Route(path: '/reset-password/{token}', name: 'reset_password')]
public function resetPassword($token, UserRepository $userRepository, UserPasswordEncoderInterface $encoder, Request $request, ObjectManager $manager)
{
$user = $userRepository->findOneBy(['token' => $token]);
$isAdmin = false;
if ($user instanceof Admin)
{
$isAdmin = true;
}
if ($user) {
$action = 'reset';
$newPassword = new ResetPassword();
$form = $this->createForm(ResetPasswordType::class, $newPassword);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$hashed = $encoder->encodePassword($user, $newPassword->getPassword());
$user->setPassword($hashed)
->setToken($this->str_rand(32));
$manager->persist($user);
$manager->flush();
if($isAdmin)
{
return $this->redirectToRoute('app_login');
}
else
{
return $this->redirectToRoute('app_login');
}
}
return $this->render('account/reset-password.html.twig', [
'action' => $action,
'form' => $form->createView()
]);
}
else {
$action = 'expired';
return $this->render('account/reset-password.html.twig', [
'action' => $action
]);
}
}
#[Route(path: '/deconnexion', name: 'app_logout')]
public function logout() {}
#[Route(path: '/modifier-mon-profil', name: 'edit_profile')]
public function editProfile(Request $request, ObjectManager $manager, UserPasswordEncoderInterface $encoder)
{
$admin = $this->getUser();
$passUpdate = new PasswordUpdate();
$formPassword = $this->createForm(PasswordUpdateType::class, $passUpdate);
$formProfile = $this->createForm(AdminType::class, $admin, ['role' => null, 'teamInfos' => $this->getUser()->getTeam()->getTeamInfos()]);
$formPassword->handleRequest($request);
$formProfile->handleRequest($request);
if ($formPassword->isSubmitted() && $formPassword->isValid()) {
if (!password_verify($passUpdate->getOldPassword(), $admin->getPassword())) {
$formPassword->get('oldPassword')->addError(new FormError("Ce n'est pas votre de passe actuel !"));
}
else {
$newPass = $passUpdate->getNewPassword();
$hash = $encoder->encodePassword($admin, $newPass);
$admin->setPassword($hash);
$manager->persist($admin);
$manager->flush();
$this->addFlash(
'success',
'Mot de passe mofiié avec succès'
);
return $this->redirectToRoute('see_profile');
}
}
if ($formProfile->isSubmitted() && $formProfile->isValid()) {
$manager->persist($admin);
$manager->flush();
$this->addFlash(
'success',
'Votre profil a été modifié'
);
return $this->redirectToRoute('see_profile');
}
return $this->render('account/edit-profile.html.twig', [
'formProfile' => $formProfile->createView(),
'formPassword' => $formPassword->createView()
]);
}
#[Route(path: '/mon-profil', name: 'see_profile')]
public function seeProfile()
{
$admin = $this->getUser();
return $this->render('account/see-profile.html.twig', [
'admin' => $admin,
'menu' => 'profile'
]);
}
#[Route(path: '/login', name: 'login_check', methods: ['POST'])]
public function loginCheck()
{
//NOT DELETE THIS ONE
}
}