<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class UserActivitySubscriber implements EventSubscriberInterface
{
private $security;
private $urlGenerator;
private $flashBag;
private $tokenStorage;
public function __construct(Security $security, UrlGeneratorInterface $urlGenerator, FlashBagInterface $flashBag, TokenStorageInterface $tokenStorage)
{
$this->security = $security;
$this->urlGenerator = $urlGenerator;
$this->flashBag = $flashBag;
$this->tokenStorage = $tokenStorage;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
$user = $this->security->getUser();
$request = $event->getRequest();
$currentRoute = $request->get('_route');
if ($user && !$user->getIsActive() && !$request->getSession()->get('password_change_in_progress')) {
if ($currentRoute !== 'app_change_password') {
$request->getSession()->set('force_password_change', true);
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('profile.change_password')));
}
} else if ($user && $user->getIsActive()) {
// Si el usuario está activo, asegurarse de que no esté forzado a cambiar la contraseña
$request->getSession()->remove('force_password_change');
$request->getSession()->remove('password_change_in_progress');
}
// Si se debe cambiar la contraseña y no está en la ruta correcta, redirigir
if ($request->getSession()->get('force_password_change') && $currentRoute !== 'app_change_password') {
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('profile.change_password')));
}
}
}