<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
class PasswordChangeSubscriber implements EventSubscriberInterface
{
private $security;
private $urlGenerator;
public function __construct(Security $security, UrlGeneratorInterface $urlGenerator)
{
$this->security = $security;
$this->urlGenerator = $urlGenerator;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [
['forcePasswordChange', 0],
],
];
}
public function forcePasswordChange(RequestEvent $event): void
{
$request = $event->getRequest();
$_route = $request->attributes->get('_route');
// only deal with the main request, disregard subrequests
if (!$event->isMasterRequest()) {
return;
}
$user = $this->security->getUser();
// if you do not have a valid user, it means it's not an authenticated request, so it's not our concern
if (!$user instanceof User) {
return;
}
$request = $event->getRequest();
// if it's not their first login, and they do not need to change their password, move on
// but allow dsgvo, impressum and cookie page
if (
!$user->getForcepasswordchange()
|| 'pages_dsgvo' == $request->get('_route')
|| 'pages_impressum' == $request->get('_route')
|| 'pages_cookie' == $request->get('_route')
|| 'install_chose_action' == $request->get('_route')
|| 'qrtickets' == $request->get('_route')
|| 'ticket_install_edit' == $request->get('_route')
|| 'install_begehung' == $request->get('_route')
|| 'elevator_detail_live_qr' == $request->get('_route')
|| 'set_elevator_state_qr' == $request->get('_route')
|| 'set_elevator_state_qr' == $request->get('_route')
|| 'update_timer' == $request->get('_route')
|| 'elevator_acquisition' == $request->get('_route')
|| 'elevator_acquisition_detail' == $request->get('_route')
|| 'elevator_acquisition_finished' == $request->get('_route')
|| 'elevator_acquisition_pdf' == $request->get('_route')
|| 'elevator_acquisition_upload_file' == $request->get('_route')
) {
return;
}
// if we get here, it means we need to redirect them to the password change view.
$redirectTo = $this->urlGenerator->generate('firstLogin');
if (
$event->getRequest()->getRequestUri() != $redirectTo
&& 'install_chose_action' != $_route
) {
$event->setResponse(new RedirectResponse($redirectTo));
}
}
}