Version 1
[yaffs-website] / web / core / modules / user / src / EventSubscriber / MaintenanceModeSubscriber.php
diff --git a/web/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php b/web/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php
new file mode 100644 (file)
index 0000000..3ba847b
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+namespace Drupal\user\EventSubscriber;
+
+use Drupal\Core\Routing\RouteMatch;
+use Drupal\Core\Routing\UrlGeneratorTrait;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Site\MaintenanceModeInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Maintenance mode subscriber to log out users.
+ */
+class MaintenanceModeSubscriber implements EventSubscriberInterface {
+
+  use UrlGeneratorTrait;
+
+  /**
+   * The maintenance mode.
+   *
+   * @var \Drupal\Core\Site\MaintenanceMode
+   */
+  protected $maintenanceMode;
+
+  /**
+   * The current account.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Constructs a new MaintenanceModeSubscriber.
+   *
+   * @param \Drupal\Core\Site\MaintenanceModeInterface $maintenance_mode
+   *   The maintenance mode.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user.
+   */
+  public function __construct(MaintenanceModeInterface $maintenance_mode, AccountInterface $account) {
+    $this->maintenanceMode = $maintenance_mode;
+    $this->account = $account;
+  }
+
+  /**
+   * Logout users if site is in maintenance mode.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The event to process.
+   */
+  public function onKernelRequestMaintenance(GetResponseEvent $event) {
+    $request = $event->getRequest();
+    $route_match = RouteMatch::createFromRequest($request);
+    if ($this->maintenanceMode->applies($route_match)) {
+      // If the site is offline, log out unprivileged users.
+      if ($this->account->isAuthenticated() && !$this->maintenanceMode->exempt($this->account)) {
+        user_logout();
+        // Redirect to homepage.
+        $event->setResponse($this->redirect($this->url('<front>')));
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[KernelEvents::REQUEST][] = ['onKernelRequestMaintenance', 31];
+    return $events;
+  }
+
+}