Add OIDC back-channel logout with session indexes
CI / Build and publish packages (push) Failing after 14s

This commit is contained in:
2026-11-02 12:15:41 +08:00
parent ec056a15b9
commit 074e48a372
20 changed files with 1594 additions and 32 deletions
@@ -28,6 +28,8 @@ class StubMemcacheClient:
self._clock = clock
self._data: dict[bytes, bytes] = {}
self._expires: dict[bytes, float] = {}
self._cas: dict[bytes, int] = {}
self._next_cas = 1
self.set_exptimes: list[int] = []
self.touch_exptimes: list[int] = []
@@ -42,19 +44,46 @@ class StubMemcacheClient:
return None
return self._data.get(key)
async def set(self, key: bytes, value: bytes, exptime: int = 0) -> bool:
self.set_exptimes.append(exptime)
def _store(self, key: bytes, value: bytes, exptime: int) -> None:
self._data[key] = value
self._cas[key] = self._next_cas
self._next_cas += 1
if exptime > 0:
self._expires[key] = self._clock() + exptime
else:
self._expires.pop(key, None)
async def set(self, key: bytes, value: bytes, exptime: int = 0) -> bool:
self.set_exptimes.append(exptime)
self._store(key, value, exptime)
return True
async def add(self, key: bytes, value: bytes, exptime: int = 0) -> bool:
if self._expired(key):
self._data.pop(key, None)
self._expires.pop(key, None)
if key in self._data:
return False
self._store(key, value, exptime)
return True
async def gets(self, key: bytes) -> tuple[Optional[bytes], Optional[int]]:
value = await self.get(key)
if value is None:
return None, None
return value, self._cas[key]
async def cas(self, key: bytes, value: bytes, cas_token: int, exptime: int = 0) -> bool:
if self._expired(key) or self._cas.get(key) != cas_token:
return False
self._store(key, value, exptime)
return True
async def delete(self, key: bytes) -> bool:
existed = key in self._data
self._data.pop(key, None)
self._expires.pop(key, None)
self._cas.pop(key, None)
return existed
async def touch(self, key: bytes, exptime: int) -> bool:
@@ -169,7 +198,11 @@ class MemcacheSessionStoreTest(unittest.TestCase):
clock=self.clock,
)
await store.save('abc', Session('abc', {'foo': 'bar'}))
self.assertEqual(b'{"foo": "bar"}', self.client._data[b'kaya:session:abc'])
self.assertEqual({
'__kaya_session_v1__': 1,
'data': {'foo': 'bar'},
'indexes': [],
}, json.loads(self.client._data[b'kaya:session:abc']))
loaded = await store.load('abc')
self.assertIsNotNone(loaded)
assert loaded is not None