Aberrant/buckler_aiohttp.py

73 lines
1.9 KiB
Python
Raw Normal View History

2019-09-28 04:05:45 -04:00
#!/usr/bin/env python3
"""
Session interface middlewares to integrate the aiohttp app with Buckler.
"""
import json
from datetime import datetime
import aiohttp
from aiohttp import web
import config
@web.middleware
async def buckler_session(request, handler):
"""
Verifies the user with the configured Buckler app and retrieves any
session data they may have. Redirects them to the login page otherwise.
"""
2020-09-23 09:05:06 -04:00
user_id = request.cookies.get('userid', '')
user_sid = request.cookies.get('session', '')
2019-09-28 04:05:45 -04:00
url = config.buckler['url'] + '/get_session'
params = {
'app_id': config.buckler['app_id'],
'app_key': config.buckler['app_key'],
'userid': user_id,
2020-11-12 13:16:50 -05:00
'session': user_sid }
2019-09-28 04:05:45 -04:00
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as resp:
data = await resp.json()
if data.get('error'):
2020-09-23 09:05:06 -04:00
resp = web.HTTPFound(config.buckler['login_url'])
resp.set_cookie(
'redirect',
request.url,
2020-11-12 13:16:50 -05:00
domain=config.server_domain,
2020-09-23 09:05:06 -04:00
secure=True,
httponly=True)
#samesite='strict')
raise resp
2019-09-28 04:05:45 -04:00
request['session'] = data['session_data']
request['meta'] = data['meta']
resp = await handler(request)
if request['session'] != data['session_data']: # session data modified
url = config.buckler['url'] + '/set_session'
data = json.dumps(request['session'])
session.post(url, params=params, data=data) # TODO: error handle?
last_used = datetime.fromisoformat(request['meta']['last_used'])
now = datetime.now(last_used.tzinfo)
delta = now - last_used
if delta.seconds > 600:
resp.set_cookie(
'userid',
user_id,
2020-11-12 13:16:50 -05:00
domain=config.server_domain,
2019-09-28 18:42:07 -04:00
max_age=30*24*60*60,
2019-09-28 04:05:45 -04:00
secure=True,
2019-09-30 15:12:56 -04:00
httponly=True)
2020-09-23 09:05:06 -04:00
#samesite='strict')
2019-09-28 04:05:45 -04:00
resp.set_cookie(
'session',
user_sid,
2020-11-12 13:16:50 -05:00
domain=config.server_domain,
2019-09-28 18:42:07 -04:00
max_age=30*24*60*60,
2019-09-28 04:05:45 -04:00
secure=True,
2019-09-30 15:12:56 -04:00
httponly=True)
2020-09-23 09:05:06 -04:00
#samesite='strict')
2019-09-28 04:05:45 -04:00
return resp