Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
   1  <?php
   2  
   3  namespace GuzzleHttp\Cookie;
   4  
   5  /**
   6   * Persists cookies in the client session
   7   */
   8  class SessionCookieJar extends CookieJar
   9  {
  10      /**
  11       * @var string session key
  12       */
  13      private $sessionKey;
  14  
  15      /**
  16       * @var bool Control whether to persist session cookies or not.
  17       */
  18      private $storeSessionCookies;
  19  
  20      /**
  21       * Create a new SessionCookieJar object
  22       *
  23       * @param string $sessionKey          Session key name to store the cookie
  24       *                                    data in session
  25       * @param bool   $storeSessionCookies Set to true to store session cookies
  26       *                                    in the cookie jar.
  27       */
  28      public function __construct(string $sessionKey, bool $storeSessionCookies = false)
  29      {
  30          parent::__construct();
  31          $this->sessionKey = $sessionKey;
  32          $this->storeSessionCookies = $storeSessionCookies;
  33          $this->load();
  34      }
  35  
  36      /**
  37       * Saves cookies to session when shutting down
  38       */
  39      public function __destruct()
  40      {
  41          $this->save();
  42      }
  43  
  44      /**
  45       * Save cookies to the client session
  46       */
  47      public function save(): void
  48      {
  49          $json = [];
  50          /** @var SetCookie $cookie */
  51          foreach ($this as $cookie) {
  52              if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
  53                  $json[] = $cookie->toArray();
  54              }
  55          }
  56  
  57          $_SESSION[$this->sessionKey] = \json_encode($json);
  58      }
  59  
  60      /**
  61       * Load the contents of the client session into the data array
  62       */
  63      protected function load(): void
  64      {
  65          if (!isset($_SESSION[$this->sessionKey])) {
  66              return;
  67          }
  68          $data = \json_decode($_SESSION[$this->sessionKey], true);
  69          if (\is_array($data)) {
  70              foreach ($data as $cookie) {
  71                  $this->setCookie(new SetCookie($cookie));
  72              }
  73          } elseif (\strlen($data)) {
  74              throw new \RuntimeException("Invalid cookie data");
  75          }
  76      }
  77  }