Files
aza/AzA march 2026 - Kopie (15)/workforce_planner/config.py

81 lines
2.5 KiB
Python
Raw Normal View History

2026-04-19 20:41:37 +02:00
# -*- coding: utf-8 -*-
"""Zentrale Konfiguration über Umgebungsvariablen oder .env steuerbar."""
import os
import sys
import secrets
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
BASE_DIR = Path(__file__).resolve().parent.parent
DATABASE_URL = os.getenv(
"WP_DATABASE_URL",
f"sqlite:///{BASE_DIR / 'workforce_planner.db'}"
)
_WEAK_PATTERNS = ("dev", "test", "password", "secret", "changeme", "default", "example", "123")
def _reject_weak(pattern: str):
print(
f"FEHLER: AZA_SECRET_KEY enthält triviales Muster ('{pattern}').\n"
"Verwenden Sie einen kryptografisch sicheren Key.",
file=sys.stderr,
)
sys.exit(1)
def _load_secret_key() -> str:
"""Lädt AZA_SECRET_KEY aus ENV. Fail-Start bei fehlendem oder schwachem Key.
Im DEV-Modus (AZA_ENV=dev) wird ein temporärer Key auto-generiert."""
key = os.getenv("AZA_SECRET_KEY", "").strip()
env_mode = os.getenv("AZA_ENV", "").strip().lower()
if not key:
if env_mode == "dev":
key = secrets.token_hex(64)
print(
"WARNUNG: AZA_SECRET_KEY nicht gesetzt. "
"Auto-generierter Key (nur gültig für diese Session, AZA_ENV=dev).",
file=sys.stderr,
)
return key
print(
"FEHLER: AZA_SECRET_KEY ist nicht gesetzt.\n"
"Setzen Sie die Umgebungsvariable mit mindestens 32 Zeichen.\n"
"Beispiel: AZA_SECRET_KEY=$(python -c \"import secrets; print(secrets.token_hex(64))\")\n"
"Für Entwicklung: AZA_ENV=dev erlaubt auto-generierten Key.",
file=sys.stderr,
)
sys.exit(1)
if len(key) < 32:
print(
f"FEHLER: AZA_SECRET_KEY ist zu kurz ({len(key)} Zeichen, Minimum: 32).\n"
"Generieren Sie einen sicheren Key:\n"
" python -c \"import secrets; print(secrets.token_hex(64))\"",
file=sys.stderr,
)
sys.exit(1)
key_lower = key.lower()
for pattern in _WEAK_PATTERNS:
if key_lower == pattern:
_reject_weak(pattern)
if key_lower.startswith(pattern) and (
len(key) < 40 or not key[len(pattern):len(pattern)+1].isalnum()
):
_reject_weak(pattern)
return key
SECRET_KEY = _load_secret_key()
ACCESS_TOKEN_EXPIRE_MINUTES = int(os.getenv("WP_TOKEN_EXPIRE", "480"))
MIN_STAFF_COUNT = int(os.getenv("WP_MIN_STAFF", "2"))
DEBUG = os.getenv("WP_DEBUG", "0") == "1"