Skip to content

Commit 87292b8

Browse files
panagiksasvetlov
authored andcommitted
Use ttl equal to max_age in fernet decrypt & test (#326)
1 parent a98b525 commit 87292b8

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

aiohttp_session/cookie_storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async def load_session(self, request):
3535
try:
3636
data = self._decoder(
3737
self._fernet.decrypt(
38-
cookie.encode('utf-8')).decode('utf-8'))
38+
cookie.encode('utf-8'), ttl=self.max_age).decode('utf-8'))
3939
return Session(None, data=data,
4040
new=False, max_age=self.max_age)
4141
except InvalidToken:

tests/test_encrypted_cookie_storage.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import json
23
import base64
34
import time
@@ -7,10 +8,13 @@
78

89
from cryptography.fernet import Fernet
910

10-
from aiohttp_session import Session, session_middleware, get_session
11+
from aiohttp_session import Session, session_middleware, get_session, new_session
1112
from aiohttp_session.cookie_storage import EncryptedCookieStorage
1213

1314

15+
MAX_AGE = 1
16+
17+
1418
def make_cookie(client, fernet, data):
1519
session_data = {
1620
'session': data,
@@ -160,3 +164,34 @@ async def logout(request):
160164
client.session.cookie_jar.update_cookies({'AIOHTTP_SESSION': evil_cookie})
161165
resp = await client.get('/')
162166
assert resp.cookies['AIOHTTP_SESSION'].value != evil_cookie
167+
168+
169+
async def test_fernet_ttl(aiohttp_client, fernet, key):
170+
async def login(request):
171+
session = await new_session(request)
172+
session['created'] = int(time.time())
173+
return web.Response()
174+
175+
async def handler(request):
176+
session = await get_session(request)
177+
now = time.time()
178+
created = session['created'] if not session.new else None
179+
text = ''
180+
if created is not None and (time.time() - created) > MAX_AGE:
181+
text += 'WARNING!'
182+
return web.Response(text=text)
183+
184+
middleware = session_middleware(EncryptedCookieStorage(key, max_age=MAX_AGE))
185+
app = web.Application(middlewares=[middleware])
186+
app.router.add_route('POST', '/', login)
187+
app.router.add_route('GET', '/', handler)
188+
189+
client = await aiohttp_client(app)
190+
resp = await client.post('/')
191+
assert 'AIOHTTP_SESSION' in resp.cookies
192+
cookie = resp.cookies['AIOHTTP_SESSION'].value
193+
await asyncio.sleep(MAX_AGE + 1)
194+
client.session.cookie_jar.update_cookies({'AIOHTTP_SESSION': cookie})
195+
resp = await client.get('/')
196+
body = await resp.text()
197+
assert body == ''

0 commit comments

Comments
 (0)