<?php
namespace App\Controller;
use App\Entity\Admin\User;
use App\Manager\Admin\UserManager;
use App\Service\PasswordManager;
use Doctrine\ORM\NonUniqueResultException;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class SecurityController extends AbstractController
{
/**
* @Route("/login", name="login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('homepage');
}
// 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="logout")
*/
public function logout(): Response
{
return new Response('Disconnected');
}
/**
* @Route("/password/reset", name="reset_password")
*/
public function resetPassword(Request $request, UserManager $userManager): Response
{
$message = null;
$error = null;
$search = $request->get('search');
if ($search !== null) {
if ($userManager->resetPasswordForJazmin($search) === 1) {
$message = 'Un e-mail vous a été envoyé avec les instructions pour récupérer votre mot de passe.';
} else {
$error = 'Aucun compte ne semble associé à cette adresse e-mail ou à cet identifiant.';
}
}
return $this->render('security/reset_password.html.twig', [
'message' => $message,
'error' => $error,
]);
}
/**
* @Route("/password/reset/{token}", name="reset_password_with_token")
*/
public function passwordUpdateFromToken(Request $request, UserManager $userManager, string $token, PasswordManager $passwordManager): RedirectResponse|Response
{
$error = null;
$user = $userManager->checkResetTokenValidity($token);
if ($user === null) {
return $this->redirectToRoute('login', [
'error' => 'Jeton invalide',
]);
}
$errors = [];
$passwordFirst = $request->get('password_first');
$passwordSecond = $request->get('password_second');
if ($passwordFirst !== null && $passwordSecond !== $passwordFirst) {
$errors[] = 'Les deux nouveaux mots de passe ne correspondent pas !';
} elseif ($passwordFirst !== null) {
$check = $passwordManager->checkPassword($user, $passwordFirst);
if (is_array($check) && !$check instanceof User) {
foreach ($check as $error) {
$errors[] = $error;
}
} else {
$userManager->updatePassword($user, $passwordFirst);
return $this->redirectToRoute('login', ['password' => 'updated']);
}
}
return $this->render('security/reset_form_password.html.twig', [
'errors' => $errors,
]);
}
/**
* @Route("/password/init/{token}", name="init_password_with_token")
*/
public function passwordInitFromToken(Request $request, UserManager $userManager, string $token): RedirectResponse|Response
{
$error = null;
$user = $userManager->checkInitTokenValidity($token);
if ($user === null) {
return $this->redirectToRoute('login', [
'error' => 'Jeton invalide',
]);
}
$passwordFirst = $request->get('password_first');
$passwordSecond = $request->get('password_second');
if ($passwordFirst !== null && $passwordSecond !== $passwordFirst) {
$error = 'Les mots de passe ne correspondent pas.';
} elseif ($passwordFirst !== null) {
$userManager->updatePassword($user, $passwordFirst);
return $this->redirectToRoute('login', ['password' => 'updated']);
}
return $this->render('security/init_password.html.twig', [
'error' => $error,
]);
}
/**
* @Route("/account/show/{user}", name="account")
*/
public function account(Request $request, User $user, UserManager $userManager): Response
{
$success = $request->get('success');
$errorArray = ($request->get('error_array') &&
$request->get('error_array') !== null) ?
$request->get('error_array') : null;
$user = $userManager->getRepository()->getUserForAccount($user);
return $this->render('security/index.html.twig', [
'user' => $user,
'success' => $success,
'error_array' => $errorArray,
]);
}
/**
* @Route("/account/password", name="update_password")
*/
public function updatePassword(Request $request, UserManager $userManager): RedirectResponse|Response
{
$success = null;
$errorArray = null;
$userId = $request->get('user_id');
/** @var User $user */
$user = $userManager->getRepository()->find($userId);
$oldPlainPassword = $request->get('old_password');
$newPlainPassword = $request->get('new_password');
$newPlainPasswordBis = $request->get('new_password_bis');
$result = $userManager->updatePasswordByUser($user, $oldPlainPassword, $newPlainPassword, $newPlainPasswordBis);
if (is_array($result)) {
$errorArray = $result;
} elseif ($result instanceof User) {
$userManager->updatePassword($user, $newPlainPassword);
$success = 'Le mot de passe a été modifié avec succès !';
} else {
$errorArray[] = 'Une erreur inconnue s\'est produite, veuillez contacter le Support.';
}
return $this->redirectToRoute('account', [
'user' => $user->getId(),
'success' => $success,
'error_array' => $errorArray,
]);
}
}