comparison vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents
children 129ea1e6d783
comparison
equal deleted inserted replaced
13:5fb285c0d0e3 14:1fec387a4317
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
13
14 /**
15 * This abstract session handler provides a generic implementation
16 * of the PHP 7.0 SessionUpdateTimestampHandlerInterface,
17 * enabling strict and lazy session handling.
18 *
19 * @author Nicolas Grekas <p@tchwork.com>
20 */
21 abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
22 {
23 private $sessionName;
24 private $prefetchId;
25 private $prefetchData;
26 private $newSessionId;
27 private $igbinaryEmptyData;
28
29 /**
30 * {@inheritdoc}
31 */
32 public function open($savePath, $sessionName)
33 {
34 $this->sessionName = $sessionName;
35 if (!headers_sent() && !ini_get('session.cache_limiter') && '0' !== ini_get('session.cache_limiter')) {
36 header(sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) ini_get('session.cache_expire')));
37 }
38
39 return true;
40 }
41
42 /**
43 * @param string $sessionId
44 *
45 * @return string
46 */
47 abstract protected function doRead($sessionId);
48
49 /**
50 * @param string $sessionId
51 * @param string $data
52 *
53 * @return bool
54 */
55 abstract protected function doWrite($sessionId, $data);
56
57 /**
58 * @param string $sessionId
59 *
60 * @return bool
61 */
62 abstract protected function doDestroy($sessionId);
63
64 /**
65 * {@inheritdoc}
66 */
67 public function validateId($sessionId)
68 {
69 $this->prefetchData = $this->read($sessionId);
70 $this->prefetchId = $sessionId;
71
72 return '' !== $this->prefetchData;
73 }
74
75 /**
76 * {@inheritdoc}
77 */
78 public function read($sessionId)
79 {
80 if (null !== $this->prefetchId) {
81 $prefetchId = $this->prefetchId;
82 $prefetchData = $this->prefetchData;
83 $this->prefetchId = $this->prefetchData = null;
84
85 if ($prefetchId === $sessionId || '' === $prefetchData) {
86 $this->newSessionId = '' === $prefetchData ? $sessionId : null;
87
88 return $prefetchData;
89 }
90 }
91
92 $data = $this->doRead($sessionId);
93 $this->newSessionId = '' === $data ? $sessionId : null;
94 if (\PHP_VERSION_ID < 70000) {
95 $this->prefetchData = $data;
96 }
97
98 return $data;
99 }
100
101 /**
102 * {@inheritdoc}
103 */
104 public function write($sessionId, $data)
105 {
106 if (\PHP_VERSION_ID < 70000 && $this->prefetchData) {
107 $readData = $this->prefetchData;
108 $this->prefetchData = null;
109
110 if ($readData === $data) {
111 return $this->updateTimestamp($sessionId, $data);
112 }
113 }
114 if (null === $this->igbinaryEmptyData) {
115 // see https://github.com/igbinary/igbinary/issues/146
116 $this->igbinaryEmptyData = \function_exists('igbinary_serialize') ? igbinary_serialize(array()) : '';
117 }
118 if ('' === $data || $this->igbinaryEmptyData === $data) {
119 return $this->destroy($sessionId);
120 }
121 $this->newSessionId = null;
122
123 return $this->doWrite($sessionId, $data);
124 }
125
126 /**
127 * {@inheritdoc}
128 */
129 public function destroy($sessionId)
130 {
131 if (\PHP_VERSION_ID < 70000) {
132 $this->prefetchData = null;
133 }
134 if (!headers_sent() && ini_get('session.use_cookies')) {
135 if (!$this->sessionName) {
136 throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', get_class($this)));
137 }
138 $sessionCookie = sprintf(' %s=', urlencode($this->sessionName));
139 $sessionCookieWithId = sprintf('%s%s;', $sessionCookie, urlencode($sessionId));
140 $sessionCookieFound = false;
141 $otherCookies = array();
142 foreach (headers_list() as $h) {
143 if (0 !== stripos($h, 'Set-Cookie:')) {
144 continue;
145 }
146 if (11 === strpos($h, $sessionCookie, 11)) {
147 $sessionCookieFound = true;
148
149 if (11 !== strpos($h, $sessionCookieWithId, 11)) {
150 $otherCookies[] = $h;
151 }
152 } else {
153 $otherCookies[] = $h;
154 }
155 }
156 if ($sessionCookieFound) {
157 header_remove('Set-Cookie');
158 foreach ($otherCookies as $h) {
159 header($h, false);
160 }
161 } else {
162 setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
163 }
164 }
165
166 return $this->newSessionId === $sessionId || $this->doDestroy($sessionId);
167 }
168 }