Verzeichnisstruktur phpBB-3.3.15
- Veröffentlicht
- 28.08.2024
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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
Cookie.php
001 <?php
002
003 /*
004 * This file is part of the Symfony package.
005 *
006 * (c) Fabien Potencier <fabien@symfony.com>
007 *
008 * For the full copyright and license information, please view the LICENSE
009 * file that was distributed with this source code.
010 */
011
012 namespace Symfony\Component\HttpFoundation;
013
014 /**
015 * Represents a cookie.
016 *
017 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
018 */
019 class Cookie
020 {
021 const SAMESITE_NONE = 'none';
022 const SAMESITE_LAX = 'lax';
023 const SAMESITE_STRICT = 'strict';
024
025 protected $name;
026 protected $value;
027 protected $domain;
028 protected $expire;
029 protected $path;
030 protected $secure;
031 protected $httpOnly;
032
033 private $raw;
034 private $sameSite;
035
036 private static $reservedCharsList = "=,; \t\r\n\v\f";
037 private static $reservedCharsFrom = ['=', ',', ';', ' ', "\t", "\r", "\n", "\v", "\f"];
038 private static $reservedCharsTo = ['%3D', '%2C', '%3B', '%20', '%09', '%0D', '%0A', '%0B', '%0C'];
039
040 /**
041 * Creates cookie from raw header string.
042 *
043 * @param string $cookie
044 * @param bool $decode
045 *
046 * @return static
047 */
048 public static function fromString($cookie, $decode = false)
049 {
050 $data = [
051 'expires' => 0,
052 'path' => '/',
053 'domain' => null,
054 'secure' => false,
055 'httponly' => false,
056 'raw' => !$decode,
057 'samesite' => null,
058 ];
059 foreach (explode(';', $cookie) as $part) {
060 if (false === strpos($part, '=')) {
061 $key = trim($part);
062 $value = true;
063 } else {
064 list($key, $value) = explode('=', trim($part), 2);
065 $key = trim($key);
066 $value = trim($value);
067 }
068 if (!isset($data['name'])) {
069 $data['name'] = $decode ? urldecode($key) : $key;
070 $data['value'] = true === $value ? null : ($decode ? urldecode($value) : $value);
071 continue;
072 }
073 switch ($key = strtolower($key)) {
074 case 'name':
075 case 'value':
076 break;
077 case 'max-age':
078 $data['expires'] = time() + (int) $value;
079 break;
080 default:
081 $data[$key] = $value;
082 break;
083 }
084 }
085
086 return new static($data['name'], $data['value'], $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite']);
087 }
088
089 /**
090 * @param string $name The name of the cookie
091 * @param string|null $value The value of the cookie
092 * @param int|string|\DateTimeInterface $expire The time the cookie expires
093 * @param string $path The path on the server in which the cookie will be available on
094 * @param string|null $domain The domain that the cookie is available to
095 * @param bool $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client
096 * @param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
097 * @param bool $raw Whether the cookie value should be sent with no url encoding
098 * @param string|null $sameSite Whether the cookie will be available for cross-site requests
099 *
100 * @throws \InvalidArgumentException
101 */
102 public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null)
103 {
104 // from PHP source code
105 if ($raw && false !== strpbrk($name, self::$reservedCharsList)) {
106 throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name));
107 }
108
109 if (empty($name)) {
110 throw new \InvalidArgumentException('The cookie name cannot be empty.');
111 }
112
113 // convert expiration time to a Unix timestamp
114 if ($expire instanceof \DateTimeInterface) {
115 $expire = $expire->format('U');
116 } elseif (!is_numeric($expire)) {
117 $expire = strtotime($expire);
118
119 if (false === $expire) {
120 throw new \InvalidArgumentException('The cookie expiration time is not valid.');
121 }
122 }
123
124 $this->name = $name;
125 $this->value = $value;
126 $this->domain = $domain;
127 $this->expire = 0 < $expire ? (int) $expire : 0;
128 $this->path = empty($path) ? '/' : $path;
129 $this->secure = (bool) $secure;
130 $this->httpOnly = (bool) $httpOnly;
131 $this->raw = (bool) $raw;
132
133 if (null !== $sameSite) {
134 $sameSite = strtolower($sameSite);
135 }
136
137 if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) {
138 throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.');
139 }
140
141 $this->sameSite = $sameSite;
142 }
143
144 /**
145 * Returns the cookie as a string.
146 *
147 * @return string The cookie
148 */
149 public function __toString()
150 {
151 if ($this->isRaw()) {
152 $str = $this->getName();
153 } else {
154 $str = str_replace(self::$reservedCharsFrom, self::$reservedCharsTo, $this->getName());
155 }
156
157 $str .= '=';
158
159 if ('' === (string) $this->getValue()) {
160 $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0';
161 } else {
162 $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());
163
164 if (0 !== $this->getExpiresTime()) {
165 $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge();
166 }
167 }
168
169 if ($this->getPath()) {
170 $str .= '; path='.$this->getPath();
171 }
172
173 if ($this->getDomain()) {
174 $str .= '; domain='.$this->getDomain();
175 }
176
177 if (true === $this->isSecure()) {
178 $str .= '; secure';
179 }
180
181 if (true === $this->isHttpOnly()) {
182 $str .= '; httponly';
183 }
184
185 if (null !== $this->getSameSite()) {
186 $str .= '; samesite='.$this->getSameSite();
187 }
188
189 return $str;
190 }
191
192 /**
193 * Gets the name of the cookie.
194 *
195 * @return string
196 */
197 public function getName()
198 {
199 return $this->name;
200 }
201
202 /**
203 * Gets the value of the cookie.
204 *
205 * @return string|null
206 */
207 public function getValue()
208 {
209 return $this->value;
210 }
211
212 /**
213 * Gets the domain that the cookie is available to.
214 *
215 * @return string|null
216 */
217 public function getDomain()
218 {
219 return $this->domain;
220 }
221
222 /**
223 * Gets the time the cookie expires.
224 *
225 * @return int
226 */
227 public function getExpiresTime()
228 {
229 return $this->expire;
230 }
231
232 /**
233 * Gets the max-age attribute.
234 *
235 * @return int
236 */
237 public function getMaxAge()
238 {
239 $maxAge = $this->expire - time();
240
241 return 0 >= $maxAge ? 0 : $maxAge;
242 }
243
244 /**
245 * Gets the path on the server in which the cookie will be available on.
246 *
247 * @return string
248 */
249 public function getPath()
250 {
251 return $this->path;
252 }
253
254 /**
255 * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.
256 *
257 * @return bool
258 */
259 public function isSecure()
260 {
261 return $this->secure;
262 }
263
264 /**
265 * Checks whether the cookie will be made accessible only through the HTTP protocol.
266 *
267 * @return bool
268 */
269 public function isHttpOnly()
270 {
271 return $this->httpOnly;
272 }
273
274 /**
275 * Whether this cookie is about to be cleared.
276 *
277 * @return bool
278 */
279 public function isCleared()
280 {
281 return 0 !== $this->expire && $this->expire < time();
282 }
283
284 /**
285 * Checks if the cookie value should be sent with no url encoding.
286 *
287 * @return bool
288 */
289 public function isRaw()
290 {
291 return $this->raw;
292 }
293
294 /**
295 * Gets the SameSite attribute.
296 *
297 * @return string|null
298 */
299 public function getSameSite()
300 {
301 return $this->sameSite;
302 }
303 }
304