diff --git a/server/backend/internal/httpapi/manage/auth.go b/server/backend/internal/httpapi/manage/auth.go index d82af3b..a42ffd8 100644 --- a/server/backend/internal/httpapi/manage/auth.go +++ b/server/backend/internal/httpapi/manage/auth.go @@ -76,13 +76,18 @@ func HandleLoginUI(authStore *store.AuthStore, screenStore *store.ScreenStore, c func HandleLoginPost(authStore *store.AuthStore, screenStore *store.ScreenStore, cfg config.Config) http.HandlerFunc { tmpl := template.Must(template.New("login").Parse(loginTmpl)) - renderError := func(w http.ResponseWriter, next, msg string) { - w.Header().Set("Content-Type", "text/html; charset=utf-8") - w.WriteHeader(http.StatusUnauthorized) - _ = tmpl.Execute(w, loginData{Error: msg, Next: next}) - } - return func(w http.ResponseWriter, r *http.Request) { + // K1: CSRF-Cookie erneuern und Token für Fehler-Re-Rendering bereitstellen. + // Das Token muss auch bei Fehlerantworten im Hidden-Field stehen, damit + // der nächste Submit-Versuch den CSRF-Check besteht. + csrfToken := setCSRFCookie(w, r, cfg.DevMode) + + renderError := func(w http.ResponseWriter, next, msg string) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusUnauthorized) + _ = tmpl.Execute(w, loginData{Error: msg, Next: next, CSRFToken: csrfToken}) + } + if err := r.ParseForm(); err != nil { renderError(w, "", "Ungültige Anfrage.") return