diff --git a/src/internal/server/oidc/account.go b/src/internal/server/oidc/account.go index 2fad330..7036039 100644 --- a/src/internal/server/oidc/account.go +++ b/src/internal/server/oidc/account.go @@ -37,13 +37,25 @@ type AccountLogoutHandler struct { const logoutCSRF = "__Host-keycape-logout" var accountLogoutPage = template.Must(template.New("logout").Parse(` - -Sign out of NetKingdom

Sign out of NetKingdom?

+ + +Sign out of NetKingdom ยท NetKingdom Identity
NetKingdom Identity
+

Sign out of NetKingdom?

This ends your shared sign-in session in this browser so you can use another account. Applications that already have their own sessions may remain signed in.

-

Back to my account

`)) +

Back to my account

+
`)) func (h *AccountLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "no-store") @@ -53,7 +65,7 @@ func (h *AccountLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) upstream, _ := url.Parse(h.UpstreamLogoutURL) portal, _ := url.Parse(h.PortalURL) destinations := upstream.Scheme + "://" + upstream.Host + " " + portal.Scheme + "://" + portal.Host - w.Header().Set("Content-Security-Policy", "default-src 'none'; form-action 'self' "+destinations+"; frame-ancestors 'none'; base-uri 'none'") + w.Header().Set("Content-Security-Policy", "default-src 'none'; style-src 'unsafe-inline'; form-action 'self' "+destinations+"; frame-ancestors 'none'; base-uri 'none'") w.Header().Set("X-Content-Type-Options", "nosniff") switch r.Method { case http.MethodGet: diff --git a/src/internal/server/oidc/account_test.go b/src/internal/server/oidc/account_test.go index 44a09df..1a2d68f 100644 --- a/src/internal/server/oidc/account_test.go +++ b/src/internal/server/oidc/account_test.go @@ -31,6 +31,13 @@ func TestSharedLogoutRequiresConfirmationAndFixedReturn(t *testing.T) { if w.Code != 200 || w.Header().Get("Location") != "" { t.Fatal("GET must only confirm") } + page := w.Body.String() + if !strings.Contains(page, "NetKingdom Identity") || !strings.Contains(page, "

Sign out of NetKingdom?

") || !strings.Contains(page, "--paper:#f5f1e8") || !strings.Contains(page, "Georgia,serif") { + t.Fatal("logout page left the account-site design") + } + if !strings.Contains(w.Header().Get("Content-Security-Policy"), "style-src 'unsafe-inline'") { + t.Fatal("inline account-site style blocked") + } if w.Header().Get("Referrer-Policy") != "same-origin" { t.Fatal("browser POST would lose its Origin") }