"""Anmeldung des Betreibers.""" from fastapi import APIRouter, HTTPException, Request, status from pydantic import BaseModel, Field from app import security from app.config import einstellungen router = APIRouter(prefix="/api/v1/auth", tags=["Anmeldung"]) class AnmeldenRein(BaseModel): passwort: str = Field(min_length=1) class ZustandAus(BaseModel): angemeldet: bool admin_eingerichtet: bool @router.get("/me", response_model=ZustandAus) def zustand(request: Request): return ZustandAus( angemeldet=security.ist_betreiber(request), admin_eingerichtet=einstellungen().admin_aktiv, ) @router.post("/login", response_model=ZustandAus) @security.limiter.limit(lambda: einstellungen().limit_anmelden) def login(request: Request, daten: AnmeldenRein): """Meldet den Betreiber an. Das Rate-Limit ist hier wichtiger als es aussieht: die Anwendung ist aus dem Internet erreichbar, es gibt genau ein Konto, und ohne Bremse liesse sich das Passwort in Ruhe durchprobieren. """ hash_wert = security.hinterlegter_hash() if hash_wert is None: raise HTTPException( status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=( "Der Erfassungsbereich ist nicht eingerichtet: " "ADMIN_PASSWORD oder ADMIN_PASSWORD_HASH setzen." ), ) if not security.passwort_stimmt(daten.passwort, hash_wert): raise HTTPException(status_code=401, detail="Passwort stimmt nicht.") security.anmelden(request) return ZustandAus(angemeldet=True, admin_eingerichtet=True) @router.post("/logout", response_model=ZustandAus) def logout(request: Request): security.abmelden(request) return ZustandAus(angemeldet=False, admin_eingerichtet=einstellungen().admin_aktiv)