From d8a0eca8917f050df042bba60d23d34f00860fd4 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Wed, 5 Mar 2025 11:22:07 -0300 Subject: [PATCH] refactor: get author from grant event (30360), before doing the admin deletion --- .../ditto/storages/DittoRelayStore.test.ts | 20 +++++++++++++++++-- packages/ditto/storages/DittoRelayStore.ts | 14 +++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/ditto/storages/DittoRelayStore.test.ts b/packages/ditto/storages/DittoRelayStore.test.ts index 62d2742e..9940ba05 100644 --- a/packages/ditto/storages/DittoRelayStore.test.ts +++ b/packages/ditto/storages/DittoRelayStore.test.ts @@ -95,13 +95,29 @@ Deno.test('Admin revokes nip05 grant and nip05 column gets null', async () => { assertEquals(row?.nip05_domain, 'gleasonator.dev'); assertEquals(row?.nip05_hostname, 'gleasonator.dev'); + const grant = await conf.signer.signEvent({ + kind: 30360, + tags: [ + ['d', 'alex@gleasonator.dev'], + ['r', 'alex@gleasonator.dev'], + ['L', 'nip05.domain'], + ['l', 'gleasonator.dev', 'nip05.domain'], + ['p', event.pubkey], + ['e', 'whatever'], + ], + created_at: nostrNow(), + content: '', + }); + + await store.event(grant); + const adminDeletion = await conf.signer.signEvent({ kind: 5, - created_at: nostrNow(), tags: [ ['k', '30360'], - ['p', event.pubkey], // NOTE: this is not in the NIP-09 spec + ['e', grant.id], ], + created_at: nostrNow(), content: '', }); diff --git a/packages/ditto/storages/DittoRelayStore.ts b/packages/ditto/storages/DittoRelayStore.ts index 27d3b491..2f5a1fb7 100644 --- a/packages/ditto/storages/DittoRelayStore.ts +++ b/packages/ditto/storages/DittoRelayStore.ts @@ -183,11 +183,11 @@ export class DittoRelayStore implements NRelay { } try { + await this.handleRevokeNip05(event, signal); await relay.event(purifyEvent(event), { signal }); } finally { // This needs to run in steps, and should not block the API from responding. await Promise.allSettled([ - this.handleRevokeNip05(event, signal), this.handleZaps(event), this.updateAuthorData(event, signal), this.prewarmLinkPreview(event, signal), @@ -258,7 +258,17 @@ export class DittoRelayStore implements NRelay { return; } - const authorId = event.tags.find(([name]) => name === 'p')?.[1]; + const eventId = event.tags.find(([name]) => name === 'e')?.[1]; + if (!eventId || !isNostrId(eventId)) { + return; + } + + const [grant] = await relay.query([{ kinds: [30360], ids: [eventId] }], { signal }); + if (!grant) { + return; + } + + const authorId = grant.tags.find(([name]) => name === 'p')?.[1]; if (!authorId || !isNostrId(authorId)) { return; }