From 95238b781f133febcb165063512059ed06a1b115 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Wed, 16 Sep 2026 18:07:29 +0200 Subject: [PATCH] Version 2.8.31: Protokollverlauf verlangt keine Bestaetigung mehr --- apps/tesm/pyproject.toml | 2 +- packages/tesm-core/pyproject.toml | 2 +- .../tesm-core/src/tesm_core/auth/models.py | 33 +++++++++++++++++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/apps/tesm/pyproject.toml b/apps/tesm/pyproject.toml index 8e79da1..062ae25 100644 --- a/apps/tesm/pyproject.toml +++ b/apps/tesm/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm" -version = "2.8.30" +version = "2.8.31" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/pyproject.toml b/packages/tesm-core/pyproject.toml index b9c4fca..a197cd0 100644 --- a/packages/tesm-core/pyproject.toml +++ b/packages/tesm-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-core" -version = "2.8.17" +version = "2.8.18" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/src/tesm_core/auth/models.py b/packages/tesm-core/src/tesm_core/auth/models.py index 9cb0bec..3953852 100644 --- a/packages/tesm-core/src/tesm_core/auth/models.py +++ b/packages/tesm-core/src/tesm_core/auth/models.py @@ -266,6 +266,35 @@ def _bitte_bestaetigen(permission: str) -> Any: return redirect(url_for("auth.reauth")) +def _heikel(permissions: tuple[str, ...], mode: str) -> str: + """Welches Recht verlangt hier eine frische Bestaetigung? Sonst leer. + + Bei ``mode="all"`` ist die Antwort einfach: jedes genannte Recht wird + gebraucht, also zaehlt jedes heikle darunter. + + Bei ``mode="any"`` nicht. Diese Seiten nennen mehrere **unabhaengige** + Wege hinein, und welcher genommen wird, entscheidet das Konto. Der + Protokollverlauf etwa nennt "logs_history.read" und "logs_history.export": + lesen ist harmlos, mitnehmen nicht. Gezaehlt wurde aber ueber alle + genannten Rechte -- und so verlangte das blosse **Ansehen** des Verlaufs + nach fuenfzehn Minuten eine Passworteingabe, mit dem Hinweis, man greife + auf einen Datenexport zu. Das stimmte nicht, und wer es dreimal liest, + glaubt die Meldung beim vierten Mal auch dann nicht, wenn sie zutrifft. + + Gefragt wird deshalb: haette dieses Konto die Seite auch ohne das heikle + Recht geoeffnet? Dann gibt es nichts zu bestaetigen. Die Ausfuhr selbst + haengt an ihrer eigenen Route, und die nennt nur ein Recht. + """ + heikle = [p for p in permissions if _verlangt_wiederanmeldung(p)] + if not heikle: + return "" + if mode == "any": + harmlos = [p for p in permissions if p not in heikle] + if any(current_user.has(p) for p in harmlos): + return "" + return heikle[0] + + def permission_required(*permissions: str, mode: str = "all") -> Callable[..., Any]: """Erzwingt Rechte serverseitig. @@ -289,9 +318,9 @@ def permission_required(*permissions: str, mode: str = "all") -> Callable[..., A # in jeder Route einzeln. Vorher hing es daran, dass jemand an den # Dekorator dachte: dieselbe Lizenz herunterzuladen fragte nach, # sie per Mail zu verschicken nicht. - heikel = [p for p in permissions if _verlangt_wiederanmeldung(p)] + heikel = _heikel(permissions, mode) if heikel and not _wiederanmeldung_frisch(): - return _bitte_bestaetigen(heikel[0]) + return _bitte_bestaetigen(heikel) return view(*args, **kwargs) wrapper._required_permissions = permissions # type: ignore[attr-defined]