Source code for jamweb.session.session
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File : session.py
# Author : Jiayuan Mao
# Email : maojiayuan@gmail.com
# Date : 10/23/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.
import hashlib
import hmac
import uuid
__all__ = ["Session", "SessionManagerBase"]
[docs]class Session(dict):
def __init__(self, session_manager, request_handler):
self._session_manager = session_manager
self._request_handler = request_handler
session_id, session_data = self._session_manager.get(self._request_handler)
self._identifier = session_id
super().__init__(session_data)
@property
def identifier(self):
return self._identifier
[docs] def save(self):
self._session_manager.set(self._request_handler, self.identifier, dict(self))
[docs]class SessionManagerBase:
def __init__(self, secret):
self._secret = secret
super().__init__()
@property
def secret(self):
return self._secret
[docs] def new(self, request_handler):
return Session(self, request_handler)
[docs] def get(self, request_handler):
raise NotImplementedError()
[docs] def set(self, request_handler, session_id, data):
raise NotImplementedError()
def _generate_id(self):
new_id = hashlib.sha256((self.secret + str(uuid.uuid4())).encode("utf-8"))
return new_id.hexdigest()
def _generate_hmac(self, session_id):
if not isinstance(session_id, bytes):
session_id = session_id.encode("utf-8")
return hmac.new(
session_id, self.secret.encode("utf-8"), hashlib.sha256
).hexdigest()