From 184fb375937a4a322fae79340e5f827568a553ee Mon Sep 17 00:00:00 2001 From: Jeuner <62662523+Jeuners@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:39:26 +0200 Subject: [PATCH] feat: eingeloggter Nutzer im Leitstand-Header sichtbar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mit mehreren Leitstand-Konten (praxis/notdienst/admin) war im UI selbst nicht erkennbar, als wer man gerade angemeldet ist. /api/status liefert jetzt "nutzer" (aus self._nutzer, siehe voriger Commit), das Frontend zeigt ihn im Header neben dem Stand-Zeitstempel ("👤 notdienst"). Nebenbei behoben: dienste.status() gibt ein gecachtes, ueber Requests geteiltes dict zurueck - der Handler mutierte es bisher direkt (testzugang-Feld). Bei gleichzeitigen Anfragen verschiedener Nutzer haette das den Nutzernamen der einen Anfrage in die Antwort einer anderen durchsickern lassen koennen. Jetzt eine flache Kopie vor dem Mutieren. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01EbdWYnDtyMgxsq4eN1WnrQ --- pipe/server.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pipe/server.py b/pipe/server.py index 1658a30..60cccd7 100644 --- a/pipe/server.py +++ b/pipe/server.py @@ -248,10 +248,15 @@ class Handler(BaseHTTPRequestHandler): if pfad == "/": self._sende(_seite().encode("utf-8"), "text/html; charset=utf-8") elif pfad == "/api/status": - daten = dienste.status() + # Kopie, nicht das gecachte dienste.status()-Objekt direkt + # mutieren - der ThreadingHTTPServer bedient mehrere Nutzer + # gleichzeitig, sonst koennte der Nutzername der einen Anfrage in + # der Antwort einer anderen landen. + daten = dict(dienste.status()) # Testzugang (per "agent-one test"-Link) -> Sicher-Modus im # Frontend erzwingen, siehe sicherSetzen() im JS. daten["testzugang"] = getattr(self, "_via_token", False) + daten["nutzer"] = self._nutzer self._json(daten) elif pfad == "/api/anrufe": liste = anrufe() @@ -429,6 +434,7 @@ h1{font-size:19px;margin:0;line-height:1.25} .untertitel{font-size:12px;color:var(--muted);font-weight:400} .logo{width:34px;height:34px;border-radius:50%;flex:none;box-shadow:0 1px 3px rgba(0,0,0,.15)} .stand{color:var(--muted);font-size:13px;font-variant-numeric:tabular-nums;margin-left:auto} +.nutzer-anzeige{color:var(--muted);font-size:13px;margin-left:10px} .modell-select{background:var(--karte);border:1px solid var(--rand);color:var(--fg);border-radius:8px; padding:6px 10px;font-size:13px;font-family:inherit;cursor:pointer;max-width:280px} .verbindung-banner{display:none;align-items:center;gap:9px;background:var(--unklar);color:#1a1500; @@ -563,6 +569,7 @@ color:var(--gut);border-radius:999px;padding:1px 8px;font-size:11px;font-weight: +
Dienste
@@ -796,6 +803,7 @@ function zeichneStatus(s){ sicherSetzen(true); } document.getElementById('stand').textContent='Stand '+s.stand; + document.getElementById('nutzerAnzeige').textContent=s.nutzer?('👤 '+s.nutzer):''; document.getElementById('dienste').innerHTML=s.dienste.map(d=> `
${esc(d.name)}${esc(d.text)}
`).join('');