feat(session): cap TTL at 1 hour maximum
This commit is contained in:
@@ -4,6 +4,9 @@ import secrets
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
|
|
||||||
|
MAX_TTL_SECONDS = 3600 # 1 hour
|
||||||
|
DEFAULT_TTL_SECONDS = 300 # 5 minutes
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SessionToken:
|
class SessionToken:
|
||||||
@@ -27,19 +30,25 @@ class SessionTokenManager:
|
|||||||
agent_name: str,
|
agent_name: str,
|
||||||
document: str,
|
document: str,
|
||||||
permissions: list[str],
|
permissions: list[str],
|
||||||
ttl_seconds: int,
|
ttl_seconds: int = DEFAULT_TTL_SECONDS,
|
||||||
) -> SessionToken:
|
) -> SessionToken:
|
||||||
"""Create a new session token."""
|
"""Create a new session token.
|
||||||
|
|
||||||
|
TTL is capped at MAX_TTL_SECONDS (1 hour).
|
||||||
|
"""
|
||||||
now = datetime.now(timezone.utc)
|
now = datetime.now(timezone.utc)
|
||||||
token_str = f"sess_{secrets.token_urlsafe(32)}"
|
token_str = f"sess_{secrets.token_urlsafe(32)}"
|
||||||
|
|
||||||
|
# Cap TTL at maximum
|
||||||
|
effective_ttl = min(ttl_seconds, MAX_TTL_SECONDS)
|
||||||
|
|
||||||
session = SessionToken(
|
session = SessionToken(
|
||||||
token=token_str,
|
token=token_str,
|
||||||
document=document,
|
document=document,
|
||||||
permissions=permissions,
|
permissions=permissions,
|
||||||
agent_name=agent_name,
|
agent_name=agent_name,
|
||||||
created_at=now,
|
created_at=now,
|
||||||
expires_at=now + timedelta(seconds=ttl_seconds),
|
expires_at=now + timedelta(seconds=effective_ttl),
|
||||||
)
|
)
|
||||||
|
|
||||||
self._tokens[token_str] = session
|
self._tokens[token_str] = session
|
||||||
|
|||||||
@@ -21,3 +21,19 @@ def test_create_token_returns_valid_session_token():
|
|||||||
assert token.agent_name == "test-agent"
|
assert token.agent_name == "test-agent"
|
||||||
assert token.expires_at > datetime.now(timezone.utc)
|
assert token.expires_at > datetime.now(timezone.utc)
|
||||||
assert token.expires_at < datetime.now(timezone.utc) + timedelta(seconds=310)
|
assert token.expires_at < datetime.now(timezone.utc) + timedelta(seconds=310)
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_token_caps_ttl_at_maximum():
|
||||||
|
manager = SessionTokenManager()
|
||||||
|
|
||||||
|
# Request 2 hours, should be capped at 1 hour
|
||||||
|
token = manager.create_token(
|
||||||
|
agent_name="test-agent",
|
||||||
|
document="sales",
|
||||||
|
permissions=["read"],
|
||||||
|
ttl_seconds=7200,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Should be capped at 3600 seconds (1 hour)
|
||||||
|
max_expires = datetime.now(timezone.utc) + timedelta(seconds=3610)
|
||||||
|
assert token.expires_at < max_expires
|
||||||
|
|||||||
Reference in New Issue
Block a user