""" config.py — Configuration centralisée de l'application. Toutes les valeurs sensibles (secrets, mots de passe, client_secret OIDC) sont lues depuis les variables d'environnement (fichier .env en local, variables d'environnement Docker en production). Aucun secret n'est en dur dans le code source, conformément à l'analyse de risques DevSecOps (Bloc 1 - C8 : "fuite du CLIENT_SECRET OIDC"). """ import os class Config: # --- Application --- SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key-change-me") DEBUG = os.environ.get("FLASK_DEBUG", "false").lower() == "true" ENV = os.environ.get("FLASK_ENV", "production") # --- Base de données (MariaDB via PyMySQL) --- DB_HOST = os.environ.get("DB_HOST", "mariadb") DB_PORT = int(os.environ.get("DB_PORT", "3306")) DB_USER = os.environ.get("DB_USER", "flaskuser") DB_PASSWORD = os.environ.get("DB_PASSWORD", "flaskpass") DB_NAME = os.environ.get("DB_NAME", "gesthub") # --- Authentification Keycloak (OIDC) --- OIDC_CLIENT_ID = os.environ.get("OIDC_CLIENT_ID", "flask-app") OIDC_CLIENT_SECRET = os.environ.get("OIDC_CLIENT_SECRET", "") OIDC_ISSUER = os.environ.get( "OIDC_ISSUER", "https://keycloak.ninolbt.com/realms/gesthub" ) OIDC_DISCOVERY_URL = f"{OIDC_ISSUER}/.well-known/openid-configuration" OIDC_LOGOUT_URL = f"{OIDC_ISSUER}/protocol/openid-connect/logout" PUBLIC_BASE_URL = os.environ.get("PUBLIC_BASE_URL", "https://dashboard.ninolbt.com") # --- Rôles applicatifs (mappés sur les groupes Keycloak) --- ADMIN_GROUP = "/admin" # --- RGPD (droit à l'effacement, art. 17) --- # Secret utilisé pour pseudonymiser irréversiblement un `sub` OIDC lors # d'une anonymisation (HMAC-SHA256). Distinct de SECRET_KEY par défaut ; # si absent, retombe sur SECRET_KEY (voir routes/rgpd.py). RGPD_ANON_PEPPER = os.environ.get("RGPD_ANON_PEPPER", "") # --- Module fichiers --- UPLOAD_DIR = os.environ.get( "UPLOAD_DIR", os.path.join(os.path.dirname(__file__), "static", "assets", "uploads") ) MAX_UPLOAD_SIZE_BYTES = int(os.environ.get("MAX_UPLOAD_SIZE_BYTES", 20 * 1024 * 1024)) # 20 Mo ALLOWED_EXTENSIONS = {"pdf", "png", "jpg", "jpeg", "gif", "txt", "docx", "xlsx", "zip"} ALLOWED_MIME_TYPES = { "application/pdf", "image/png", "image/jpeg", "image/gif", "text/plain", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/zip", "application/x-zip-compressed", } class TestConfig(Config): """Configuration utilisée par la suite de tests pytest (Bloc 1 - C5, Bloc 3 - C7). Pointe vers une base MariaDB de test dédiée (voir tests/conftest.py) afin de ne jamais exécuter les tests contre les données de développement ou de production. """ TESTING = True DB_NAME = os.environ.get("TEST_DB_NAME", "gesthub_test") SECRET_KEY = "test-secret-key"