81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
|
|
# -*- 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"
|