Files
2026-07-24 21:37:03 +02:00

52 lines
1.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
Optionaler HTTP-Basic-Schutz für die gesamte Suite.
Ist APP_PASSWORD gesetzt, gilt der Schutz für Dashboard und alle Plugins.
Die Zugangsdaten sind identisch zu denen, die der AI-Webimport bisher schon
genutzt hat bestehende .env-Dateien funktionieren unverändert weiter.
"""
from __future__ import annotations
import base64
import hmac
import os
from fastapi import Request
from fastapi.responses import JSONResponse, Response
OPEN_PATHS = ("/api/health",)
def _unauthorized() -> Response:
return JSONResponse(
status_code=401,
content={"detail": "Anmeldung erforderlich."},
headers={"WWW-Authenticate": 'Basic realm="boehmitools"'},
)
async def basic_auth_middleware(request: Request, call_next):
expected_password = os.environ.get("APP_PASSWORD", "")
if not expected_password or request.url.path in OPEN_PATHS:
return await call_next(request)
expected_username = os.environ.get("APP_USERNAME", "admin")
header = request.headers.get("Authorization", "")
if not header.startswith("Basic "):
return _unauthorized()
try:
decoded = base64.b64decode(header[6:]).decode("utf-8")
username, password = decoded.split(":", 1)
except Exception:
return _unauthorized()
if not (
hmac.compare_digest(username, expected_username)
and hmac.compare_digest(password, expected_password)
):
return _unauthorized()
return await call_next(request)