Skip to content

Commit 3da795d

Browse files
fix(webservice): respect configured inactivity timeout per session
Compute web service session expiration from the current inactivity timeout configuration on each call instead of relying on mutable static state. Add tests covering configured timeout behavior for web service session expiration.
1 parent 4bd036f commit 3da795d

2 files changed

Lines changed: 30 additions & 11 deletions

File tree

Domain/Values/WebService/WebServiceExpiration.php

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,26 @@
22

33
class WebServiceExpiration
44
{
5-
private static $SESSION_LENGTH_IN_MINUTES = 30;
6-
7-
public function __construct()
8-
{
9-
self::$SESSION_LENGTH_IN_MINUTES = Configuration::Instance()->GetKey(ConfigKeys::INACTIVITY_TIMEOUT, new IntConverter());
10-
}
11-
125
/**
136
* @param string $expirationTime
147
* @return bool
158
*/
16-
public static function IsExpired($expirationTime)
9+
public static function IsExpired(string $expirationTime): bool
1710
{
1811
return Date::Parse($expirationTime, 'UTC')->LessThan(Date::Now());
1912
}
2013

2114
/**
2215
* @return string
2316
*/
24-
public static function Create()
17+
public static function Create(): string
2518
{
26-
return Date::Now()->AddMinutes(self::$SESSION_LENGTH_IN_MINUTES)->ToUtc()->ToIso();
19+
$minutes = Configuration::Instance()->GetKey(ConfigKeys::INACTIVITY_TIMEOUT, new IntConverter());
20+
if ($minutes <= 0) {
21+
Log::Error('Invalid inactivity.timeout value: %d. Falling back to default: %d', $minutes, ConfigKeys::INACTIVITY_TIMEOUT['default']);
22+
$minutes = ConfigKeys::INACTIVITY_TIMEOUT['default'];
23+
}
24+
25+
return Date::Now()->AddMinutes($minutes)->ToUtc()->ToIso();
2726
}
2827
}

tests/WebService/WebServiceUserSessionTest.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@ class WebServiceUserSessionTest extends TestBase
99
public function setUp(): void
1010
{
1111
parent::setup();
12+
$this->fakeConfig->SetKey(ConfigKeys::INACTIVITY_TIMEOUT, ConfigKeys::INACTIVITY_TIMEOUT['default']);
1213
}
1314

1415
public function testExtendsSession()
1516
{
17+
$now = Date::Create(2026, 3, 20, 12, 0, 0, 'UTC');
18+
Date::_SetNow($now);
19+
1620
$session = new WebServiceUserSession(123);
1721
$session->SessionExpiration = '2012-05-01';
1822
$session->ExtendSession();
1923

20-
$this->assertEquals(WebServiceExpiration::Create(), $session->SessionExpiration);
24+
$expected = $now->AddMinutes(ConfigKeys::INACTIVITY_TIMEOUT['default'])->ToUtc()->ToIso();
25+
26+
$this->assertEquals($expected, $session->SessionExpiration);
2127
}
2228

2329
public function testIsExpired()
@@ -35,4 +41,18 @@ public function testIsNotExpired()
3541

3642
$this->assertFalse($session->IsExpired());
3743
}
44+
45+
public function testCreateUsesConfiguredTimeout()
46+
{
47+
$timeoutMinutes = 10080; // 7 days
48+
$this->fakeConfig->SetKey(ConfigKeys::INACTIVITY_TIMEOUT, $timeoutMinutes);
49+
$now = Date::Create(2026, 3, 20, 12, 0, 0, 'UTC');
50+
Date::_SetNow($now);
51+
52+
$expiration = WebServiceExpiration::Create();
53+
$expected = $now->AddMinutes($timeoutMinutes)->ToUtc()->ToIso();
54+
55+
$this->assertEquals($expected, $expiration);
56+
}
57+
3858
}

0 commit comments

Comments
 (0)