Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Component\HttpFoundation\Session\Storage;
|
Chris@0
|
13
|
Chris@0
|
14 use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
|
Chris@0
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * MockArraySessionStorage mocks the session for unit tests.
|
Chris@0
|
18 *
|
Chris@0
|
19 * No PHP session is actually started since a session can be initialized
|
Chris@0
|
20 * and shutdown only once per PHP execution cycle.
|
Chris@0
|
21 *
|
Chris@0
|
22 * When doing functional testing, you should use MockFileSessionStorage instead.
|
Chris@0
|
23 *
|
Chris@0
|
24 * @author Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
25 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
|
Chris@0
|
26 * @author Drak <drak@zikula.org>
|
Chris@0
|
27 */
|
Chris@0
|
28 class MockArraySessionStorage implements SessionStorageInterface
|
Chris@0
|
29 {
|
Chris@0
|
30 /**
|
Chris@0
|
31 * @var string
|
Chris@0
|
32 */
|
Chris@0
|
33 protected $id = '';
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * @var string
|
Chris@0
|
37 */
|
Chris@0
|
38 protected $name;
|
Chris@0
|
39
|
Chris@0
|
40 /**
|
Chris@0
|
41 * @var bool
|
Chris@0
|
42 */
|
Chris@0
|
43 protected $started = false;
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * @var bool
|
Chris@0
|
47 */
|
Chris@0
|
48 protected $closed = false;
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * @var array
|
Chris@0
|
52 */
|
Chris@17
|
53 protected $data = [];
|
Chris@0
|
54
|
Chris@0
|
55 /**
|
Chris@0
|
56 * @var MetadataBag
|
Chris@0
|
57 */
|
Chris@0
|
58 protected $metadataBag;
|
Chris@0
|
59
|
Chris@0
|
60 /**
|
Chris@0
|
61 * @var array|SessionBagInterface[]
|
Chris@0
|
62 */
|
Chris@17
|
63 protected $bags = [];
|
Chris@0
|
64
|
Chris@0
|
65 /**
|
Chris@0
|
66 * @param string $name Session name
|
Chris@0
|
67 * @param MetadataBag $metaBag MetadataBag instance
|
Chris@0
|
68 */
|
Chris@0
|
69 public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null)
|
Chris@0
|
70 {
|
Chris@0
|
71 $this->name = $name;
|
Chris@0
|
72 $this->setMetadataBag($metaBag);
|
Chris@0
|
73 }
|
Chris@0
|
74
|
Chris@0
|
75 public function setSessionData(array $array)
|
Chris@0
|
76 {
|
Chris@0
|
77 $this->data = $array;
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 /**
|
Chris@0
|
81 * {@inheritdoc}
|
Chris@0
|
82 */
|
Chris@0
|
83 public function start()
|
Chris@0
|
84 {
|
Chris@0
|
85 if ($this->started) {
|
Chris@0
|
86 return true;
|
Chris@0
|
87 }
|
Chris@0
|
88
|
Chris@0
|
89 if (empty($this->id)) {
|
Chris@0
|
90 $this->id = $this->generateId();
|
Chris@0
|
91 }
|
Chris@0
|
92
|
Chris@0
|
93 $this->loadSession();
|
Chris@0
|
94
|
Chris@0
|
95 return true;
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * {@inheritdoc}
|
Chris@0
|
100 */
|
Chris@0
|
101 public function regenerate($destroy = false, $lifetime = null)
|
Chris@0
|
102 {
|
Chris@0
|
103 if (!$this->started) {
|
Chris@0
|
104 $this->start();
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 $this->metadataBag->stampNew($lifetime);
|
Chris@0
|
108 $this->id = $this->generateId();
|
Chris@0
|
109
|
Chris@0
|
110 return true;
|
Chris@0
|
111 }
|
Chris@0
|
112
|
Chris@0
|
113 /**
|
Chris@0
|
114 * {@inheritdoc}
|
Chris@0
|
115 */
|
Chris@0
|
116 public function getId()
|
Chris@0
|
117 {
|
Chris@0
|
118 return $this->id;
|
Chris@0
|
119 }
|
Chris@0
|
120
|
Chris@0
|
121 /**
|
Chris@0
|
122 * {@inheritdoc}
|
Chris@0
|
123 */
|
Chris@0
|
124 public function setId($id)
|
Chris@0
|
125 {
|
Chris@0
|
126 if ($this->started) {
|
Chris@0
|
127 throw new \LogicException('Cannot set session ID after the session has started.');
|
Chris@0
|
128 }
|
Chris@0
|
129
|
Chris@0
|
130 $this->id = $id;
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@0
|
133 /**
|
Chris@0
|
134 * {@inheritdoc}
|
Chris@0
|
135 */
|
Chris@0
|
136 public function getName()
|
Chris@0
|
137 {
|
Chris@0
|
138 return $this->name;
|
Chris@0
|
139 }
|
Chris@0
|
140
|
Chris@0
|
141 /**
|
Chris@0
|
142 * {@inheritdoc}
|
Chris@0
|
143 */
|
Chris@0
|
144 public function setName($name)
|
Chris@0
|
145 {
|
Chris@0
|
146 $this->name = $name;
|
Chris@0
|
147 }
|
Chris@0
|
148
|
Chris@0
|
149 /**
|
Chris@0
|
150 * {@inheritdoc}
|
Chris@0
|
151 */
|
Chris@0
|
152 public function save()
|
Chris@0
|
153 {
|
Chris@0
|
154 if (!$this->started || $this->closed) {
|
Chris@0
|
155 throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
|
Chris@0
|
156 }
|
Chris@0
|
157 // nothing to do since we don't persist the session data
|
Chris@0
|
158 $this->closed = false;
|
Chris@0
|
159 $this->started = false;
|
Chris@0
|
160 }
|
Chris@0
|
161
|
Chris@0
|
162 /**
|
Chris@0
|
163 * {@inheritdoc}
|
Chris@0
|
164 */
|
Chris@0
|
165 public function clear()
|
Chris@0
|
166 {
|
Chris@0
|
167 // clear out the bags
|
Chris@0
|
168 foreach ($this->bags as $bag) {
|
Chris@0
|
169 $bag->clear();
|
Chris@0
|
170 }
|
Chris@0
|
171
|
Chris@0
|
172 // clear out the session
|
Chris@17
|
173 $this->data = [];
|
Chris@0
|
174
|
Chris@0
|
175 // reconnect the bags to the session
|
Chris@0
|
176 $this->loadSession();
|
Chris@0
|
177 }
|
Chris@0
|
178
|
Chris@0
|
179 /**
|
Chris@0
|
180 * {@inheritdoc}
|
Chris@0
|
181 */
|
Chris@0
|
182 public function registerBag(SessionBagInterface $bag)
|
Chris@0
|
183 {
|
Chris@0
|
184 $this->bags[$bag->getName()] = $bag;
|
Chris@0
|
185 }
|
Chris@0
|
186
|
Chris@0
|
187 /**
|
Chris@0
|
188 * {@inheritdoc}
|
Chris@0
|
189 */
|
Chris@0
|
190 public function getBag($name)
|
Chris@0
|
191 {
|
Chris@0
|
192 if (!isset($this->bags[$name])) {
|
Chris@0
|
193 throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
|
Chris@0
|
194 }
|
Chris@0
|
195
|
Chris@0
|
196 if (!$this->started) {
|
Chris@0
|
197 $this->start();
|
Chris@0
|
198 }
|
Chris@0
|
199
|
Chris@0
|
200 return $this->bags[$name];
|
Chris@0
|
201 }
|
Chris@0
|
202
|
Chris@0
|
203 /**
|
Chris@0
|
204 * {@inheritdoc}
|
Chris@0
|
205 */
|
Chris@0
|
206 public function isStarted()
|
Chris@0
|
207 {
|
Chris@0
|
208 return $this->started;
|
Chris@0
|
209 }
|
Chris@0
|
210
|
Chris@0
|
211 public function setMetadataBag(MetadataBag $bag = null)
|
Chris@0
|
212 {
|
Chris@0
|
213 if (null === $bag) {
|
Chris@0
|
214 $bag = new MetadataBag();
|
Chris@0
|
215 }
|
Chris@0
|
216
|
Chris@0
|
217 $this->metadataBag = $bag;
|
Chris@0
|
218 }
|
Chris@0
|
219
|
Chris@0
|
220 /**
|
Chris@0
|
221 * Gets the MetadataBag.
|
Chris@0
|
222 *
|
Chris@0
|
223 * @return MetadataBag
|
Chris@0
|
224 */
|
Chris@0
|
225 public function getMetadataBag()
|
Chris@0
|
226 {
|
Chris@0
|
227 return $this->metadataBag;
|
Chris@0
|
228 }
|
Chris@0
|
229
|
Chris@0
|
230 /**
|
Chris@0
|
231 * Generates a session ID.
|
Chris@0
|
232 *
|
Chris@0
|
233 * This doesn't need to be particularly cryptographically secure since this is just
|
Chris@0
|
234 * a mock.
|
Chris@0
|
235 *
|
Chris@0
|
236 * @return string
|
Chris@0
|
237 */
|
Chris@0
|
238 protected function generateId()
|
Chris@0
|
239 {
|
Chris@0
|
240 return hash('sha256', uniqid('ss_mock_', true));
|
Chris@0
|
241 }
|
Chris@0
|
242
|
Chris@0
|
243 protected function loadSession()
|
Chris@0
|
244 {
|
Chris@17
|
245 $bags = array_merge($this->bags, [$this->metadataBag]);
|
Chris@0
|
246
|
Chris@0
|
247 foreach ($bags as $bag) {
|
Chris@0
|
248 $key = $bag->getStorageKey();
|
Chris@17
|
249 $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : [];
|
Chris@0
|
250 $bag->initialize($this->data[$key]);
|
Chris@0
|
251 }
|
Chris@0
|
252
|
Chris@0
|
253 $this->started = true;
|
Chris@0
|
254 $this->closed = false;
|
Chris@0
|
255 }
|
Chris@0
|
256 }
|