"""Herkunftsprüfung für Knöpfe (24.09.2026, User-Entscheid: keine Anmeldung). Knöpfe schicken POST/PUT/DELETE an /api. Ein Browser setzt dabei den Origin-Header — kommt er von einer fremden Webseite, wird die Anfrage abgelehnt. Das verhindert, dass eine fremde Seite im Browser eines Heimnetz-Geräts heimlich Updates, Neustarts oder Löschen auslöst. Unverändert erlaubt: Anfragen ohne Origin (Skripte, curl, Lucy-Watchdog), Origin „null“/„file://“ (Desktop-Lucy aus Electron) und alles unter /v1 (OpenChamber, Hermes). """ ENTWICKLUNG = {"localhost:5173", "127.0.0.1:5173", "localhost:5180", "localhost:5181"} SCHREIBEND = {"POST", "PUT", "PATCH", "DELETE"} def erlaubt(methode: str, pfad: str, origin: str | None, host: str | None) -> bool: if methode.upper() not in SCHREIBEND or not pfad.startswith("/api/"): return True if not origin or origin in ("null", "file://"): return True wirt = origin.split("://", 1)[-1].rstrip("/") return wirt == (host or "") or wirt in ENTWICKLUNG