Add OIDC back-channel logout with session indexes
CI / Build and publish packages (push) Failing after 14s
CI / Build and publish packages (push) Failing after 14s
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user