<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\EmailResetType;
use App\Form\UserResetPasswordType;
use App\Form\ResetType;
use App\Utils\ProfileUtils;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @Route("/login", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')){
return $this->redirectToRoute('home_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("/reset", name="reset_login")
*/
public function resetPassword(Request $request, MailerInterface $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$form = $this->createForm(EmailResetType::class);
$ipRequest = $request->server->get('REMOTE_ADDR');
$dateRequest = new \Datetime("now");
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $entityManager->getRepository(User::class)->findOneByEmail($form->getData()['email']);
if ($user !== null) {
$token = uniqid();
$user->setResetPassword($token);
$entityManager->persist($user);
$entityManager->flush();
$mailTo = $user->getEmail();
$message = (new Email())
->from(new Address('no-reply@skaze.fr', 'Skaze Tools Suite'))
->to($mailTo)
->subject('Request from Skaze Tools')
->html($this->renderView('email/reset.password.html.twig', array('user' => $user,'token' => $token, 'ipRequest' => $ipRequest, 'dateRequest' => $dateRequest)))
;
$result = $mailer->send($message);
return $this->render('security/reset.password.confirmation.html.twig');
}
}
return $this->render('generic_forms/_form_bootstrap_without_variables.html.twig', array(
'form' => $form->createView(),
'title' => "Reset password",
'message' => "Please fill in your email below, we will send you a link to update your password."
));
}
/**
* @Route("/reset/password/token", name="reset_password_token")
*/
public function resetPasswordToken(Request $request, UserPasswordHasherInterface $encoder, AuthenticationUtils $authenticationUtils)
{
$token = $request->query->get('token');
if ($token !== null) {
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->findOneByResetPassword($token);
if ($user !== null) {
// Return to login page with error message if token > 15 minutes
$lastupdatedDate = $user->getUpdatedAt();
$lastUpdateT = $lastupdatedDate->getTimestamp();
$now = new \Datetime;
$nowT = $now->getTimestamp();
$diff = abs($nowT - $lastUpdateT);
// 900 seconds = 15 minutes
if(intval($diff) > 900) {
$error = "Your mail has be sent more 15 minutes ago, click in forgotten password again and we will send you a new mail to reset your password";
return $this->render('security/login.html.twig', ['errorArchived' => $error]);
}
// Else, user can change his password
$form = $this->createForm(UserResetPasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$plainPassword = $_POST['user_reset_password']['password']['first'];
$encoded = $encoder->hashPassword($user, $plainPassword);
$user->setPassword($encoded);
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('app_login');
}
return $this->render('generic_forms/_form_bootstrap_without_variables.html.twig', array(
'form' => $form->createView(),
'title' => "Enter your new password",
"message" => "Please fill your new password."
));
}
}
// 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("/report/token", name="report_token")
*/
public function reportToken(Request $request, MailerInterface $mailer)
{
$ipReport = $request->server->get('REMOTE_ADDR');
$token = $request->query->get('token');
$ipRequest = $request->query->get('ipRequest');
$dateRequest = $request->query->get('dateRequest');
if ($token !== null) {
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->findOneByResetPassword($token);
if ($user !== null) {
//As the demand is not from the user, remove token
$user->setResetPassword("");
$entityManager->persist($user);
$entityManager->flush();
$admin = "dev.skaze@algorun.com";
$mailTo = $admin;
$message = (new Email())
->from(new Address('no-reply@skaze.fr', 'Skaze Tools Suite'))
->to($mailTo)
->subject('Report Skaze Tools')
->html(
$this->renderView('email/report.token.html.twig', array('user' => $user,'token' => $token, 'ipRequest' => $ipRequest, 'dateRequest' => $dateRequest["date"], 'ipReport' => $ipReport, 'date' => new \Datetime("now"))))
;
$result = $mailer->send($message);
// Render view to confirm he can have a connexion with the old password
return $this->render('security/report.token.confirmation.html.twig', array(
'token' => $token,
));
}
}
// if $token exists, return the login form
return $this->render('security/report.token.confirmation.html.twig');
}
}