Distinguish refused Home identities from unavailable storage
2 files changed,
+30
−3
internal/memoria/home_identity.go+6 −3internal/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) |
| + } |
| +} |