From a2157a392cc5cb6017a37140504e95973b55914f Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Mon, 3 Jul 2023 05:24:51 -0700 Subject: [PATCH] Add ndk and nsecbunker login --- package-lock.json | Bin 656386 -> 753014 bytes package.json | 1 + src/agent/keys.ts | 71 +++++++++++++++++++++++-- src/app/ModalRoutes.svelte | 6 +++ src/app/shared/NoteContentKind1.svelte | 2 - src/app/views/Login.svelte | 6 +-- src/app/views/LoginAdvanced.svelte | 42 +++++++++++++++ src/app/views/LoginBunker.svelte | 43 +++++++++++++++ src/app/views/UserKeys.svelte | 17 +++++- 9 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 src/app/views/LoginAdvanced.svelte create mode 100644 src/app/views/LoginBunker.svelte diff --git a/package-lock.json b/package-lock.json index d632123c2e2cf5d1c94a30e545cfa3b059581293..7aec7cdea1943f3e61f9f52a9eed4871ea74d000 100644 GIT binary patch delta 56161 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

+6A4S5Au%vSfsySpo{(51R;#oo3fl`b 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 delta 12392 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 (window as {nostr?: any}).nostr -const canSign = () => ["privkey", "extension"].includes(get(method)) +const canSign = () => ["bunker", "privkey", "extension"].includes(get(method)) // Validate the key before setting it to state by encoding it using bech32. // This will error if invalid (this works whether it's a public or a private key) const validate = key => nip19.npubEncode(key) +let ndk, remoteSigner + +const prepareNdk = async (token?: string) => { + const localSigner = new NDKPrivateKeySigner(get(bunkerKey)) + + ndk = new NDK({ + explicitRelayUrls: ["wss://relay.f7z.io", "wss://relay.damus.io", "wss://relay.nsecbunker.com"], + }) + + remoteSigner = new NDKNip46Signer(ndk, get(pubkey), localSigner) + remoteSigner.token = token + + ndk.signer = remoteSigner + + await ndk.connect(5000) + await remoteSigner.blockUntilReady() +} + +const getNDK = async () => { + if (!ndk) { + await prepareNdk() + } + + return ndk +} + const login = ($method, key) => { method.set($method) + pubkey.set(null) + privkey.set(null) + bunkerKey.set(null) + if ($method === "privkey") { privkey.set(key) pubkey.set(getPublicKey(key)) - } else { - privkey.set(null) + } else if (["pubkey", "extension"].includes($method)) { pubkey.set(key) + } else if ($method === "bunker") { + pubkey.set(key.pubkey) + bunkerKey.set(generatePrivateKey()) + prepareNdk(key.token) } } @@ -31,12 +66,20 @@ const clear = () => { privkey.set(null) } -const sign = event => { +const sign = async event => { const $method = get(method) event.pubkey = get(pubkey) event.id = getEventHash(event) + if ($method === "bunker") { + const ndkEvent = new NDKEvent(await getNDK(), event) + + await ndkEvent.sign(remoteSigner) + + return ndkEvent.rawEvent() + } + if ($method === "privkey") { return Object.assign(event, { sig: signEvent(event, get(privkey)), @@ -53,6 +96,23 @@ const sign = event => { const getCrypt = () => { const $method = get(method) + if ($method === "bunker") { + return { + encrypt: async (pubkey, message) => { + const ndk = await getNDK() + const user = ndk.getUser({hexpubkey: pubkey}) + + return ndk.signer.encrypt(user, message) + }, + decrypt: async (pubkey, message) => { + const ndk = await getNDK() + const user = ndk.getUser({hexpubkey: pubkey}) + + return ndk.signer.decrypt(user, message) + }, + } + } + if ($method === "privkey") { const $privkey = get(privkey) @@ -104,6 +164,7 @@ export default { method, pubkey, privkey, + bunkerKey, canSign, validate, login, diff --git a/src/app/ModalRoutes.svelte b/src/app/ModalRoutes.svelte index 717af7ac..e2511bad 100644 --- a/src/app/ModalRoutes.svelte +++ b/src/app/ModalRoutes.svelte @@ -4,7 +4,9 @@ import ChatEdit from "src/app/views/ChatEdit.svelte" import LoginConnect from "src/app/views/LoginConnect.svelte" import LoginPrivKey from "src/app/views/LoginPrivKey.svelte" + import LoginAdvanced from "src/app/views/LoginAdvanced.svelte" import LoginPubKey from "src/app/views/LoginPubKey.svelte" + import LoginBunker from "src/app/views/LoginBunker.svelte" import Onboarding from "src/app/views/Onboarding.svelte" import NoteCreate from "src/app/views/NoteCreate.svelte" import NoteDelete from "src/app/views/NoteDelete.svelte" @@ -50,8 +52,12 @@ {:else if m.type === "login/privkey"} +{:else if m.type === "login/advanced"} + {:else if m.type === "login/pubkey"} +{:else if m.type === "login/bunker"} + {:else if m.type === "login/connect"} {:else if m.type === "person/feed"} diff --git a/src/app/shared/NoteContentKind1.svelte b/src/app/shared/NoteContentKind1.svelte index 1ee3b8e5..f336caae 100644 --- a/src/app/shared/NoteContentKind1.svelte +++ b/src/app/shared/NoteContentKind1.svelte @@ -32,8 +32,6 @@ const links = getLinks(shortContent) const extraLinks = without(links, getLinks(fullContent)) - console.log(fullContent, shortContent) - export const isNewline = i => !shortContent[i] || shortContent[i].type === NEWLINE || diff --git a/src/app/views/Login.svelte b/src/app/views/Login.svelte index f436da69..9707a806 100644 --- a/src/app/views/Login.svelte +++ b/src/app/views/Login.svelte @@ -25,8 +25,8 @@ modal.push({type: "onboarding", stage: "intro"}) } - const pubkeyLogIn = () => { - modal.push({type: "login/pubkey"}) + const advancedLogIn = () => { + modal.push({type: "login/advanced"}) } if (user.getPubkey()) { @@ -56,7 +56,7 @@ >Log In Sign Up - + Advanced Login diff --git a/src/app/views/LoginAdvanced.svelte b/src/app/views/LoginAdvanced.svelte new file mode 100644 index 00000000..f4721964 --- /dev/null +++ b/src/app/views/LoginAdvanced.svelte @@ -0,0 +1,42 @@ + + + + + Advanced Login +

Find more options for logging in to nostr below.

+ + + + +

Log in with public key

+

Use this to access a read-only view of your account (or someone else's).

+
+
+ + +

Log in with Nsec Bunker

+

+ Keep your keys secure by storing them in a bunker. +

+
+
+
+ diff --git a/src/app/views/LoginBunker.svelte b/src/app/views/LoginBunker.svelte new file mode 100644 index 00000000..63eb9822 --- /dev/null +++ b/src/app/views/LoginBunker.svelte @@ -0,0 +1,43 @@ + + + + Login with NsecBunker +

+ To log in remotely, enter your nsec bunker token or pubkey below. If you're not using a token, + you'll need to approve authorization requests in your bunker's admin interface. +

+
+
+ + + +
+ Log In +
+
diff --git a/src/app/views/UserKeys.svelte b/src/app/views/UserKeys.svelte index 96cdc2af..dd3c8f52 100644 --- a/src/app/views/UserKeys.svelte +++ b/src/app/views/UserKeys.svelte @@ -12,7 +12,7 @@ import keys from "src/agent/keys" import {toast} from "src/partials/state" - const {pubkey, privkey} = keys + const {pubkey, privkey, bunkerKey} = keys const nip07 = "https://github.com/nostr-protocol/nips/blob/master/07.md" const keypairUrl = "https://www.cloudflare.com/learning/ssl/how-does-public-key-encryption-work/" @@ -87,6 +87,21 @@

{/if} + {#if $bunkerKey} +
+ Bunker Key + +
+ {/if}