0.2.40
This commit is contained in:
@@ -106,7 +106,7 @@ func TestHealthAndAdminStayReachableDuringMaintenance(t *testing.T) {
|
||||
}
|
||||
|
||||
// installerSessionExpiring mints a session with a chosen life left, which is the only way
|
||||
// to reach the renewal window without waiting a quarter of an hour in a test.
|
||||
// to reach the renewal window without waiting six hours in a test.
|
||||
func installerSessionExpiring(t *testing.T, s *Server, remaining time.Duration) *http.Cookie {
|
||||
t.Helper()
|
||||
payload := make([]byte, 8+16)
|
||||
@@ -137,7 +137,7 @@ func renewedCookie(rec *httptest.ResponseRecorder) *http.Cookie {
|
||||
|
||||
// The admin sign-in used to be an absolute half hour: an operator was signed out from
|
||||
// under themselves mid-edit, and the console's poll then reported "invalid admin token"
|
||||
// with no way back to a login.
|
||||
// with no way back to a login. A renewed admin session now lasts a full working day.
|
||||
func TestAdminSessionIsExtendedWhileTheOperatorIsWorking(t *testing.T) {
|
||||
server := testServer(config.Config{
|
||||
AdminToken: "secret", ReleasePublishToken: "release-secret",
|
||||
@@ -158,10 +158,14 @@ func TestAdminSessionIsExtendedWhileTheOperatorIsWorking(t *testing.T) {
|
||||
if cookie == nil {
|
||||
t.Fatal("expected a refreshed installer cookie")
|
||||
}
|
||||
if cookie.MaxAge != int(adminSessionTTL/time.Second) {
|
||||
t.Fatalf("renewed admin cookie MaxAge = %d, want %d",
|
||||
cookie.MaxAge, int(adminSessionTTL/time.Second))
|
||||
}
|
||||
follow := httptest.NewRequest(http.MethodGet, "/admin/api/status", nil)
|
||||
follow.AddCookie(cookie)
|
||||
expires, ok := server.installerSessionExpiry(follow)
|
||||
if !ok || time.Until(expires) < installerSessionTTL-time.Minute {
|
||||
if !ok || time.Until(expires) < adminSessionTTL-time.Minute {
|
||||
t.Fatalf("renewed session should carry a full TTL, has %v (ok=%v)",
|
||||
time.Until(expires), ok)
|
||||
}
|
||||
@@ -198,7 +202,7 @@ func TestAdminSessionIsNotRewrittenWhileItIsStillFresh(t *testing.T) {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
})
|
||||
|
||||
req := adminRequest(server, installerSessionTTL-time.Minute, t)
|
||||
req := adminRequest(server, adminSessionTTL-time.Minute, t)
|
||||
req.Header.Set(adminActivityHeader, "1")
|
||||
rec := httptest.NewRecorder()
|
||||
handler.ServeHTTP(rec, req)
|
||||
@@ -456,12 +460,16 @@ func TestAdminPageEstablishesPersistentCookie(t *testing.T) {
|
||||
|
||||
server.adminRoutes().ServeHTTP(rec, req)
|
||||
|
||||
result := rec.Result()
|
||||
cookies := result.Cookies()
|
||||
if len(cookies) != 1 {
|
||||
t.Fatalf("expected one admin cookie, got %d", len(cookies))
|
||||
var cookie *http.Cookie
|
||||
for _, candidate := range rec.Result().Cookies() {
|
||||
if candidate.Name == adminCookieName {
|
||||
cookie = candidate
|
||||
break
|
||||
}
|
||||
}
|
||||
if cookie == nil {
|
||||
t.Fatal("admin page did not establish its persistent cookie")
|
||||
}
|
||||
cookie := cookies[0]
|
||||
if cookie.Name != adminCookieName || cookie.Value != "secret" {
|
||||
t.Fatalf("unexpected admin cookie: %#v", cookie)
|
||||
}
|
||||
@@ -473,6 +481,48 @@ func TestAdminPageEstablishesPersistentCookie(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdminPageOffersLogout(t *testing.T) {
|
||||
server := testServer(config.Config{
|
||||
AdminToken: "secret", ReleasePublishToken: "release-secret",
|
||||
})
|
||||
req := httptest.NewRequest(http.MethodGet, "/admin/overview", nil)
|
||||
addInstallerSession(t, server, req)
|
||||
rec := httptest.NewRecorder()
|
||||
|
||||
server.adminRoutes().ServeHTTP(rec, req)
|
||||
|
||||
if !strings.Contains(rec.Body.String(), `method="post" action="/admin/logout"`) ||
|
||||
!strings.Contains(rec.Body.String(), ">Log out</span>") {
|
||||
t.Fatal("admin shell does not offer logout")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdminLogoutClearsBothBrowserCookies(t *testing.T) {
|
||||
server := testServer(config.Config{
|
||||
AdminToken: "secret", ReleasePublishToken: "release-secret",
|
||||
})
|
||||
req := httptest.NewRequest(http.MethodPost, "https://memby.local/admin/logout", nil)
|
||||
rec := httptest.NewRecorder()
|
||||
|
||||
server.adminRoutes().ServeHTTP(rec, req)
|
||||
|
||||
if rec.Code != http.StatusSeeOther || rec.Header().Get("Location") != "/admin/" {
|
||||
t.Fatalf("logout = %d %q, want 303 to admin gate", rec.Code, rec.Header().Get("Location"))
|
||||
}
|
||||
cleared := map[string]*http.Cookie{}
|
||||
for _, cookie := range rec.Result().Cookies() {
|
||||
cleared[cookie.Name] = cookie
|
||||
}
|
||||
for name, path := range map[string]string{
|
||||
installerCookieName: "/", adminCookieName: "/admin",
|
||||
} {
|
||||
cookie := cleared[name]
|
||||
if cookie == nil || cookie.MaxAge >= 0 || cookie.Path != path || !cookie.HttpOnly || !cookie.Secure {
|
||||
t.Fatalf("logout did not clear %s safely: %#v", name, cookie)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdminAuthAcceptsPersistentCookie(t *testing.T) {
|
||||
server := testServer(config.Config{
|
||||
AdminToken: "secret", ReleasePublishToken: "release-secret",
|
||||
|
||||
Reference in New Issue
Block a user