fix(cloud): isolate support adapter sessions

This commit is contained in:
dadachann
2026-07-31 07:52:13 +00:00
parent b97a65bdea
commit d0d1949193
4 changed files with 34 additions and 0 deletions
+1
View File
@@ -22,6 +22,7 @@ class PrincipalContext:
account_uuid: str | None = None account_uuid: str | None = None
actor_account_uuid: str | None = None actor_account_uuid: str | None = None
api_key_uuid: str | None = None api_key_uuid: str | None = None
support_session_id: str | None = None
@dataclasses.dataclass(frozen=True, slots=True) @dataclasses.dataclass(frozen=True, slots=True)
@@ -348,6 +348,7 @@ class RouterGroup(abc.ABC):
principal=PrincipalContext( principal=PrincipalContext(
principal_type=PrincipalType.SUPPORT_ADMIN, principal_type=PrincipalType.SUPPORT_ADMIN,
actor_account_uuid=identity.actor_account_uuid, actor_account_uuid=identity.actor_account_uuid,
support_session_id=identity.grant_jti_hash,
), ),
workspace=WorkspaceContext( workspace=WorkspaceContext(
workspace_uuid=identity.workspace_uuid, workspace_uuid=identity.workspace_uuid,
@@ -22,6 +22,7 @@ class _AdapterSessionScope:
principal_type: str principal_type: str
account_uuid: str | None account_uuid: str | None
api_key_uuid: str | None api_key_uuid: str | None
support_session_id: str | None
@classmethod @classmethod
def from_request_context(cls, request_context: RequestContext) -> '_AdapterSessionScope': def from_request_context(cls, request_context: RequestContext) -> '_AdapterSessionScope':
@@ -33,6 +34,7 @@ class _AdapterSessionScope:
principal_type=principal.principal_type.value, principal_type=principal.principal_type.value,
account_uuid=principal.account_uuid, account_uuid=principal.account_uuid,
api_key_uuid=principal.api_key_uuid, api_key_uuid=principal.api_key_uuid,
support_session_id=principal.support_session_id,
) )
def matches(self, request_context: RequestContext) -> bool: def matches(self, request_context: RequestContext) -> bool:
@@ -149,6 +149,36 @@ async def test_session_scope_matches_exact_tenant_placement_and_principal():
assert sessions == {} assert sessions == {}
async def test_support_admin_sessions_are_scoped_to_the_persisted_grant():
def support_context(grant_jti_hash: str) -> RequestContext:
return RequestContext(
instance_uuid='instance-test',
placement_generation=1,
request_id='request-test',
auth_type='support-admin',
principal=PrincipalContext(
principal_type=PrincipalType.SUPPORT_ADMIN,
actor_account_uuid='support-actor',
support_session_id=grant_jti_hash,
),
workspace=WorkspaceContext(
workspace_uuid='workspace-a',
membership_uuid=None,
role='owner',
permissions=frozenset({'resource.manage'}),
),
)
first_context = support_context('a' * 64)
second_context = support_context('b' * 64)
sessions: dict[str, dict] = {'session-test': {'status': 'waiting'}}
_bind_session_scope(sessions['session-test'], first_context)
assert _get_owned_session(sessions, 'session-test', second_context) is None
assert _pop_owned_session(sessions, 'session-test', second_context) is None
assert _get_owned_session(sessions, 'session-test', first_context) is sessions['session-test']
async def test_session_capacity_evicts_oldest_session_in_same_workspace(): async def test_session_capacity_evicts_oldest_session_in_same_workspace():
owner_context = _request_context() owner_context = _request_context()
sessions: dict[str, dict] = {} sessions: dict[str, dict] = {}