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

SetCookie.php

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


 001  <?php
 002  namespace GuzzleHttp\Cookie;
 003   
 004  /**
 005   * Set-Cookie object
 006   */
 007  class SetCookie
 008  {
 009      /** @var array */
 010      private static $defaults = [
 011          'Name'     => null,
 012          'Value'    => null,
 013          'Domain'   => null,
 014          'Path'     => '/',
 015          'Max-Age'  => null,
 016          'Expires'  => null,
 017          'Secure'   => false,
 018          'Discard'  => false,
 019          'HttpOnly' => false
 020      ];
 021   
 022      /** @var array Cookie data */
 023      private $data;
 024   
 025      /**
 026       * Create a new SetCookie object from a string
 027       *
 028       * @param string $cookie Set-Cookie header string
 029       *
 030       * @return self
 031       */
 032      public static function fromString($cookie)
 033      {
 034          // Create the default return array
 035          $data = self::$defaults;
 036          // Explode the cookie string using a series of semicolons
 037          $pieces = array_filter(array_map('trim', explode(';', $cookie)));
 038          // The name of the cookie (first kvp) must exist and include an equal sign.
 039          if (empty($pieces[0]) || !strpos($pieces[0], '=')) {
 040              return new self($data);
 041          }
 042   
 043          // Add the cookie pieces into the parsed data array
 044          foreach ($pieces as $part) {
 045              $cookieParts = explode('=', $part, 2);
 046              $key = trim($cookieParts[0]);
 047              $value = isset($cookieParts[1])
 048                  ? trim($cookieParts[1], " \n\r\t\0\x0B")
 049                  : true;
 050   
 051              // Only check for non-cookies when cookies have been found
 052              if (empty($data['Name'])) {
 053                  $data['Name'] = $key;
 054                  $data['Value'] = $value;
 055              } else {
 056                  foreach (array_keys(self::$defaults) as $search) {
 057                      if (!strcasecmp($search, $key)) {
 058                          $data[$search] = $value;
 059                          continue 2;
 060                      }
 061                  }
 062                  $data[$key] = $value;
 063              }
 064          }
 065   
 066          return new self($data);
 067      }
 068   
 069      /**
 070       * @param array $data Array of cookie data provided by a Cookie parser
 071       */
 072      public function __construct(array $data = [])
 073      {
 074          $this->data = array_replace(self::$defaults, $data);
 075          // Extract the Expires value and turn it into a UNIX timestamp if needed
 076          if (!$this->getExpires() && $this->getMaxAge()) {
 077              // Calculate the Expires date
 078              $this->setExpires(time() + $this->getMaxAge());
 079          } elseif ($this->getExpires() && !is_numeric($this->getExpires())) {
 080              $this->setExpires($this->getExpires());
 081          }
 082      }
 083   
 084      public function __toString()
 085      {
 086          $str = $this->data['Name'] . '=' . $this->data['Value'] . '; ';
 087          foreach ($this->data as $k => $v) {
 088              if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
 089                  if ($k === 'Expires') {
 090                      $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
 091                  } else {
 092                      $str .= ($v === true ? $k : "{$k}={$v}") . '; ';
 093                  }
 094              }
 095          }
 096   
 097          return rtrim($str, '; ');
 098      }
 099   
 100      public function toArray()
 101      {
 102          return $this->data;
 103      }
 104   
 105      /**
 106       * Get the cookie name
 107       *
 108       * @return string
 109       */
 110      public function getName()
 111      {
 112          return $this->data['Name'];
 113      }
 114   
 115      /**
 116       * Set the cookie name
 117       *
 118       * @param string $name Cookie name
 119       */
 120      public function setName($name)
 121      {
 122          $this->data['Name'] = $name;
 123      }
 124   
 125      /**
 126       * Get the cookie value
 127       *
 128       * @return string
 129       */
 130      public function getValue()
 131      {
 132          return $this->data['Value'];
 133      }
 134   
 135      /**
 136       * Set the cookie value
 137       *
 138       * @param string $value Cookie value
 139       */
 140      public function setValue($value)
 141      {
 142          $this->data['Value'] = $value;
 143      }
 144   
 145      /**
 146       * Get the domain
 147       *
 148       * @return string|null
 149       */
 150      public function getDomain()
 151      {
 152          return $this->data['Domain'];
 153      }
 154   
 155      /**
 156       * Set the domain of the cookie
 157       *
 158       * @param string $domain
 159       */
 160      public function setDomain($domain)
 161      {
 162          $this->data['Domain'] = $domain;
 163      }
 164   
 165      /**
 166       * Get the path
 167       *
 168       * @return string
 169       */
 170      public function getPath()
 171      {
 172          return $this->data['Path'];
 173      }
 174   
 175      /**
 176       * Set the path of the cookie
 177       *
 178       * @param string $path Path of the cookie
 179       */
 180      public function setPath($path)
 181      {
 182          $this->data['Path'] = $path;
 183      }
 184   
 185      /**
 186       * Maximum lifetime of the cookie in seconds
 187       *
 188       * @return int|null
 189       */
 190      public function getMaxAge()
 191      {
 192          return $this->data['Max-Age'];
 193      }
 194   
 195      /**
 196       * Set the max-age of the cookie
 197       *
 198       * @param int $maxAge Max age of the cookie in seconds
 199       */
 200      public function setMaxAge($maxAge)
 201      {
 202          $this->data['Max-Age'] = $maxAge;
 203      }
 204   
 205      /**
 206       * The UNIX timestamp when the cookie Expires
 207       *
 208       * @return mixed
 209       */
 210      public function getExpires()
 211      {
 212          return $this->data['Expires'];
 213      }
 214   
 215      /**
 216       * Set the unix timestamp for which the cookie will expire
 217       *
 218       * @param int $timestamp Unix timestamp
 219       */
 220      public function setExpires($timestamp)
 221      {
 222          $this->data['Expires'] = is_numeric($timestamp)
 223              ? (int) $timestamp
 224              : strtotime($timestamp);
 225      }
 226   
 227      /**
 228       * Get whether or not this is a secure cookie
 229       *
 230       * @return bool|null
 231       */
 232      public function getSecure()
 233      {
 234          return $this->data['Secure'];
 235      }
 236   
 237      /**
 238       * Set whether or not the cookie is secure
 239       *
 240       * @param bool $secure Set to true or false if secure
 241       */
 242      public function setSecure($secure)
 243      {
 244          $this->data['Secure'] = $secure;
 245      }
 246   
 247      /**
 248       * Get whether or not this is a session cookie
 249       *
 250       * @return bool|null
 251       */
 252      public function getDiscard()
 253      {
 254          return $this->data['Discard'];
 255      }
 256   
 257      /**
 258       * Set whether or not this is a session cookie
 259       *
 260       * @param bool $discard Set to true or false if this is a session cookie
 261       */
 262      public function setDiscard($discard)
 263      {
 264          $this->data['Discard'] = $discard;
 265      }
 266   
 267      /**
 268       * Get whether or not this is an HTTP only cookie
 269       *
 270       * @return bool
 271       */
 272      public function getHttpOnly()
 273      {
 274          return $this->data['HttpOnly'];
 275      }
 276   
 277      /**
 278       * Set whether or not this is an HTTP only cookie
 279       *
 280       * @param bool $httpOnly Set to true or false if this is HTTP only
 281       */
 282      public function setHttpOnly($httpOnly)
 283      {
 284          $this->data['HttpOnly'] = $httpOnly;
 285      }
 286   
 287      /**
 288       * Check if the cookie matches a path value.
 289       *
 290       * A request-path path-matches a given cookie-path if at least one of
 291       * the following conditions holds:
 292       *
 293       * - The cookie-path and the request-path are identical.
 294       * - The cookie-path is a prefix of the request-path, and the last
 295       *   character of the cookie-path is %x2F ("/").
 296       * - The cookie-path is a prefix of the request-path, and the first
 297       *   character of the request-path that is not included in the cookie-
 298       *   path is a %x2F ("/") character.
 299       *
 300       * @param string $requestPath Path to check against
 301       *
 302       * @return bool
 303       */
 304      public function matchesPath($requestPath)
 305      {
 306          $cookiePath = $this->getPath();
 307   
 308          // Match on exact matches or when path is the default empty "/"
 309          if ($cookiePath === '/' || $cookiePath == $requestPath) {
 310              return true;
 311          }
 312   
 313          // Ensure that the cookie-path is a prefix of the request path.
 314          if (0 !== strpos($requestPath, $cookiePath)) {
 315              return false;
 316          }
 317   
 318          // Match if the last character of the cookie-path is "/"
 319          if (substr($cookiePath, -1, 1) === '/') {
 320              return true;
 321          }
 322   
 323          // Match if the first character not included in cookie path is "/"
 324          return substr($requestPath, strlen($cookiePath), 1) === '/';
 325      }
 326   
 327      /**
 328       * Check if the cookie matches a domain value
 329       *
 330       * @param string $domain Domain to check against
 331       *
 332       * @return bool
 333       */
 334      public function matchesDomain($domain)
 335      {
 336          $cookieDomain = $this->getDomain();
 337          if (null === $cookieDomain) {
 338              return true;
 339          }
 340   
 341          // Remove the leading '.' as per spec in RFC 6265.
 342          // http://tools.ietf.org/html/rfc6265#section-5.2.3
 343          $cookieDomain = ltrim(strtolower($cookieDomain), '.');
 344   
 345          $domain = strtolower($domain);
 346   
 347          // Domain not set or exact match.
 348          if ('' === $cookieDomain || $domain === $cookieDomain) {
 349              return true;
 350          }
 351   
 352          // Matching the subdomain according to RFC 6265.
 353          // http://tools.ietf.org/html/rfc6265#section-5.1.3
 354          if (filter_var($domain, FILTER_VALIDATE_IP)) {
 355              return false;
 356          }
 357   
 358          return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain);
 359      }
 360   
 361      /**
 362       * Check if the cookie is expired
 363       *
 364       * @return bool
 365       */
 366      public function isExpired()
 367      {
 368          return $this->getExpires() !== null && time() > $this->getExpires();
 369      }
 370   
 371      /**
 372       * Check if the cookie is valid according to RFC 6265
 373       *
 374       * @return bool|string Returns true if valid or an error message if invalid
 375       */
 376      public function validate()
 377      {
 378          // Names must not be empty, but can be 0
 379          $name = $this->getName();
 380          if (empty($name) && !is_numeric($name)) {
 381              return 'The cookie name must not be empty';
 382          }
 383   
 384          // Check if any of the invalid characters are present in the cookie name
 385          if (preg_match(
 386              '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/',
 387              $name
 388          )) {
 389              return 'Cookie name must not contain invalid characters: ASCII '
 390                  . 'Control characters (0-31;127), space, tab and the '
 391                  . 'following characters: ()<>@,;:\"/?={}';
 392          }
 393   
 394          // Value must not be empty, but can be 0
 395          $value = $this->getValue();
 396          if (empty($value) && !is_numeric($value)) {
 397              return 'The cookie value must not be empty';
 398          }
 399   
 400          // Domains must not be empty, but can be 0
 401          // A "0" is not a valid internet domain, but may be used as server name
 402          // in a private network.
 403          $domain = $this->getDomain();
 404          if (empty($domain) && !is_numeric($domain)) {
 405              return 'The cookie domain must not be empty';
 406          }
 407   
 408          return true;
 409      }
 410  }
 411