<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
/**
* Stellt sicher, dass nach dem QR-Logout der tgaHash erhalten bleibt,
* damit der Benutzer nach dem erneuten Login direkt zum richtigen
* Aufzug weitergeleitet wird.
*
* Ohne diesen Subscriber würde Symfony nach dem Logout auf /install/loginqr
* (ohne Hash) weiterleiten. Der tgaHash ist dann aus der Session weg
* (invalidate_session: true), sodass der erneute Login keinen Kontext hat.
*/
class InstallLogoutSubscriber implements EventSubscriberInterface
{
private UrlGeneratorInterface $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator)
{
$this->urlGenerator = $urlGenerator;
}
public static function getSubscribedEvents(): array
{
return [
LogoutEvent::class => 'onLogout',
];
}
public function onLogout(LogoutEvent $event): void
{
$request = $event->getRequest();
// tgaHash aus der Logout-Route holen (/install/logoutqr/{tgaHash})
$tgaHash = (string) $request->attributes->get('tgaHash', '');
// Fallback: aus der Session holen (bevor sie invalidiert wird)
if ('' === $tgaHash && $request->hasSession()) {
$tgaHash = (string) $request->getSession()->get('tgaHash', '');
}
if ('' === $tgaHash) {
// Kein Hash → Standard-Logout-Redirect gilt
return;
}
// Weiterleitung zur Login-Seite MIT dem tgaHash
$url = $this->urlGenerator->generate('installloginqr', ['tgaHash' => $tgaHash]);
$event->setResponse(new RedirectResponse($url));
}
}