From 3b0739f187172decc27aded70756031cc454c2e6 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 12 May 2024 13:12:46 -0500 Subject: [PATCH] Add a getClientConnectUri function, add "Nostr Connect" link in the OAuth form --- src/controllers/api/oauth.ts | 6 +++++- src/utils/connect.ts | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/utils/connect.ts diff --git a/src/controllers/api/oauth.ts b/src/controllers/api/oauth.ts index e45b31a5..a755a4d5 100644 --- a/src/controllers/api/oauth.ts +++ b/src/controllers/api/oauth.ts @@ -2,10 +2,11 @@ import { encodeBase64 } from '@std/encoding/base64'; import { nip19 } from 'nostr-tools'; import { z } from 'zod'; -import { lodash } from '@/deps.ts'; import { AppController } from '@/app.ts'; +import { lodash } from '@/deps.ts'; import { nostrNow } from '@/utils.ts'; import { parseBody } from '@/utils/api.ts'; +import { getClientConnectUri } from '@/utils/connect.ts'; const passwordGrantSchema = z.object({ grant_type: z.literal('password'), @@ -68,6 +69,7 @@ const oauthController: AppController = async (c) => { } const redirectUri = maybeDecodeUri(encodedUri); + const connectUri = await getClientConnectUri(c.req.raw.signal); const script = ` window.addEventListener('load', function() { @@ -101,6 +103,8 @@ const oauthController: AppController = async (c) => { +
+ Nostr Connect `); diff --git a/src/utils/connect.ts b/src/utils/connect.ts new file mode 100644 index 00000000..0c69a523 --- /dev/null +++ b/src/utils/connect.ts @@ -0,0 +1,20 @@ +import { Conf } from '@/config.ts'; +import { getInstanceMetadata } from '@/utils/instance.ts'; + +/** Get NIP-46 `nostrconnect://` URI for the Ditto server. */ +export async function getClientConnectUri(signal?: AbortSignal): Promise { + const uri = new URL('nostrconnect://'); + const { name, description } = await getInstanceMetadata(signal); + + const metadata = { + name, + description, + url: Conf.localDomain, + }; + + uri.host = Conf.pubkey; + uri.searchParams.set('relay', Conf.relay); + uri.searchParams.set('metadata', JSON.stringify(metadata)); + + return uri.toString(); +}