diff --git a/packages/ditto/controllers/api/admin.ts b/packages/ditto/controllers/api/admin.ts index 9e9ba5d0..720331d3 100644 --- a/packages/ditto/controllers/api/admin.ts +++ b/packages/ditto/controllers/api/admin.ts @@ -193,7 +193,7 @@ const adminApproveController: AppController = async (c) => { } const [existing] = await store.query([ - { kinds: [30360], authors: [await conf.signer.getPublicKey()], '#d': [r], limit: 1 }, + { kinds: [30360], authors: [await conf.signer.getPublicKey()], '#d': [r.toLowerCase()], limit: 1 }, ]); if (existing) { @@ -203,7 +203,8 @@ const adminApproveController: AppController = async (c) => { await createAdminEvent({ kind: 30360, tags: [ - ['d', r], + ['d', r.toLowerCase()], + ['r', r], ['L', 'nip05.domain'], ['l', r.split('@')[1], 'nip05.domain'], ['p', event.pubkey], diff --git a/packages/ditto/controllers/api/ditto.ts b/packages/ditto/controllers/api/ditto.ts index 33db6fc7..deac6f38 100644 --- a/packages/ditto/controllers/api/ditto.ts +++ b/packages/ditto/controllers/api/ditto.ts @@ -92,16 +92,22 @@ export const nameRequestController: AppController = async (c) => { const { name, reason } = result.data; - const [existing] = await store.query([{ kinds: [3036], authors: [pubkey], '#r': [name], limit: 1 }]); + const [existing] = await store.query([{ kinds: [3036], authors: [pubkey], '#r': [name.toLowerCase()], limit: 1 }]); if (existing) { return c.json({ error: 'Name request already exists' }, 400); } + const r: string[][] = [['r', name]]; + + if (name !== name.toLowerCase()) { + r.push(['r', name.toLowerCase()]); + } + const event = await createEvent({ kind: 3036, content: reason, tags: [ - ['r', name], + ...r, ['L', 'nip05.domain'], ['l', name.split('@')[1], 'nip05.domain'], ['p', await conf.signer.getPublicKey()], diff --git a/packages/ditto/utils/nip05.ts b/packages/ditto/utils/nip05.ts index 6c53c18c..7d725ab2 100644 --- a/packages/ditto/utils/nip05.ts +++ b/packages/ditto/utils/nip05.ts @@ -54,9 +54,11 @@ async function getNip05( } export async function localNip05Lookup(store: NStore, localpart: string): Promise { + const name = `${localpart}@${Conf.url.host}`; + const [grant] = await store.query([{ kinds: [30360], - '#d': [`${localpart}@${Conf.url.host}`], + '#d': [name, name.toLowerCase()], authors: [await Conf.signer.getPublicKey()], limit: 1, }]); diff --git a/packages/ditto/views/mastodon/notifications.ts b/packages/ditto/views/mastodon/notifications.ts index 75b0547a..59911606 100644 --- a/packages/ditto/views/mastodon/notifications.ts +++ b/packages/ditto/views/mastodon/notifications.ts @@ -99,15 +99,18 @@ async function renderReaction(event: DittoEvent, opts: RenderNotificationOpts) { } async function renderNameGrant(event: DittoEvent) { + const r = event.tags.find(([name]) => name === 'r')?.[1]; const d = event.tags.find(([name]) => name === 'd')?.[1]; - const account = event.author ? await renderAccount(event.author) : await accountFromPubkey(event.pubkey); + const name = r ?? d; - if (!d) return; + if (name) return; + + const account = event.author ? await renderAccount(event.author) : await accountFromPubkey(event.pubkey); return { id: notificationId(event), type: 'ditto:name_grant' as const, - name: d, + name, created_at: nostrDate(event.created_at).toISOString(), account, };