You are here

CookieMonster.php in Bakery Single Sign-On System 8.2

File

src/EventSubscriber/CookieMonster.php
View source
<?php

namespace Drupal\bakery\EventSubscriber;

use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * C is for cookie, its good enough for me.
 *
 * Cookie monster monitors the cookie jar for cookies baked by the kitchen and
 * tosses them out to the browser.
 */
class CookieMonster implements EventSubscriberInterface {

  /**
   * Time services.
   *
   * @var \Drupal\Component\Datetime\TimeInterface
   */
  protected $time;

  /**
   * Bakery settings.
   *
   * @var \Drupal\Core\Config\ImmutableConfig
   */
  protected $config;

  /**
   * Local storage for collecting cookie changes.
   *
   * @var \Symfony\Component\HttpFoundation\ParameterBag
   */
  protected $cookieJar;

  /**
   * Cookie lifetime.
   *
   * @var int
   */
  private $freshness;

  /**
   * Cookie domain.
   *
   * @var string
   */
  private $domain;

  /**
   * Use secure cookies?
   *
   * @var bool
   */
  private $secure;
  public function __construct(TimeInterface $time, ConfigFactoryInterface $config_factory, ParameterBag $cookie_jar) {
    $this->time = $time;
    $this->config = $config_factory
      ->get('bakery.settings');
    $this->cookieJar = $cookie_jar;
    $this->domain = $this->config
      ->get('bakery_domain');
    $this->freshness = (int) $this->config
      ->get('bakery_freshness');
    $this->secure = !empty(ini_get('session.cookie_secure'));
  }

  /**
   * Adds a query parameter to check successful log in redirect URL.
   *
   * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
   *   The Event to process.
   */
  public function meWantCookie(ResponseEvent $event) {
    $response = $event
      ->getResponse();
    $this->cookieJar
      ->all();
    if ($this->cookieJar
      ->count()) {
      foreach ($this->cookieJar
        ->all() as $name => $cookie) {
        if (empty($cookie)) {
          $response->headers
            ->clearCookie($name, '/', '', $this->secure);
          $response->headers
            ->clearCookie($name, '/', $this->domain, $this->secure);
        }
        else {
          $response->headers
            ->setCookie(Cookie::create($name, $cookie, $this->time
            ->getRequestTime() + $this->freshness, '/', $this->domain, $this->secure));
        }
      }
    }
  }

  /**
   * Registers the methods in this class that should be listeners.
   *
   * @return array
   *   An array of event listener definitions.
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = [
      'meWantCookie',
      -1000,
    ];
    return $events;
  }

}

Classes

Namesort descending Description
CookieMonster C is for cookie, its good enough for me.