""" Module de gestion des sessions utilisateurs. Les sessions sont stockées dans des fichiers JSON dans le répertoire sessions, qui doit exister dans le même répertoire que ce module. Les sessions sont identifiées par un identifiant de session aléatoire """ from os import path from bottle import request, response from typing import Tuple import json # Le répertoire où seront stockées les sessions, il doit exister. SESSIONS_PATH = path.join(path.dirname(__file__), "sessions") def create_session() -> Tuple[str, dict]: """ Renvoie un identifiant de session aléatoire et un dictionnaire vide pour la session. """ # on génère une chaîne aléatoire pour l'identifiant de session import random import string session_id = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) response.set_cookie("session_id", session_id, path="/", httponly=True) return session_id, dict() def get_or_create_session() -> Tuple[str, dict, bool]: """ Récupère la session associée à l'identifiant de session dans le cookie, ou en crée une nouvelle si elle n'existe pas. Renvoie l'identifiant de session, la session et un booléen indiquant si la session a été créée ou non. """ # on récupère l'identifiant de session dans le cookie session_id = request.get_cookie("session_id", None) # on vérifie que l'identifiant de session ne contient que des caractères # alphanumériques if session_id is None or not session_id.isalnum(): session_id, session = create_session() return session_id, session, True session_file = path.join(SESSIONS_PATH, session_id + ".json") try: with open(session_file, "rb") as f: session = json.load(f) return session_id, session, False except FileNotFoundError: pass session_id, session = create_session() return session_id, session, True def save_session(session_id: str, session: dict) -> None: """ Enregistre la session dans un fichier JSON. A appeler après chaque modification de la session. """ session_file = path.join(SESSIONS_PATH, session_id + ".json") with open(session_file, "w") as f: json.dump(session, f)