From 01b3fd559bef880e9a7fabc353b6ae9fba65a4b9 Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 21 Sep 2023 22:34:36 +0100 Subject: [PATCH] Replace usages of `privateKey` --- packages/app/src/Element/PinPrompt.tsx | 6 +++- packages/app/src/Hooks/useLoginHandler.tsx | 10 ++++++- packages/app/src/Login/MultiAccountStore.ts | 15 ++++++---- packages/app/src/Pages/LoginPage.tsx | 33 ++++++++++----------- packages/app/src/Pages/settings/Keys.tsx | 8 ++--- packages/app/src/index.tsx | 21 +++---------- packages/app/src/lang.json | 28 ++++++++++------- packages/app/src/translations/en.json | 8 +++-- 8 files changed, 70 insertions(+), 59 deletions(-) diff --git a/packages/app/src/Element/PinPrompt.tsx b/packages/app/src/Element/PinPrompt.tsx index fe918d2a..0e62fa80 100644 --- a/packages/app/src/Element/PinPrompt.tsx +++ b/packages/app/src/Element/PinPrompt.tsx @@ -119,6 +119,10 @@ export function LoginUnlock() { pub.pow(login.preferences.pow, DefaultPowWorker); } LoginStore.setPublisher(login.id, pub); + LoginStore.updateSession({ + ...login, + privateKeyData: key, + }); } } @@ -142,7 +146,7 @@ export function LoginUnlock() { - +

} onResult={unlockSession} diff --git a/packages/app/src/Hooks/useLoginHandler.tsx b/packages/app/src/Hooks/useLoginHandler.tsx index 7e1be980..aa8d0ad0 100644 --- a/packages/app/src/Hooks/useLoginHandler.tsx +++ b/packages/app/src/Hooks/useLoginHandler.tsx @@ -6,6 +6,7 @@ import { LoginSessionType, LoginStore } from "Login"; import { generateBip39Entropy, entropyToPrivateKey } from "nip6"; import { getNip05PubKey } from "Pages/LoginPage"; import { bech32ToHex } from "SnortUtils"; +import { unwrap } from "@snort/shared"; export class PinRequiredError extends Error {} @@ -54,11 +55,18 @@ export default function useLoginHandler() { const hexKey = await getNip05PubKey(key); LoginStore.loginWithPubkey(hexKey, LoginSessionType.PublicKey); } else if (key.startsWith("bunker://")) { + if (!pin) throw new PinRequiredError(); const nip46 = new Nip46Signer(key); await nip46.init(); const loginPubkey = await nip46.getPubKey(); - LoginStore.loginWithPubkey(loginPubkey, LoginSessionType.Nip46, undefined, nip46.relays, nip46.privateKey); + LoginStore.loginWithPubkey( + loginPubkey, + LoginSessionType.Nip46, + undefined, + nip46.relays, + await PinEncrypted.create(unwrap(nip46.privateKey), pin), + ); nip46.close(); } else { throw new Error("INVALID PRIVATE KEY"); diff --git a/packages/app/src/Login/MultiAccountStore.ts b/packages/app/src/Login/MultiAccountStore.ts index 24a67445..58a28a28 100644 --- a/packages/app/src/Login/MultiAccountStore.ts +++ b/packages/app/src/Login/MultiAccountStore.ts @@ -96,7 +96,7 @@ export class MultiAccountStore extends ExternalStore { type: LoginSessionType, relays?: Record, remoteSignerRelays?: Array, - privateKey?: string, + privateKey?: PinEncrypted, ) { if (this.#accounts.has(key)) { throw new Error("Already logged in with this pubkey"); @@ -113,7 +113,7 @@ export class MultiAccountStore extends ExternalStore { }, preferences: deepClone(DefaultPreferences), remoteSignerRelays, - privateKey, + privateKeyData: privateKey, } as LoginSession; const pub = createPublisher(newSession); @@ -228,10 +228,15 @@ export class MultiAccountStore extends ExternalStore { if (!this.#activeAccount && this.#accounts.size > 0) { this.#activeAccount = this.#accounts.keys().next().value; } - const toSave = [...this.#accounts.values()]; - for (const v of toSave) { + const toSave = []; + for (const v of this.#accounts.values()) { if (v.privateKeyData instanceof PinEncrypted) { - v.privateKeyData = v.privateKeyData.toPayload(); + toSave.push({ + ...v, + privateKeyData: v.privateKeyData.toPayload(), + }); + } else { + toSave.push({ ...v }); } } diff --git a/packages/app/src/Pages/LoginPage.tsx b/packages/app/src/Pages/LoginPage.tsx index 81cfa1be..99de9373 100644 --- a/packages/app/src/Pages/LoginPage.tsx +++ b/packages/app/src/Pages/LoginPage.tsx @@ -9,7 +9,6 @@ import { bech32ToHex, getPublicKey, unwrap } from "SnortUtils"; import ZapButton from "Element/ZapButton"; import useImgProxy from "Hooks/useImgProxy"; import Icon from "Icons/Icon"; -import useLogin from "Hooks/useLogin"; import { generateNewLogin, LoginSessionType, LoginStore } from "Login"; import AsyncButton from "Element/AsyncButton"; import useLoginHandler, { PinRequiredError } from "Hooks/useLoginHandler"; @@ -76,7 +75,6 @@ export async function getNip05PubKey(addr: string): Promise { export default function LoginPage() { const navigate = useNavigate(); - const login = useLogin(); const [key, setKey] = useState(""); const [error, setError] = useState(""); const [pin, setPin] = useState(false); @@ -89,12 +87,6 @@ export default function LoginPage() { const hasSubtleCrypto = window.crypto.subtle !== undefined; const [nostrConnect, setNostrConnect] = useState(""); - useEffect(() => { - if (login.publicKey) { - navigate("/"); - } - }, [login, navigate]); - useEffect(() => { const ret = unwrap(Artwork.at(Artwork.length * Math.random())); const url = proxy(ret.link); @@ -161,18 +153,25 @@ export default function LoginPage() { } function nip46Buttons() { - return null; return ( <> - + {nostrConnect && ( setNostrConnect("")}> -
- - -
+ <> +

+ +

+

+ +

+
+ + +
+
)} @@ -188,7 +187,7 @@ export default function LoginPage() { <> @@ -269,7 +268,7 @@ export default function LoginPage() {

-
+
setMasking(!isMasking)} />
diff --git a/packages/app/src/Pages/settings/Keys.tsx b/packages/app/src/Pages/settings/Keys.tsx index a678ffec..f4f3f626 100644 --- a/packages/app/src/Pages/settings/Keys.tsx +++ b/packages/app/src/Pages/settings/Keys.tsx @@ -1,6 +1,6 @@ import "./Keys.css"; import { FormattedMessage } from "react-intl"; -import { encodeTLV, NostrPrefix } from "@snort/system"; +import { encodeTLV, NostrPrefix, PinEncrypted } from "@snort/system"; import Copy from "Element/Copy"; import useLogin from "Hooks/useLogin"; @@ -8,7 +8,7 @@ import { hexToMnemonic } from "nip6"; import { hexToBech32 } from "SnortUtils"; export default function ExportKeys() { - const { publicKey, privateKey, generatedEntropy } = useLogin(); + const { publicKey, privateKeyData, generatedEntropy } = useLogin(); return (

@@ -16,12 +16,12 @@ export default function ExportKeys() {

- {privateKey && ( + {privateKeyData instanceof PinEncrypted && ( <>

- + )} {generatedEntropy && ( diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index a07fdf76..bb5c6c5a 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -8,16 +8,7 @@ import WasmPath from "@snort/system-query/pkg/system_query_bg.wasm"; import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import { - EventPublisher, - NostrSystem, - ProfileLoaderService, - Nip7Signer, - PowWorker, - QueryOptimizer, - FlatReqFilter, - ReqFilter, -} from "@snort/system"; +import { NostrSystem, ProfileLoaderService, PowWorker, QueryOptimizer, FlatReqFilter, ReqFilter } from "@snort/system"; import { SnortContext } from "@snort/system-react"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; @@ -71,13 +62,9 @@ export const System = new NostrSystem({ relayMetrics: RelayMetrics, queryOptimizer: WasmQueryOptimizer, authHandler: async (c, r) => { - const { publicKey, privateKey } = LoginStore.snapshot(); - if (privateKey) { - const pub = EventPublisher.privateKey(privateKey); - return await pub.nip42Auth(c, r); - } - if (publicKey) { - const pub = new EventPublisher(new Nip7Signer(), publicKey); + const { id } = LoginStore.snapshot(); + const pub = LoginStore.getPublisher(id); + if (pub) { return await pub.nip42Auth(c, r); } }, diff --git a/packages/app/src/lang.json b/packages/app/src/lang.json index e86efa89..6c62b893 100644 --- a/packages/app/src/lang.json +++ b/packages/app/src/lang.json @@ -99,9 +99,6 @@ "25V4l1": { "defaultMessage": "Banner" }, - "27jzYm": { - "defaultMessage": "Enter pin to unlock private key" - }, "2IFGap": { "defaultMessage": "Donate" }, @@ -145,6 +142,9 @@ "3yk8fB": { "defaultMessage": "Wallet" }, + "40VR6s": { + "defaultMessage": "Nostr Connect" + }, "450Fty": { "defaultMessage": "None" }, @@ -226,6 +226,9 @@ "89q5wc": { "defaultMessage": "Confirm Reposts" }, + "8Kboo2": { + "defaultMessage": "Scan this QR code with your signer app to get started" + }, "8QDesP": { "defaultMessage": "Zap {n} sats" }, @@ -241,6 +244,10 @@ "8v1NN+": { "defaultMessage": "Pairing phrase" }, + "8xNnhi": { + "defaultMessage": "Nostr Extension", + "description": "Login button for NIP7 key manager extension" + }, "9+Ddtu": { "defaultMessage": "Next" }, @@ -563,6 +570,10 @@ "LwYmVi": { "defaultMessage": "Zaps on this note will be split to the following users." }, + "M10zFV": { + "defaultMessage": "Nostr Connect", + "description": "Login button for NIP-46 signer app" + }, "M3Oirc": { "defaultMessage": "Debug Menus" }, @@ -779,10 +790,6 @@ "VnXp8Z": { "defaultMessage": "Avatar" }, - "VtPV/B": { - "defaultMessage": "Login with Extension (NIP-07)", - "description": "Login button for NIP7 key manager extension" - }, "VvaJst": { "defaultMessage": "View Wallets" }, @@ -940,6 +947,9 @@ "e61Jf3": { "defaultMessage": "Coming soon" }, + "e7VmYP": { + "defaultMessage": "Enter pin to unlock your private key" + }, "e7qqly": { "defaultMessage": "Mark All Read" }, @@ -1009,10 +1019,6 @@ "hMzcSq": { "defaultMessage": "Messages" }, - "hWSp+B": { - "defaultMessage": "Nostr Connect (NIP-46)", - "description": "Login button for NIP-46 signer app" - }, "hY4lzx": { "defaultMessage": "Supports" }, diff --git a/packages/app/src/translations/en.json b/packages/app/src/translations/en.json index 992595e7..b17252b2 100644 --- a/packages/app/src/translations/en.json +++ b/packages/app/src/translations/en.json @@ -32,7 +32,6 @@ "1udzha": "Conversations", "2/2yg+": "Add", "25V4l1": "Banner", - "27jzYm": "Enter pin to unlock private key", "2IFGap": "Donate", "2LbrkB": "Enter password", "2a2YiP": "{n} Bookmarks", @@ -47,6 +46,7 @@ "3tVy+Z": "{n} Followers", "3xCwbZ": "OR", "3yk8fB": "Wallet", + "40VR6s": "Nostr Connect", "450Fty": "None", "47FYwb": "Cancel", "4IPzdn": "Primary Developers", @@ -74,11 +74,13 @@ "7hp70g": "NIP-05", "8/vBbP": "Reposts ({n})", "89q5wc": "Confirm Reposts", + "8Kboo2": "Scan this QR code with your signer app to get started", "8QDesP": "Zap {n} sats", "8Rkoyb": "Recipient", "8Y6bZQ": "Invalid zap split: {input}", "8g2vyB": "name too long", "8v1NN+": "Pairing phrase", + "8xNnhi": "Nostr Extension", "9+Ddtu": "Next", "9HU8vw": "Reply", "9SvQep": "Follows {n}", @@ -185,6 +187,7 @@ "Lu5/Bj": "Open on Zapstr", "Lw+I+J": "{n,plural,=0{{name} zapped} other{{name} & {n} others zapped}}", "LwYmVi": "Zaps on this note will be split to the following users.", + "M10zFV": "Nostr Connect", "M3Oirc": "Debug Menus", "MBAYRO": "Shows \"Copy ID\" and \"Copy Event JSON\" in the context menu on each message", "MI2jkA": "Not available:", @@ -255,7 +258,6 @@ "VR5eHw": "Public key (npub/nprofile)", "VlJkSk": "{n} muted", "VnXp8Z": "Avatar", - "VtPV/B": "Login with Extension (NIP-07)", "VvaJst": "View Wallets", "Vx7Zm2": "How do keys work?", "W1yoZY": "It looks like you dont have any subscriptions, you can get one {link}", @@ -307,6 +309,7 @@ "d7d0/x": "LN Address", "dOQCL8": "Display name", "e61Jf3": "Coming soon", + "e7VmYP": "Enter pin to unlock your private key", "e7qqly": "Mark All Read", "eHAneD": "Reaction emoji", "eJj8HD": "Get Verified", @@ -330,7 +333,6 @@ "h8XMJL": "Badges", "hK5ZDk": "the world", "hMzcSq": "Messages", - "hWSp+B": "Nostr Connect (NIP-46)", "hY4lzx": "Supports", "hicxcO": "Show replies", "hmZ3Bz": "Media",