Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

CookieJar.php

Zuletzt modifiziert: 01.05.2026, 11:27 - Dateigröße: 9.38 KiB


 001  <?php
 002  namespace GuzzleHttp\Cookie;
 003   
 004  use Psr\Http\Message\RequestInterface;
 005  use Psr\Http\Message\ResponseInterface;
 006   
 007  /**
 008   * Cookie jar that stores cookies as an array
 009   */
 010  class CookieJar implements CookieJarInterface
 011  {
 012      /** @var SetCookie[] Loaded cookie data */
 013      private $cookies = [];
 014   
 015      /** @var bool */
 016      private $strictMode;
 017   
 018      /**
 019       * @param bool $strictMode   Set to true to throw exceptions when invalid
 020       *                           cookies are added to the cookie jar.
 021       * @param array $cookieArray Array of SetCookie objects or a hash of
 022       *                           arrays that can be used with the SetCookie
 023       *                           constructor
 024       */
 025      public function __construct($strictMode = false, $cookieArray = [])
 026      {
 027          $this->strictMode = $strictMode;
 028   
 029          foreach ($cookieArray as $cookie) {
 030              if (!($cookie instanceof SetCookie)) {
 031                  $cookie = new SetCookie($cookie);
 032              }
 033              $this->setCookie($cookie);
 034          }
 035      }
 036   
 037      /**
 038       * Create a new Cookie jar from an associative array and domain.
 039       *
 040       * @param array  $cookies Cookies to create the jar from
 041       * @param string $domain  Domain to set the cookies to
 042       *
 043       * @return self
 044       */
 045      public static function fromArray(array $cookies, $domain)
 046      {
 047          $cookieJar = new self();
 048          foreach ($cookies as $name => $value) {
 049              $cookieJar->setCookie(new SetCookie([
 050                  'Domain'  => $domain,
 051                  'Name'    => $name,
 052                  'Value'   => $value,
 053                  'Discard' => true
 054              ]));
 055          }
 056   
 057          return $cookieJar;
 058      }
 059   
 060      /**
 061       * @deprecated
 062       */
 063      public static function getCookieValue($value)
 064      {
 065          return $value;
 066      }
 067   
 068      /**
 069       * Evaluate if this cookie should be persisted to storage
 070       * that survives between requests.
 071       *
 072       * @param SetCookie $cookie Being evaluated.
 073       * @param bool $allowSessionCookies If we should persist session cookies
 074       * @return bool
 075       */
 076      public static function shouldPersist(
 077          SetCookie $cookie,
 078          $allowSessionCookies = false
 079      ) {
 080          if ($cookie->getExpires() || $allowSessionCookies) {
 081              if (!$cookie->getDiscard()) {
 082                  return true;
 083              }
 084          }
 085   
 086          return false;
 087      }
 088   
 089      /**
 090       * Finds and returns the cookie based on the name
 091       *
 092       * @param string $name cookie name to search for
 093       * @return SetCookie|null cookie that was found or null if not found
 094       */
 095      public function getCookieByName($name)
 096      {
 097          // don't allow a non string name
 098          if ($name === null || !is_scalar($name)) {
 099              return null;
 100          }
 101          foreach ($this->cookies as $cookie) {
 102              if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
 103                  return $cookie;
 104              }
 105          }
 106   
 107          return null;
 108      }
 109   
 110      public function toArray()
 111      {
 112          return array_map(function (SetCookie $cookie) {
 113              return $cookie->toArray();
 114          }, $this->getIterator()->getArrayCopy());
 115      }
 116   
 117      public function clear($domain = null, $path = null, $name = null)
 118      {
 119          if (!$domain) {
 120              $this->cookies = [];
 121              return;
 122          } elseif (!$path) {
 123              $this->cookies = array_filter(
 124                  $this->cookies,
 125                  function (SetCookie $cookie) use ($domain) {
 126                      return !$cookie->matchesDomain($domain);
 127                  }
 128              );
 129          } elseif (!$name) {
 130              $this->cookies = array_filter(
 131                  $this->cookies,
 132                  function (SetCookie $cookie) use ($path, $domain) {
 133                      return !($cookie->matchesPath($path) &&
 134                          $cookie->matchesDomain($domain));
 135                  }
 136              );
 137          } else {
 138              $this->cookies = array_filter(
 139                  $this->cookies,
 140                  function (SetCookie $cookie) use ($path, $domain, $name) {
 141                      return !($cookie->getName() == $name &&
 142                          $cookie->matchesPath($path) &&
 143                          $cookie->matchesDomain($domain));
 144                  }
 145              );
 146          }
 147      }
 148   
 149      public function clearSessionCookies()
 150      {
 151          $this->cookies = array_filter(
 152              $this->cookies,
 153              function (SetCookie $cookie) {
 154                  return !$cookie->getDiscard() && $cookie->getExpires();
 155              }
 156          );
 157      }
 158   
 159      public function setCookie(SetCookie $cookie)
 160      {
 161          // If the name string is empty (but not 0), ignore the set-cookie
 162          // string entirely.
 163          $name = $cookie->getName();
 164          if (!$name && $name !== '0') {
 165              return false;
 166          }
 167   
 168          // Only allow cookies with set and valid domain, name, value
 169          $result = $cookie->validate();
 170          if ($result !== true) {
 171              if ($this->strictMode) {
 172                  throw new \RuntimeException('Invalid cookie: ' . $result);
 173              } else {
 174                  $this->removeCookieIfEmpty($cookie);
 175                  return false;
 176              }
 177          }
 178   
 179          // Resolve conflicts with previously set cookies
 180          foreach ($this->cookies as $i => $c) {
 181   
 182              // Two cookies are identical, when their path, and domain are
 183              // identical.
 184              if ($c->getPath() != $cookie->getPath() ||
 185                  $c->getDomain() != $cookie->getDomain() ||
 186                  $c->getName() != $cookie->getName()
 187              ) {
 188                  continue;
 189              }
 190   
 191              // The previously set cookie is a discard cookie and this one is
 192              // not so allow the new cookie to be set
 193              if (!$cookie->getDiscard() && $c->getDiscard()) {
 194                  unset($this->cookies[$i]);
 195                  continue;
 196              }
 197   
 198              // If the new cookie's expiration is further into the future, then
 199              // replace the old cookie
 200              if ($cookie->getExpires() > $c->getExpires()) {
 201                  unset($this->cookies[$i]);
 202                  continue;
 203              }
 204   
 205              // If the value has changed, we better change it
 206              if ($cookie->getValue() !== $c->getValue()) {
 207                  unset($this->cookies[$i]);
 208                  continue;
 209              }
 210   
 211              // The cookie exists, so no need to continue
 212              return false;
 213          }
 214   
 215          $this->cookies[] = $cookie;
 216   
 217          return true;
 218      }
 219   
 220      public function count()
 221      {
 222          return count($this->cookies);
 223      }
 224   
 225      public function getIterator()
 226      {
 227          return new \ArrayIterator(array_values($this->cookies));
 228      }
 229   
 230      public function extractCookies(
 231          RequestInterface $request,
 232          ResponseInterface $response
 233      ) {
 234          if ($cookieHeader = $response->getHeader('Set-Cookie')) {
 235              foreach ($cookieHeader as $cookie) {
 236                  $sc = SetCookie::fromString($cookie);
 237                  if (!$sc->getDomain()) {
 238                      $sc->setDomain($request->getUri()->getHost());
 239                  }
 240                  if (0 !== strpos($sc->getPath(), '/')) {
 241                      $sc->setPath($this->getCookiePathFromRequest($request));
 242                  }
 243                  if (!$sc->matchesDomain($request->getUri()->getHost())) {
 244                      continue;
 245                  }
 246                  // Note: At this point `$sc->getDomain()` being a public suffix should
 247                  // be rejected, but we don't want to pull in the full PSL dependency.
 248                  $this->setCookie($sc);
 249              }
 250          }
 251      }
 252   
 253      /**
 254       * Computes cookie path following RFC 6265 section 5.1.4
 255       *
 256       * @link https://tools.ietf.org/html/rfc6265#section-5.1.4
 257       *
 258       * @param RequestInterface $request
 259       * @return string
 260       */
 261      private function getCookiePathFromRequest(RequestInterface $request)
 262      {
 263          $uriPath = $request->getUri()->getPath();
 264          if (''  === $uriPath) {
 265              return '/';
 266          }
 267          if (0 !== strpos($uriPath, '/')) {
 268              return '/';
 269          }
 270          if ('/' === $uriPath) {
 271              return '/';
 272          }
 273          if (0 === $lastSlashPos = strrpos($uriPath, '/')) {
 274              return '/';
 275          }
 276   
 277          return substr($uriPath, 0, $lastSlashPos);
 278      }
 279   
 280      public function withCookieHeader(RequestInterface $request)
 281      {
 282          $values = [];
 283          $uri = $request->getUri();
 284          $scheme = $uri->getScheme();
 285          $host = $uri->getHost();
 286          $path = $uri->getPath() ?: '/';
 287   
 288          foreach ($this->cookies as $cookie) {
 289              if ($cookie->matchesPath($path) &&
 290                  $cookie->matchesDomain($host) &&
 291                  !$cookie->isExpired() &&
 292                  (!$cookie->getSecure() || $scheme === 'https')
 293              ) {
 294                  $values[] = $cookie->getName() . '='
 295                      . $cookie->getValue();
 296              }
 297          }
 298   
 299          return $values
 300              ? $request->withHeader('Cookie', implode('; ', $values))
 301              : $request;
 302      }
 303   
 304      /**
 305       * If a cookie already exists and the server asks to set it again with a
 306       * null value, the cookie must be deleted.
 307       *
 308       * @param SetCookie $cookie
 309       */
 310      private function removeCookieIfEmpty(SetCookie $cookie)
 311      {
 312          $cookieValue = $cookie->getValue();
 313          if ($cookieValue === null || $cookieValue === '') {
 314              $this->clear(
 315                  $cookie->getDomain(),
 316                  $cookie->getPath(),
 317                  $cookie->getName()
 318              );
 319          }
 320      }
 321  }
 322