Skip to content

Commit 8c9bcb5

Browse files
committed
fix: Session::markAsTempdata() adding wrong TTL
1 parent 8c6da93 commit 8c9bcb5

File tree

2 files changed

+34
-25
lines changed

2 files changed

+34
-25
lines changed

system/Session/Session.php

+17-25
Original file line numberDiff line numberDiff line change
@@ -817,39 +817,31 @@ public function removeTempdata(string $key)
817817
*/
818818
public function markAsTempdata($key, int $ttl = 300): bool
819819
{
820-
$ttl += Time::now()->getTimestamp();
820+
$time = Time::now()->getTimestamp();
821+
$keys = is_array($key) ? $key : [$key];
821822

822-
if (is_array($key)) {
823-
$temp = [];
824-
825-
foreach ($key as $k => $v) {
826-
// Do we have a key => ttl pair, or just a key?
827-
if (is_int($k)) {
828-
$k = $v;
829-
$v = $ttl;
830-
} elseif (is_string($v)) {
831-
$v = Time::now()->getTimestamp() + $ttl;
832-
} else {
833-
$v += Time::now()->getTimestamp();
834-
}
823+
if (array_is_list($keys)) {
824+
$keys = array_fill_keys($keys, $ttl);
825+
}
835826

836-
if (! array_key_exists($k, $_SESSION)) {
837-
return false;
838-
}
827+
$tempdata = [];
839828

840-
$temp[$k] = $v;
829+
foreach ($keys as $sessionKey => $timeToLive) {
830+
if (! array_key_exists($sessionKey, $_SESSION)) {
831+
return false;
841832
}
842833

843-
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $temp) : $temp;
844-
845-
return true;
846-
}
834+
if (is_int($timeToLive)) {
835+
$timeToLive += $time;
836+
} else {
837+
$timeToLive = $time + $ttl;
838+
}
847839

848-
if (! isset($_SESSION[$key])) {
849-
return false;
840+
$tempdata[$sessionKey] = $timeToLive;
850841
}
851842

852-
$_SESSION['__ci_vars'][$key] = $ttl;
843+
$_SESSION['__ci_vars'] ??= [];
844+
$_SESSION['__ci_vars'] = [...$_SESSION['__ci_vars'], ...$tempdata];
853845

854846
return true;
855847
}

tests/system/Session/SessionTest.php

+17
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,23 @@ public function testSetTempDataArraySingleTTL(): void
462462
$this->assertLessThanOrEqual($_SESSION['__ci_vars']['baz'], $time + 200);
463463
}
464464

465+
/**
466+
* @see https://github.com/codeigniter4/CodeIgniter4/issues/9534
467+
*/
468+
public function testSetTempDataOnArrayData(): void
469+
{
470+
$session = $this->getInstance();
471+
$session->start();
472+
473+
$time = time();
474+
475+
$session->setTempdata(['foo1' => 'bar1'], null, 200);
476+
$session->setTempdata('foo2', 'bar2', 200);
477+
478+
$this->assertLessThanOrEqual($_SESSION['__ci_vars']['foo1'], $time + 200);
479+
$this->assertLessThanOrEqual($_SESSION['__ci_vars']['foo2'], $time + 200);
480+
}
481+
465482
public function testGetTestDataReturnsAll(): void
466483
{
467484
$session = $this->getInstance();

0 commit comments

Comments
 (0)