Release 2026.10.1: dev auf main (0,4%-Artikel + Frist-Fixes) #20
Loading…
Reference in a new issue
No description provided.
Delete branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Release 2026.10.1
Frontend (Vanilla-HTML/JS, EjUn-Design): - admin/members.html: Statistik, Filter (Suche/Rolle/Status), anlegen (ejun.create, Rolle wählbar + TempPassword), bearbeiten (PUT Voll-Entity, Passwort bleibt), bestätigen (confirm), Passwort-Reset (resetPassword, Einmal-Passwort mit Copy-Button), Soft-Delete/Reaktivieren (setStatus), Hard-Delete (DELETE) - admin/contents.html: Seiten-Flags Public/Members (Visibility), anlegen/bearbeiten/toggle/löschen - admin/admin.js: gemeinsamer OData-Client (API-Basis aus URL abgeleitet: /dev/adminapi/ in Dev, /adminapi/ in Prod) - login.html: ?fail=2 (angemeldet, aber kein Admin), Admin-Kontext (Titel/Kicker), ?next= blieb Backend (OData-Vokabular, keine neuen Auth-Konzepte): - ejun.create: wie register, aber Role wählbar + TempPassword zurück (200 created / 409 exists / 400 invalid-email) - PUT Members: ConfirmedAt jetzt auch kopiert (Edit-Roundtrip) - AuthzController: /admin/ (Prod) neben /dev/admin/ als Admin-Pfad — ohne wäre Prod-Admin per Content-Lookup öffentlich geworden Nginx: - Gate: /dev/admin/ -> 302 /dev/login.html?next=/dev/admin/members.html /admin/ -> 302 /login.html?next=/admin/members.html - Panel: /dev/admin/* + /admin/* -> auth_request (Admin + Active) - API: /dev/adminapi/ + /adminapi/ -> 127.0.0.1:8081/odata/ (geschütztes OData; öffentlich bleiben NUR register+verify) - 401-Zwei-Wechsel wie Report: ohne Header echte 401 (Browser retryt mit user:pass@), mit falschem Header -> login.html?fail=1&next=..., 403 -> fail=2. Dev/Prod getrennt (unterschiedliches Login-File).- admin.js: absolute API-Base (location.origin) + expliziter Authorization-Header (sessionStorage, Fallback location.username) + HTML-Erkennung in parse() - login.html: user:pass in sessionStorage beim Submit - members.html + contents.html: r.html -> 'Session abgelaufen' + Redirect zur Login-Card - e2e-admin-browser.mjs: 19-Check UI-E2E (Playwright) Kern-Bug: relative fetch('/dev/adminapi/...') erbt die user:pass@-Creds aus location.href -> Fetch-Spec wirft 'Request cannot be constructed from a URL that includes credentials'. Absolute URL + Header fixen es. E2E: 19/19 gruen (Chromium 1234, VM 10.20.10.10)- session-id.js: pro Browser-Tab/Session ein zufaelliges ejun_sid (sessionStorage + Session-Cookie), im Head gesetzt BEVOR die erste auth_request feuert. - Nginx: alle 5 auth_request-Subrequests reichen X-Ejun-Sid ($cookie_ejun_sid) + X-Authz-Path ($uri bei Admin) an das OData-Backend. - Backend ejun-oapi: - ActivityLog-Entity (User, SessionId, Entry, Timestamp) + DbSet + OData-Set 'ActivityLogs' (READ-ONLY, EnableQuery). - Schema-Patch fuer besth. DB (CREATE TABLE IF NOT EXISTS, idempotent). - AuthzController schreibt bei jeder Freigabe einen Protokoll-Eintrag (try/catch: DB-Fehler darf Gate nie blockieren). Admin-Pfade -> 'admin' (Panel) / 'adminapi' (API), Assets bleiben raus. - Admin-Portal: neuer Tab 'Protokoll' (members/contents/protokoll) mit Stats, Suche, Eintrag-/Zeitraum-Filter, letzten 200 Zeilen (de-DE Zeit). Verifiziert: dotnet build + publish 0 Warnungen 0 Fehler.- Nginx: uvp-hayforst-report + umzingelungsgutachten-report ohne auth_request (Beschreibung + Quellen oben fuer ALLE sichtbar); entlastung-franken- neuhofen-report bleibt 401-geschuetzt (hat noch kein client-Gating). - zensiermodus.js (neu): prueft das ejun_auth-Cookie gegen /odata/verify und blendt .report-document ein; CTA wird 'Abmelden' (loescht Cookie). - Report-CTA: ?next= auf die eigene Report-URL (Bugfix: Login landete immer auf Hayforst). - login.html: fuer oeffentliche Reports Redirect OHNE Credentials in der URL (Cookie-Session reicht); CRED-URL bleibt nur fuer Admin (auth_request). - styles.css: .report-zensiert .report-document { display:none } (kein FOUC, head-Skript setzt die Klasse vor dem ersten Paint). - Kleinigkeiten: Meta-Description Umzingelungs-Report, News-Link im selben Tab, Report-Wrapper-Section mit aria-label.OData-Reader warf ODataException ("parameters missing") fuer das nicht-nullable bool Unkenntlich, wenn es im Payload fehlte -> unhandled -> 500. Fix: - ODataModel: Unkenntlich als bool? (nullable) deklariert - Controller: bool? Unkenntlich, Default false (= Checkbox unangehackt) - Program.cs: defensive Middleware fängt "…are missing from the request payload" generisch ab -> 400 {Ok:false,Status:invalid} (Warning-Log statt unhandled-fail) Verifiziert: lokal 7/7 Smoke-Tests + Live (leer/Teil-Payload -> 400, gültig -> 200 received, Unkenntlich 0/1 korrekt persistiert).