<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use App\Repository\SecUserRepository;
use App\Services\MailerCore;
class SecSecurityController extends AbstractController {
#[Route('/login', name: 'app_login')]
public function index(AuthenticationUtils $authenticationUtils, UserPasswordHasherInterface $passwordHasher): Response {
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('sec_security/login.html.twig', [
'controller_name' => 'LoginController',
'last_username' => $lastUsername,
'error' => $error,
]);
}
#[Route('/password_request', name: 'app_password_request', methods: ['GET', 'POST'])]
public function passwordRequest(Request $request, SecUserRepository $secUserRepository, MailerCore $mailerCore): Response {
if ($request->getMethod() == "POST") {
$username = trim($request->request->get('_username'));
$user = $secUserRepository->findOneBy(['username' => $username]);
if (!$user) {
$this->addFlash('warning', "Valide la información suministrada, el usuario no existe.");
return $this->redirectToRoute('app_password_request');
}
if ($user->getRequestTokenChange() === null) {
$tokenChange = random_int(100000, 999999);
$user->setRequestTokenChange($tokenChange);
$user->setLastRequestToken(new \DateTime('now'));
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$mailerCore->notificarUsuario('requestPassword', [$user]);
return $this->redirectToRoute('app_confirm_token_password');
} else {
$this->addFlash('warning', "Valide su bandeja de entrada, el usuario ya cuenta con un token generado.");
return $this->redirectToRoute('app_confirm_token_password');
}
}
// get the login error if there is one
// $user = new \App\Entity\SecUser();
// $user->setUsername('123456789');
// $user->setEmail('ccastaneda@it-systems.com.co');
// $plaintextPassword = "123456";
// $user->setEnabled(1);
// $user->setRoles(['ROLE_ADMIN','ROLE_USUARIO']);
// // hash the password (based on the security.yaml config for the $user class)
// $hashedPassword = $passwordHasher->hashPassword(
// $user,
// $plaintextPassword
// );
// $user->setPassword($hashedPassword);
// $em = $this->getDoctrine()->getManager();
// $em->persist($user);
// $em->flush();
return $this->render('sec_security/passwordRequest.html.twig', [
]);
}
#[Route('/confirm_token_password', name: 'app_confirm_token_password', methods: ['GET', 'POST'])]
public function confirmTokenPassword(Request $request, SecUserRepository $secUserRepository, MailerCore $mailerCore): Response {
if ($request->getMethod() == "POST") {
$token = trim($request->request->get('_token'));
$user = $secUserRepository->findOneBy(['requestTokenChange' => $token]);
if (!$user) {
$this->addFlash('warning', "Valide la información suministrada, el usuario no existe.");
return $this->redirectToRoute('app_login');
}
$sesion = $request->getSession();
$sesion->set('username', $user->getUsername());
return $this->redirectToRoute('app_password_change');
}
// get the login error if there is one
// $user = new \App\Entity\SecUser();
// $user->setUsername('123456789');
// $user->setEmail('ccastaneda@it-systems.com.co');
// $plaintextPassword = "123456";
// $user->setEnabled(1);
// $user->setRoles(['ROLE_ADMIN','ROLE_USUARIO']);
// // hash the password (based on the security.yaml config for the $user class)
// $hashedPassword = $passwordHasher->hashPassword(
// $user,
// $plaintextPassword
// );
// $user->setPassword($hashedPassword);
// $em = $this->getDoctrine()->getManager();
// $em->persist($user);
// $em->flush();
return $this->render('sec_security/confirmTokenPassword.html.twig', [
]);
}
#[Route('/password_change', name: 'app_password_change', methods: ['GET', 'POST'])]
public function passwordChange(Request $request, SecUserRepository $secUserRepository, MailerCore $mailerCore, UserPasswordHasherInterface $passwordHasher): Response {
if ($request->getMethod() == "POST") {
$sesion = $request->getSession();
$username = trim($sesion->get('username'));
$user = $secUserRepository->findOneBy(['username' => $username]);
if (!$user) {
$this->addFlash('warning', "Valide la información suministrada, el usuario no existe.");
return $this->redirectToRoute('app_password_request');
}
if ($user->getRequestTokenChange() !== null) {
$password = trim($request->request->get('_password'));
$hashedPassword = $passwordHasher->hashPassword(
$user,
$password
);
$user->setPassword($hashedPassword);
$user->setRequestTokenChange(null);
$user->setLastRequestToken(new \DateTime('now'));
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$this->addFlash('success', "Su contraseña fue actualizada con exito.");
return $this->redirectToRoute('app_login');
}
}
// get the login error if there is one
// $user = new \App\Entity\SecUser();
// $user->setUsername('123456789');
// $user->setEmail('ccastaneda@it-systems.com.co');
// $plaintextPassword = "123456";
// $user->setEnabled(1);
// $user->setRoles(['ROLE_ADMIN','ROLE_USUARIO']);
// // hash the password (based on the security.yaml config for the $user class)
// $hashedPassword = $passwordHasher->hashPassword(
// $user,
// $plaintextPassword
// );
// $user->setPassword($hashedPassword);
// $em = $this->getDoctrine()->getManager();
// $em->persist($user);
// $em->flush();
return $this->render('sec_security/passwordChange.html.twig', [
]);
}
/**
* @Route("/logout", name="app_logout", methods={"POST"})
*/
public function logout(): void {
// controller can be blank: it will never be called!
throw new \Exception('Don\'t forget to activate logout in security.yaml');
}
}