<?php
namespace App\Controller;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Gregwar\Captcha\CaptchaBuilder;
use Gregwar\Captcha\PhraseBuilder;
class SecurityController extends AbstractController
{
/**
* SecurityController constructor.
*/
private $urlGenerator;
private $csrfTokenManager;
private $user_repository;
private $emailController;
private $passwordEncoder;
public function __construct(UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager,UserPasswordHasherInterface $passwordEncoder, UserRepository $user_repository,EmailController $emailController)
{
$this->urlGenerator = $urlGenerator;
$this->csrfTokenManager = $csrfTokenManager;
$this->user_repository = $user_repository;
$this->emailController = $emailController;
$this->passwordEncoder = $passwordEncoder;
}
/**
* @Route("/login", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils, Request $request, EntityManagerInterface $em): Response
{
if ($this->getUser()) {
die(var_dump($request));
// INSERT INTO loginhistory
$loginHistory = new \App\Entity\Loginhistory();
$loginHistory->setLogintime(new \DateTime());
$loginHistory->setUsername($this->getUser()->getUsername());
$loginHistory->setUserid($this->getUser()->getId());
die(var_dump($request));
$em->persist($loginHistory);
$em->flush();
if(in_array('ROLE_ADMIN', $this->getUser()->getRoles()))
{
return new RedirectResponse($this->urlGenerator->generate('administration_index'));
}
else{
return $this->redirectToRoute('frontend_index');
}
}
// 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="app_logout")
*/
public function logout()
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/password-recovery-request", name="password-recovery-request")
*/
public function passwordRecoveryRequest(Request $request): Response
{
$errors = [];
$email = $request->get('email');
if($request->getMethod() =='POST'){
$token = new CsrfToken('passwordrecovery', $request->get('_csrf_token'));
if ($this->csrfTokenManager->isTokenValid($token)) {
#verifichiamo che l'utente esista
$u = $this->user_repository->findOneByEmail($request->get('email'));
if($u)
{
$phraseBuilder = new PhraseBuilder(9,'0123456789');
$captcha = new CaptchaBuilder(null, $phraseBuilder);
$captcha->build();
$values = [
'user'=>$u,
'captcha'=>$captcha->getPhrase()
];
$this->emailController->sendEmail($email,'Modifica Password','modifica_password', $values);
$checksum = md5($email).";".md5(sha1($values['captcha']));
return new RedirectResponse($this->urlGenerator->generate('check-password-recovery',['c'=>$checksum]));
}
else{
$errors[] = 'Utente non valido.';
}
}
}
return $this->render('security/password-recovery-request.html.twig', ['email'=>$email, 'errors'=>$errors]);
}
/**
* @Route("/check-password-recovery", name="check-password-recovery")
*/
public function checkPasswordRecovery(Request $request, EntityManagerInterface $em): Response
{
$checksum = $request->get('c');
$password1 = trim($request->get('password1'));
$password2 = trim($request->get('password2'));
$verifycode = $request->get('verifycode');
$has_changed = false;
$errors = [];
if($request->getMethod() =='POST'){
$t = explode(";",$checksum);
$email = $t[0];
$capcha = $t[1];
if($capcha!= md5(sha1($verifycode)))
{
$errors['verifycode'] = true;
}
if($password1!=$password2){
$errors['password2'] = true;
}
if(!count($errors))
{
#check che esista l'utente
$qb = $this->user_repository->createQueryBuilder('u');
$qb->where("MD5(u.email)=:email");
$qb->setParameter("email",$email);
$user = $qb->getQuery()->getOneOrNullResult();
if(is_null($user)){
throw new \Exception('Utenza non valida');
}
else{
#registriamo la nuova password
$user->setPassword($this->passwordEncoder->hashPassword($user,$password1));
$em->persist($user);
$em->flush();
$has_changed = true;
}
}
}
return $this->render('security/password-recovery.html.twig', ['has_changed'=>$has_changed, 'errors'=>$errors, 'verifycode'=>$verifycode,'password1'=>$password1,'password2'=>$password2, 'checksum'=>$checksum]);
}
}