oficina / meet Public

Keep Home admission refusals distinct from temporary lookup failure

Paul Campbell pushed by paul@keymail.dev a67ed8305fe4aeac5bad51cc109e0b56c5744a88 parent 088f119
2 files changed, +40 −2
  • internal/meet/home.go +6 −2
  • internal/meet/home_router_test.go +34 −0
diff --git a/internal/meet/home.go b/internal/meet/home.go
index 1f8d3c0..9b99afe 100644
--- a/internal/meet/home.go
+++ b/internal/meet/home.go
@@ -3,6 +3,7 @@ package meet
import (
"bytes"
"context"
+ "database/sql"
"errors"
"net/http"
@@ -56,8 +57,11 @@ func (a *app) wireHome() error {
},
LookupPerson: func(ctx context.Context, q linkstore.Queryer, id int64) (string, error) {
p, err := a.store.homePersonByID(ctx, q, id)
- if err != nil || !a.isMember(p) {
- return "", errHomeIdentity
+ if err != nil {
+ return "", err
+ }
+ if !a.isMember(p) {
+ return "", sql.ErrNoRows
}
return p.Email, nil
}, Render: a.renderHome})
diff --git a/internal/meet/home_router_test.go b/internal/meet/home_router_test.go
index b7b2e81..1f10c94 100644
--- a/internal/meet/home_router_test.go
+++ b/internal/meet/home_router_test.go
@@ -267,3 +267,37 @@ func TestHomePublicJoinResolvesExistingMember(t *testing.T) {
t.Fatal("removed Home member acquired grant", n)
}
}
+func TestHomeRemovedMemberSigninIsRefusedWithoutServiceError(t *testing.T) {
+ f := newHomeRouterFixture(t)
+ f.link(t)
+ homeRedirect(t, f.do("POST", "/signout", ""))
+ f.app.cfg.allow = allowlist{}
+ start := homeRedirect(t, f.do("GET", "/signin", ""))
+ if w := f.exchange(t, start, "opaque-home-alice"); w.Code != 403 {
+ t.Fatal("removed member should be unknown, not unavailable", w.Code)
+ }
+}
+func TestHomeLookupDatabaseFailureKeepsSession(t *testing.T) {
+ f := newHomeRouterFixture(t)
+ f.link(t)
+ var before int
+ f.app.db.Writer().QueryRow("SELECT count(*) FROM sessions").Scan(&before)
+ if _, err := f.app.db.Writer().Exec("ALTER TABLE persons RENAME TO temporarily_unavailable_persons"); err != nil {
+ t.Fatal(err)
+ }
+ w := f.do("GET", "/", "")
+ if w.Code == 200 {
+ t.Fatal("database failure admitted")
+ }
+ var after int
+ f.app.db.Writer().QueryRow("SELECT count(*) FROM sessions").Scan(&after)
+ if before != after {
+ t.Fatal("transient lookup failure revoked session")
+ }
+ if _, err := f.app.db.Writer().Exec("ALTER TABLE temporarily_unavailable_persons RENAME TO persons"); err != nil {
+ t.Fatal(err)
+ }
+ if w = f.do("GET", "/", ""); w.Code != 200 {
+ t.Fatal("recovered lookup did not preserve session", w.Code)
+ }
+}