oficina / memoria Public

Distinguish refused Home identities from unavailable storage

Paul Campbell pushed by paul@keymail.dev 5bc05007c2623bd6d9472e7a1f9927b739955000 parent 72cd219
2 files changed, +30 −3
  • internal/memoria/home_identity.go +6 −3
  • internal/memoria/home_identity_test.go +24 −0
diff --git a/internal/memoria/home_identity.go b/internal/memoria/home_identity.go
index a37b090..48fa111 100644
--- a/internal/memoria/home_identity.go
+++ b/internal/memoria/home_identity.go
@@ -70,12 +70,12 @@ func (a *app) ensureHomeLocalIdentity(ctx context.Context, session sessions.Sess
func (a *app) lookupHomeLocalIdentity(ctx context.Context, q homeIdentityQueryer, id int64) (string, error) {
if id <= 0 {
- return "", errHomeIdentity
+ return "", sql.ErrNoRows
}
var fingerprint string
var sealed []byte
if err := q.QueryRowContext(ctx, "SELECT address_lookup,address_sealed FROM memoria_home_local_identities WHERE id=?", id).Scan(&fingerprint, &sealed); err != nil {
- return "", errHomeIdentity
+ return "", err
}
plain, err := a.store.sealer.Open(homeAddressPurpose(id), sealed)
if err != nil {
@@ -83,9 +83,12 @@ func (a *app) lookupHomeLocalIdentity(ctx context.Context, q homeIdentityQueryer
}
address := string(plain)
lookup, err := a.store.sealer.Fingerprint(homeAddressFingerprintPurpose, plain)
- if err != nil || lookup != fingerprint || address != normaliseAddress(address) || !a.Admit(address) {
+ if err != nil || lookup != fingerprint || address != normaliseAddress(address) {
return "", errHomeIdentity
}
+ if !a.Admit(address) {
+ return "", sql.ErrNoRows
+ }
return address, nil
}
diff --git a/internal/memoria/home_identity_test.go b/internal/memoria/home_identity_test.go
index 8318c82..cac7675 100644
--- a/internal/memoria/home_identity_test.go
+++ b/internal/memoria/home_identity_test.go
@@ -2,6 +2,8 @@ package memoria
import (
"bytes"
+ "database/sql"
+ "errors"
"testing"
"github.com/carlosframework/rastrillo/migrate"
@@ -142,3 +144,25 @@ func TestHomeLocalIdentityIDIsNotReusedAfterDeletion(t *testing.T) {
t.Fatal("deleted identity ID reused", first, next, err)
}
}
+
+func TestHomeLookupDistinguishesMissingIdentityFromStorageFailure(t *testing.T) {
+ a := homeIdentityFixture(t)
+ _, err := a.lookupHomeLocalIdentity(t.Context(), a.db.Writer(), 999)
+ if !errors.Is(err, sql.ErrNoRows) {
+ t.Fatalf("missing identity: %v", err)
+ }
+ id, _, err := a.ensureHomeLocalIdentity(t.Context(), sessions.Session{Subject: "alice@example.test", Method: "magiclink"})
+ if err != nil {
+ t.Fatal(err)
+ }
+ a.SetOwners([]string{"bob@example.test"})
+ if _, err = a.lookupHomeLocalIdentity(t.Context(), a.db.Writer(), id); !errors.Is(err, sql.ErrNoRows) {
+ t.Fatalf("removed admission: %v", err)
+ }
+ if _, err = a.db.Writer().Exec("ALTER TABLE memoria_home_local_identities RENAME TO unavailable_home_identities"); err != nil {
+ t.Fatal(err)
+ }
+ if _, err = a.lookupHomeLocalIdentity(t.Context(), a.db.Writer(), id); err == nil || errors.Is(err, sql.ErrNoRows) {
+ t.Fatalf("storage failure became missing: %v", err)
+ }
+}