Skip to content

Commit 9d0cbd1

Browse files
committed
Session: session id cookie is checked only if it was not regenerated [Closes #133][Closes #129]
1 parent b03ae83 commit 9d0cbd1

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

src/Http/Session.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ public function start()
7575

7676
$this->configure($this->options);
7777

78-
$id = $this->request->getCookie(session_name());
79-
if (is_string($id) && preg_match('#^[0-9a-zA-Z,-]{22,256}\z#i', $id)) {
80-
session_id($id);
81-
} else {
82-
unset($_COOKIE[session_name()]);
78+
if (!session_id()) {
79+
$id = $this->request->getCookie(session_name());
80+
if (is_string($id) && preg_match('#^[0-9a-zA-Z,-]{22,256}\z#i', $id)) {
81+
session_id($id);
82+
} else {
83+
unset($_COOKIE[session_name()]);
84+
}
8385
}
8486

8587
try {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/**
4+
* Test: Nette\Http\Session is preserved after regenerateId and restarting
5+
*/
6+
7+
use Nette\Http;
8+
use Tester\Assert;
9+
10+
11+
require __DIR__ . '/../bootstrap.php';
12+
13+
$cookies = [session_name() => $sessionId = md5('3')];
14+
file_put_contents(TEMP_DIR . '/sess_' . $sessionId, sprintf('__NF|a:2:{s:4:"Time";i:%s;s:4:"DATA";a:1:{s:4:"temp";a:1:{s:5:"value";s:3:"yes";}}}', time() - 1000));
15+
16+
$session = new Http\Session(new Http\Request(new Http\UrlScript, null, [], [], $cookies), new Http\Response);
17+
18+
$session->start();
19+
Assert::same($sessionId, $session->getId());
20+
Assert::same('yes', $session->getSection('temp')->value);
21+
22+
$session->regenerateId();
23+
Assert::notSame($sessionId, $session->getId());
24+
Assert::same(session_id(), $session->getId());
25+
$session->close();
26+
27+
$session->start();
28+
Assert::same('yes', $session->getSection('temp')->value);
29+
30+
Assert::true(file_exists(TEMP_DIR . '/sess_' . $session->getId()));
31+
Assert::count(1, glob(TEMP_DIR . '/sess_*'));

0 commit comments

Comments
 (0)