Skip to content

Commit 1b356f0

Browse files
panagiksasvetlov
authored andcommitted
Empty session data if session age > max_age (#331)
1 parent faadf10 commit 1b356f0

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

aiohttp_session/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ def __init__(self, identity, *, data, new, max_age=None):
2424
self._max_age = max_age
2525
created = data.get('created', None) if data else None
2626
session_data = data.get('session', None) if data else None
27-
27+
now = int(time.time())
28+
age = now - created if created else now
29+
if max_age is not None and age > max_age:
30+
session_data = None
2831
if self._new or created is None:
29-
self._created = int(time.time())
32+
self._created = now
3033
else:
3134
self._created = created
3235

tests/test_nacl_storage.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from aiohttp import web
99
from nacl.encoding import Base64Encoder
1010

11-
from aiohttp_session import Session, session_middleware, get_session
11+
from aiohttp_session import (Session, session_middleware, get_session,
12+
new_session)
1213
from aiohttp_session.nacl_storage import NaClCookieStorage
1314

1415

@@ -212,3 +213,33 @@ async def handler(request):
212213
make_cookie(client, secretbox, {'a': 1, 'b': 12})
213214
resp = await client.get('/')
214215
assert resp.status == 200
216+
217+
218+
async def test_load_expired_session(aiohttp_client, key):
219+
MAX_AGE = 2
220+
221+
async def login(request):
222+
session = await new_session(request)
223+
session['created'] = int(time.time())
224+
return web.Response()
225+
226+
async def handler(request):
227+
session = await get_session(request)
228+
created = session.get('created', None) if not session.new else None
229+
text = ''
230+
if created is not None and (time.time() - created) > MAX_AGE:
231+
text += 'WARNING!'
232+
return web.Response(text=text)
233+
234+
app = create_app(handler, key, max_age=MAX_AGE)
235+
app.router.add_route('POST', '/', login)
236+
237+
client = await aiohttp_client(app)
238+
resp = await client.post('/')
239+
assert 'AIOHTTP_SESSION' in resp.cookies
240+
cookie = resp.cookies['AIOHTTP_SESSION'].value
241+
await asyncio.sleep(MAX_AGE + 1)
242+
client.session.cookie_jar.update_cookies({'AIOHTTP_SESSION': cookie})
243+
resp = await client.get('/')
244+
body = await resp.text()
245+
assert body == ''

0 commit comments

Comments
 (0)