Mealie anbinden: Passwort einmal, danach nur noch ein Dauertoken

Unter Einstellungen gibt es jetzt eine Karte "Mealie (Rezepte)": Adresse,
Benutzername, Passwort. Vorrania meldet sich damit EINMAL an
(POST /api/auth/token), laesst sich von Mealie ueber
POST /api/users/api-tokens ein Dauertoken ausstellen und verwirft das
Passwort sofort - es steht in keiner Zeile der Datenbank, in keiner
Antwort und in keinem Fehlertext. Wer sein Passwort gar nicht erst
eintippen will, haekelt "Ich gebe lieber selbst ein Token ein" an.

Das Token liegt NICHT in den Einstellungen: GET /settings liefert jedem
angemeldeten Nutzer alle Zeilen im Klartext. Eine Ausschlussliste dort
waere beim naechsten Geheimnis vergessen, deshalb eine eigene Tabelle ohne
jeden Leseweg - setzen, loeschen, und die Auskunft "ist gesetzt". Was
keinen Ausgang hat, kann nicht durchrutschen. Ein Test prueft genau das.

Der Dienst folgt services/oidc.py, nicht off.py: Bei Open Food Facts ist
"kein Treffer" der Normalfall und wird still zu None, hier ist "Mealie
antwortet nicht" ein Fehler, den der Nutzer sehen muss. Die Kennungen
trennen auch, was verschieden ist - ein falsches Passwort (400) ist etwas
anderes als ein weggetretener Server (502).

Mealie 1.x legt die Haushalts-Routen unter /api/groups/, 2.x unter
/api/households/. Erkannt wird das zur Laufzeit mit einer Anfrage und
dann eine Stunde gepuffert; ueber die Versionsnummer waere es unzuverlaessig,
die melden Installationen uneinheitlich.

Rezeptliste und -abgleich kommen als Naechstes; dies ist der Teil, mit dem
sich der Server ueberhaupt erst verbinden laesst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-02 12:54:43 +02:00
co-authored by Claude Opus 5
parent 37ab1ba47d
commit 7d8a54a3fc
9 changed files with 942 additions and 0 deletions
+34
View File
@@ -694,6 +694,40 @@ class LotConsumeOut(BaseModel):
opened: bool = False
# ---- Mealie ----
class MealieConfigIn(BaseModel):
"""Zugangsdaten für die einmalige Anmeldung bei Mealie.
Das Passwort wird **nicht** gespeichert: Vorrania meldet sich damit einmal
an, lässt sich ein Dauertoken ausstellen und vergisst es.
"""
base_url: str = Field(min_length=1, max_length=255)
username: str = Field(min_length=1, max_length=120)
password: str = Field(min_length=1)
class MealieTokenIn(BaseModel):
"""Ein in Mealie selbst erzeugtes Dauertoken einsetzen (Alternative zum Passwort)."""
base_url: str = Field(min_length=1, max_length=255)
token: str = Field(min_length=1)
class MealieStatus(BaseModel):
"""Auskunft über die Verbindung – **nie** das Token selbst."""
configured: bool = False
base_url: str = ""
token_set: bool = False
# Erst bei einer echten Abfrage gefüllt; None heisst „nicht nachgesehen".
reachable: bool | None = None
version: str | None = None
error: str | None = None
class MealieAvailable(BaseModel):
"""Ob die Rezept-Seite überhaupt etwas anzeigen kann (für alle Benutzer)."""
available: bool = False
# ---- Hausmaße ----
class MeasureIn(BaseModel):
"""Name eines Hausmaßes. Die Menge steht an Kategorie bzw. Artikel."""