diff --git a/packages/ditto/controllers/api/admin.ts b/packages/ditto/controllers/api/admin.ts index 0568cd57..b4e18f0d 100644 --- a/packages/ditto/controllers/api/admin.ts +++ b/packages/ditto/controllers/api/admin.ts @@ -190,7 +190,7 @@ const adminApproveController: AppController = async (c) => { } const [existing] = await relay.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) { @@ -200,7 +200,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 05044ce7..4d470f24 100644 --- a/packages/ditto/controllers/api/ditto.ts +++ b/packages/ditto/controllers/api/ditto.ts @@ -88,16 +88,22 @@ export const nameRequestController: AppController = async (c) => { const { name, reason } = result.data; - const [existing] = await relay.query([{ kinds: [3036], authors: [pubkey], '#r': [name], limit: 1 }]); + const [existing] = await relay.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, };