"""Identité d'un visiteur anonyme de la route publique /jouer/ (voir routes/public_play/) — état par joueur, Phase 1. Un cookie NON SIGNÉ (pas besoin de itsdangerous/app.secret_key ici) : c'est une simple clé de PARTITION des données (quelles lignes/valeurs appartiennent à ce visiteur), jamais un jeton d'autorisation — la contrefaçon la plus grave possible serait de se faire passer pour un AUTRE joueur anonyme du même jeu, pas de franchir une frontière de sécurité (l'aperçu créateur, lui, reste protégé par core/auth_guard.py, complètement indépendant de ce mécanisme).""" import secrets from flask import request PLAYER_ID_COOKIE = "forge_player_id" _PLAYER_ID_MAX_AGE = 60 * 60 * 24 * 365 # 1 an def get_or_create_player_id(): """Renvoie (player_id, is_new) — is_new indique s'il faut poser le cookie sur la réponse avant de la renvoyer (voir set_player_id_cookie ci-dessous) : à utiliser aussi bien depuis une route qui rend une page (GET /jouer/) qu'une route API JSON (runtime-payload, run-data, run-variable), dont la réponse n'est construite qu'APRÈS avoir déjà besoin du player_id pour agir.""" existing = request.cookies.get(PLAYER_ID_COOKIE) if existing: return existing, False return secrets.token_urlsafe(16), True def set_player_id_cookie(response, player_id): response.set_cookie( PLAYER_ID_COOKIE, player_id, max_age=_PLAYER_ID_MAX_AGE, httponly=True, samesite="Lax", ) return response