diff --git a/README.md b/README.md index c956780..5f78d04 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ async window.nostr.signEvent(event): Event // returns the full event object sign async window.nostr.getRelays(): { [url: string]: RelayPolicy } // returns a map of relays async window.nostr.nip04.encrypt(pubkey, plaintext): string // returns ciphertext+iv as specified in nip04 async window.nostr.nip04.decrypt(pubkey, ciphertext): string // takes ciphertext+iv as specified in nip04 +async window.nostr.nip26.delegate(delegateePubkey, cond): object // generates a delegation token ({from, to, cond, sig}) ``` This extension is Chromium-only. For a maintained Firefox fork, see [nos2x-fox](https://diegogurpegui.com/nos2x-fox/). diff --git a/extension/background.js b/extension/background.js index 6eb109c..3554dd4 100644 --- a/extension/background.js +++ b/extension/background.js @@ -6,7 +6,7 @@ import { getPublicKey, nip19 } from 'nostr-tools' -import {nip04} from 'nostr-tools' +import {nip04, nip26} from 'nostr-tools' import {Mutex} from 'async-mutex' import { @@ -142,6 +142,11 @@ async function handleContentScriptMessage({type, params, host}) { let {peer, ciphertext} = params return decrypt(sk, peer, ciphertext) } + case 'nip26.delegate': { + let { delegateePubkey, conditionsJson } = params + let parameters = { pubkey: delegateePubkey, ...conditionsJson } + return nip26.createDelegation(sk, parameters) + } } } catch (error) { return {error: {message: error.message, stack: error.stack}} diff --git a/extension/common.js b/extension/common.js index d1274e9..d9ac27d 100644 --- a/extension/common.js +++ b/extension/common.js @@ -8,14 +8,16 @@ export const PERMISSIONS_REQUIRED = { getPublicKey: 1, getRelays: 5, signEvent: 10, + 'nip26.delegate': 10, 'nip04.encrypt': 20, - 'nip04.decrypt': 20 + 'nip04.decrypt': 20, } const ORDERED_PERMISSIONS = [ [1, ['getPublicKey']], [5, ['getRelays']], [10, ['signEvent']], + [10, ['nip26.delegate']], [20, ['nip04.encrypt']], [20, ['nip04.decrypt']] ] @@ -25,7 +27,8 @@ const PERMISSION_NAMES = { getRelays: 'read your list of preferred relays', signEvent: 'sign events using your private key', 'nip04.encrypt': 'encrypt messages to peers', - 'nip04.decrypt': 'decrypt messages from peers' + 'nip04.decrypt': 'decrypt messages from peers', + 'nip26.delegate': 'create key delegation tokens', } export function getAllowedCapabilities(permission) { diff --git a/extension/nostr-provider.js b/extension/nostr-provider.js index eae0885..8fee5c7 100644 --- a/extension/nostr-provider.js +++ b/extension/nostr-provider.js @@ -26,6 +26,12 @@ window.nostr = { } }, + nip26: { + async delegate(delegateePubkey, conditionsJson) { + return window.nostr._call('nip26.delegate', {delegateePubkey, conditionsJson}) + } + }, + _call(type, params) { return new Promise((resolve, reject) => { let id = Math.random().toString().slice(4)