|
| 1 | +import asyncio |
1 | 2 | import json
|
2 | 3 | import base64
|
3 | 4 | import time
|
|
7 | 8 |
|
8 | 9 | from cryptography.fernet import Fernet
|
9 | 10 |
|
10 |
| -from aiohttp_session import Session, session_middleware, get_session |
| 11 | +from aiohttp_session import Session, session_middleware, get_session, new_session |
11 | 12 | from aiohttp_session.cookie_storage import EncryptedCookieStorage
|
12 | 13 |
|
13 | 14 |
|
| 15 | +MAX_AGE = 1 |
| 16 | + |
| 17 | + |
14 | 18 | def make_cookie(client, fernet, data):
|
15 | 19 | session_data = {
|
16 | 20 | 'session': data,
|
@@ -160,3 +164,34 @@ async def logout(request):
|
160 | 164 | client.session.cookie_jar.update_cookies({'AIOHTTP_SESSION': evil_cookie})
|
161 | 165 | resp = await client.get('/')
|
162 | 166 | 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