oficina / meet Public

Clear stale Meet sessions safely before the Home redirect

Paul Campbell pushed by paul@keymail.dev 967e425d3967a2785212578524f391e525bc276e parent f9cb47f
2 files changed, +33 −4
  • internal/meet/home.go +5 −4
  • internal/meet/home_router_test.go +28 −0

CI passed — run details

diff --git a/internal/meet/home.go b/internal/meet/home.go
index 9b99afe..7f3818a 100644
--- a/internal/meet/home.go
+++ b/internal/meet/home.go
@@ -18,8 +18,9 @@ import (
var errHomeIdentity = errors.New("meet: Home identity refused")
type homeIntegration struct {
- bridge *connect.Bridge
- routes *connect.Routes
+ bridge *connect.Bridge
+ routes *connect.Routes
+ sessions *sessions.Sessions
}
func (a *app) wireHome() error {
@@ -72,7 +73,7 @@ func (a *app) wireHome() error {
if err != nil {
return errHomeIdentity
}
- a.home = &homeIntegration{b, routes}
+ a.home = &homeIntegration{b, routes, sess}
return nil
}
@@ -99,7 +100,7 @@ func (a *app) personForSession(ctx context.Context, s sessions.Session) (Person,
func (a *app) signin(w http.ResponseWriter, r *http.Request) {
if a.home != nil {
if _, pending := a.readJoinCookie(r); !pending {
- a.home.routes.Signin(w, r)
+ a.home.sessions.Middleware(http.HandlerFunc(a.home.routes.Signin)).ServeHTTP(w, r)
return
}
}
diff --git a/internal/meet/home_router_test.go b/internal/meet/home_router_test.go
index 1f10c94..4382892 100644
--- a/internal/meet/home_router_test.go
+++ b/internal/meet/home_router_test.go
@@ -301,3 +301,31 @@ func TestHomeLookupDatabaseFailureKeepsSession(t *testing.T) {
t.Fatal("recovered lookup did not preserve session", w.Code)
}
}
+
+func TestHomeSigninClearsOnlyDefinitivelyStaleSession(t *testing.T) {
+ f := newHomeRouterFixture(t)
+ f.local(t)
+ cookieName := f.app.home.sessions.CookieName()
+ saved := f.cookies[cookieName].Value
+ if _, err := f.app.db.Writer().Exec("ALTER TABLE sessions RENAME TO unavailable_sessions"); err != nil {
+ t.Fatal(err)
+ }
+ homeRedirect(t, f.do("GET", "/signin", ""))
+ if f.cookies[cookieName] == nil || f.cookies[cookieName].Value != saved {
+ t.Fatal("temporary storage failure cleared valid cookie")
+ }
+ if _, err := f.app.db.Writer().Exec("ALTER TABLE unavailable_sessions RENAME TO sessions"); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := f.app.db.Writer().Exec("DELETE FROM sessions"); err != nil {
+ t.Fatal(err)
+ }
+ start := homeRedirect(t, f.do("GET", "/signin", ""))
+ if f.cookies[cookieName] != nil {
+ t.Fatal("stale cookie not cleared")
+ }
+ target := homeRedirect(t, f.do("GET", start, ""))
+ if !strings.HasPrefix(target, homeTestIssuer+"/") {
+ t.Fatal("stale cookie prevented Home sign-in", target)
+ }
+}