From 4976d7e96f027e4263e99c42181b2e51a0d54be4 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Mon, 20 Oct 2025 13:07:07 -0400 Subject: [PATCH] feat: include nip44 permissions in nip07 defaults --- js/nostr.js | 19 ++++++---- tests/nostr-login-permissions.test.mjs | 49 ++++++++++---------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/js/nostr.js b/js/nostr.js index 04514e72..53874461 100644 --- a/js/nostr.js +++ b/js/nostr.js @@ -196,17 +196,21 @@ const WATCH_HISTORY_REPUBLISH_MAX_DELAY_MS = 5 * 60 * 1000; const WATCH_HISTORY_REPUBLISH_MAX_ATTEMPTS = 8; const WATCH_HISTORY_REPUBLISH_JITTER = 0.25; +export const DEFAULT_NIP07_ENCRYPTION_METHODS = Object.freeze([ + // Encryption helpers — request both legacy NIP-04 and modern NIP-44 upfront + "nip04.encrypt", + "nip04.decrypt", + "nip44.encrypt", + "nip44.decrypt", +]); + export const DEFAULT_NIP07_PERMISSION_METHODS = Object.freeze([ // Core auth + relay metadata "get_public_key", "sign_event", "read_relays", "write_relays", - // Encryption helpers — request both legacy NIP-04 and modern NIP-44 upfront - "nip04.encrypt", - "nip04.decrypt", - "nip44.encrypt", - "nip44.decrypt", + ...DEFAULT_NIP07_ENCRYPTION_METHODS, ]); const viewEventPublishMemory = new Map(); @@ -560,7 +564,10 @@ async function runNip07WithRetry( } } -export const __testExports = { runNip07WithRetry }; +export const __testExports = { + runNip07WithRetry, + DEFAULT_NIP07_ENCRYPTION_METHODS, +}; function withRequestTimeout(promise, timeoutMs, onTimeout, message = "Request timed out") { const resolvedTimeout = Number(timeoutMs); diff --git a/tests/nostr-login-permissions.test.mjs b/tests/nostr-login-permissions.test.mjs index c2574c10..de67e6a8 100644 --- a/tests/nostr-login-permissions.test.mjs +++ b/tests/nostr-login-permissions.test.mjs @@ -5,7 +5,16 @@ import test from "node:test"; import { NostrClient, nostrClient, __testExports } from "../js/nostr.js"; import { accessControl } from "../js/accessControl.js"; -const { runNip07WithRetry } = __testExports ?? {}; +const { + runNip07WithRetry, + DEFAULT_NIP07_ENCRYPTION_METHODS, +} = __testExports ?? {}; + +const EXPECTED_ENCRYPTION_PERMISSIONS = Array.isArray( + DEFAULT_NIP07_ENCRYPTION_METHODS, +) + ? DEFAULT_NIP07_ENCRYPTION_METHODS + : ["nip04.encrypt", "nip04.decrypt", "nip44.encrypt", "nip44.decrypt"]; const HEX_PUBKEY = "f".repeat(64); const PERMISSIONS_STORAGE_KEY = "bitvid:nip07:permissions"; @@ -143,26 +152,16 @@ test("NIP-07 login requests decrypt permissions upfront", async () => { const pubkey = await nostrClient.login(); assert.equal(pubkey, HEX_PUBKEY); assert.ok(env.enableCalls.length >= 1, "extension.enable should be invoked"); - assert.ok( - nostrClient.extensionPermissionCache.has("nip04.decrypt"), - "nip04.decrypt permission should be tracked as granted", - ); - assert.ok( - nostrClient.extensionPermissionCache.has("nip04.encrypt"), - "nip04.encrypt permission should be tracked as granted", - ); + for (const method of EXPECTED_ENCRYPTION_PERMISSIONS) { + assert.ok( + nostrClient.extensionPermissionCache.has(method), + `${method} permission should be tracked as granted`, + ); + } assert.ok( nostrClient.extensionPermissionCache.has("sign_event"), "sign_event permission should be tracked as granted", ); - assert.ok( - nostrClient.extensionPermissionCache.has("nip44.encrypt"), - "nip44.encrypt permission should be tracked as granted", - ); - assert.ok( - nostrClient.extensionPermissionCache.has("nip44.decrypt"), - "nip44.decrypt permission should be tracked as granted", - ); } finally { env.restore(); nostrClient.logout(); @@ -204,13 +203,7 @@ test("NIP-07 decrypt reuses cached extension permissions", async () => { .map((method) => method.trim()) .filter(Boolean), ); - const expectedStoredPermissions = [ - "nip04.decrypt", - "nip04.encrypt", - "nip44.encrypt", - "nip44.decrypt", - ]; - for (const method of expectedStoredPermissions) { + for (const method of EXPECTED_ENCRYPTION_PERMISSIONS) { assert.ok( storedSet.has(method), `stored permissions should include ${method}`, @@ -220,13 +213,7 @@ test("NIP-07 decrypt reuses cached extension permissions", async () => { const freshClient = new NostrClient(); freshClient.pubkey = HEX_PUBKEY; - const expectedCachedPermissions = [ - "nip04.decrypt", - "nip04.encrypt", - "nip44.encrypt", - "nip44.decrypt", - ]; - for (const method of expectedCachedPermissions) { + for (const method of EXPECTED_ENCRYPTION_PERMISSIONS) { assert.ok( freshClient.extensionPermissionCache.has(method), `fresh client should hydrate ${method} from storage`,