sites_group_overrides-1.x-dev/src/EventSubscriber/ActiveSiteSubscriber.php
src/EventSubscriber/ActiveSiteSubscriber.php
<?php
declare(strict_types=1);
namespace Drupal\sites_group_overrides\EventSubscriber;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\sites\Event\ActiveSite;
use Drupal\sites\SitePluginManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Subscribes on the active site event.
*/
class ActiveSiteSubscriber implements EventSubscriberInterface {
/**
* The current request.
*
* @var \Symfony\Component\HttpFoundation\Request
*/
protected Request $request;
/**
* Constructs a ActiveSiteSubscriber object.
*
* @param \Drupal\Core\Session\AccountInterface $account
* The current user account.
* @param \Drupal\sites\SitePluginManagerInterface $sitePluginManager
* The site plugin manager.
* @param \Drupal\Core\Access\CsrfTokenGenerator $csrfToken
* The token generator.
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
* A request stack symfony instance.
*/
public function __construct(
protected readonly AccountInterface $account,
protected readonly SitePluginManagerInterface $sitePluginManager,
protected readonly CsrfTokenGenerator $csrfToken,
RequestStack $request_stack,
) {
$this->request = $request_stack->getCurrentRequest();
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ActiveSite::SITES_ACTIVE_SITE => ['onMasquerade', 1100],
];
}
/**
* Makes sure the site context remains when submitting a form.
*
* @param \Drupal\sites\Event\ActiveSite $event
* The sites' event.
*/
public function onMasquerade(ActiveSite $event) {
if (!$csrf_token = $this->request->request->get('sites_csrf')) {
return;
}
if (!$this->csrfToken->validate($csrf_token, 'sites_csrf')) {
return;
}
if ($site_id = $this->request->request->get('site_id')) {
if ($site = $this->sitePluginManager->getSite($site_id)) {
$event->setActiveSite($site);
}
}
}
}
