<?php
namespace App\Controller\Common;
use App\Domain\Common\Form\User\PasswordRequestType;
use App\Domain\Common\Form\User\RecoveryNewPasswordType;
use App\Infrastructure\Entity\Liquidacions\User;
use Doctrine\ORM\EntityManagerInterface;
use Swift_Mailer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class ResettingController extends AbstractController
{
/**
* @Route("/reset_password", name="reset_password", methods={"GET", "POST"})
*/
public function resetPassword(
Request $request,
EntityManagerInterface $entityManager,
Swift_Mailer $mailer
) {
$form = $this->createForm(PasswordRequestType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$token = bin2hex(random_bytes(32));
$user = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
if ($user instanceof User) {
$user->setPasswordRequestToken($token);
$entityManager->flush();
$message = (new \Swift_Message('Recovery Password'))
->setFrom(!empty($this->getParameter('mailer.from')) ? $this->getParameter('mailer.from') : 'didacmartin@gmail.com')
->setTo($email)
->setBody(
$this->renderView(
'email/recovery_password.html.twig',
['token' => $token,
'email_contact_technical_info' => !empty($this->getParameter('mailer.technical_support')) ? $this->getParameter('mailer.technical_support') : '', ]
),'text/html'
)
;
$mailer->send($message);
// send your email with SwiftMailer or anything else here
$this->addFlash('success', "S'ha enviat un correu a la vostre adreça de correu");
return $this->redirectToRoute('reset_password');
} else {
$this->addFlash('warning', 'Usuari no existent');
return $this->redirectToRoute('reset_password');
}
}
return $this->render('security/reset-password.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("/reset_password/confirm/{token}", name="reset_password_confirm", methods={"GET", "POST"})
*/
public function resetPasswordCheck(
Request $request,
string $token,
EntityManagerInterface $entityManager,
UserPasswordEncoderInterface $encoder,
TokenStorageInterface $tokenStorage,
SessionInterface $session
) {
$user = $entityManager->getRepository(User::class)->findOneBy(['passwordRequestToken' => $token]);
if (!$token || !$user instanceof User) {
$this->addFlash('danger', 'Usuari no trobat');
return $this->redirectToRoute('reset_password');
}
$form = $this->createForm(RecoveryNewPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$form_data = $form->getData();
$plainPassword = $form_data['new_password'];
$password = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($password);
$user->setPasswordRequestToken(null);
$entityManager->flush();
$token = new UsernamePasswordToken($user, $password, 'main');
$tokenStorage->setToken($token);
$session->set('_security_main', serialize($token));
$this->addFlash('success', 'El nou mot de pas ha estat actualitzat');
return $this->redirectToRoute('app_login');
}
return $this->render('security/reset-password-confirm.html.twig', ['form' => $form->createView()]);
}
}