Files
pointeuse-optimisator/app/tests/conftest.py
Jacquin Antoine 8dc2a3fa4c Sécurise le cookie de session par signature HMAC
Le cookie user_id était lu tel quel depuis la requête, ce qui permettait à
n'importe qui de forger `user_id=victime` dans DevTools/curl et d'accéder à
toutes les routes "authentifiées" (lecture/écriture des pointages, export,
régénération des tokens Tasker, etc.). Le mot de passe bcrypt ne servait
donc à rien.

Le cookie est maintenant au format `<user_id>.<hmac_sha256_hex>` signé avec
une clé persistée dans /data/secret.key (auto-générée, stable entre
redémarrages). La vérification utilise hmac.compare_digest pour éviter les
fuites par timing. Toutes les routes appellent _get_user qui valide la
signature à chaque requête.

Les tests de test_logs.py récupèrent désormais le cookie réellement signé
par le serveur, et un nouveau module test_security.py couvre le rejet des
cookies forgés/tamponnés/rejoués.

Le DATA_DIR temporaire des tests est centralisé dans conftest.py pour éviter
les collisions entre modules de test.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-07-20 00:20:50 +02:00

39 lines
1.1 KiB
Python

"""Fixtures partagées pour les tests.
Freeze "today" pour des calculs déterministes ET installe un DATA_DIR
temporaire unique pour tout le process de test, afin que tous les modules
de tests (test_logs, test_security, ...) partagent le même stockage.
"""
import datetime as dt_module
import tempfile
from pathlib import Path
import pytest
import calcul
import models
# ── DATA_DIR unique pour tout le run ─────────────────────────────────────────
_TMP = Path(tempfile.mkdtemp())
models.DATA_DIR = _TMP
models.CONFIG_FILE = models.DATA_DIR / "config.json"
models.CONFIG_FILE.write_text('{"heures_jour": 7.8, "allowed_email_domain": "x.fr"}')
class FrozenDatetime(dt_module.datetime):
_frozen = dt_module.datetime(2026, 7, 17, 10, 30) # vendredi
@classmethod
def today(cls):
return cls._frozen
@classmethod
def now(cls, tz=None):
return cls._frozen
@pytest.fixture
def freeze_today(monkeypatch):
monkeypatch.setattr(calcul, "datetime", FrozenDatetime)
return FrozenDatetime._frozen