nip04.encrypt and nip04.decrypt.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import browser from 'webextension-polyfill'
|
||||
import {Buffer} from 'buffer'
|
||||
import {validateEvent, signEvent, getEventHash, getPublicKey} from 'nostr-tools'
|
||||
import {encrypt, decrypt} from 'nostr-tools/nip04'
|
||||
|
||||
import {
|
||||
PERMISSIONS_REQUIRED,
|
||||
@@ -38,38 +39,41 @@ async function handleContentScriptMessage({type, params, host}) {
|
||||
}
|
||||
}
|
||||
|
||||
let results = await browser.storage.local.get('private_key')
|
||||
if (!results || !results.private_key) {
|
||||
return {error: 'no private key found'}
|
||||
}
|
||||
|
||||
let sk = results.private_key
|
||||
|
||||
try {
|
||||
switch (type) {
|
||||
case 'getPublicKey': {
|
||||
let results = await browser.storage.local.get('private_key')
|
||||
if (results && results.private_key) {
|
||||
return Buffer.from(getPublicKey(results.private_key)).toString('hex')
|
||||
} else {
|
||||
return {error: 'no private key found'}
|
||||
}
|
||||
return Buffer.from(getPublicKey(sk)).toString('hex')
|
||||
}
|
||||
case 'signEvent': {
|
||||
let {event} = params
|
||||
|
||||
let results = await browser.storage.local.get('private_key')
|
||||
if (results && results.private_key) {
|
||||
if (!event.pubkey)
|
||||
event.pubkey = Buffer.from(
|
||||
getPublicKey(results.private_key)
|
||||
).toString('hex')
|
||||
if (!event.id) event.id = getEventHash(event)
|
||||
if (!event.pubkey)
|
||||
event.pubkey = Buffer.from(getPublicKey(sk)).toString('hex')
|
||||
if (!event.id) event.id = getEventHash(event)
|
||||
|
||||
if (!validateEvent(event)) return {error: 'invalid event'}
|
||||
if (!validateEvent(event)) return {error: 'invalid event'}
|
||||
|
||||
let signature = await signEvent(event, results.private_key)
|
||||
return Buffer.from(signature).toString('hex')
|
||||
} else {
|
||||
return {error: 'no private key found'}
|
||||
}
|
||||
let signature = await signEvent(event, sk)
|
||||
return Buffer.from(signature).toString('hex')
|
||||
}
|
||||
case 'nip04.encrypt': {
|
||||
let {peer, plaintext} = params
|
||||
return encrypt(sk, peer, plaintext)
|
||||
}
|
||||
case 'nip04.decrypt': {
|
||||
let {peer, ciphertext} = params
|
||||
return decrypt(sk, peer, ciphertext)
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
return {error}
|
||||
return {error: {message: error.message, stack: error.stack}}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,17 +2,23 @@ import browser from 'webextension-polyfill'
|
||||
|
||||
export const PERMISSIONS_REQUIRED = {
|
||||
getPublicKey: 1,
|
||||
signEvent: 10
|
||||
signEvent: 10,
|
||||
'nip04.encrypt': 20,
|
||||
'nip04.decrypt': 20
|
||||
}
|
||||
|
||||
const ORDERED_PERMISSIONS = [
|
||||
[1, ['getPublicKey']],
|
||||
[10, ['signEvent']]
|
||||
[10, ['signEvent']],
|
||||
[20, ['nip04.encrypt']],
|
||||
[20, ['nip04.decrypt']]
|
||||
]
|
||||
|
||||
const PERMISSION_NAMES = {
|
||||
getPublicKey: 'read your public key',
|
||||
signEvent: 'sign events using your private key'
|
||||
signEvent: 'sign events using your private key',
|
||||
'nip04.encrypt': 'encrypt messages to peers',
|
||||
'nip04.decrypt': 'decrypt messages to peers'
|
||||
}
|
||||
|
||||
export function getAllowedCapabilities(permission) {
|
||||
@@ -31,6 +37,9 @@ export function getAllowedCapabilities(permission) {
|
||||
export function getPermissionsString(permission) {
|
||||
let capabilities = getAllowedCapabilities(permission)
|
||||
|
||||
if (capabilities.length === 0) return 'none'
|
||||
if (capabilities.length === 1) return capabilities[0]
|
||||
|
||||
return (
|
||||
capabilities.slice(0, -1).join(', ') +
|
||||
' and ' +
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "nos2x",
|
||||
"description": "Nostr Signer Extension",
|
||||
"version": "1.0.1",
|
||||
"version": "1.1.0",
|
||||
"homepage_url": "https://github.com/fiatjaf/nos2x",
|
||||
"manifest_version": 2,
|
||||
"icons": {
|
||||
|
||||
@@ -26,6 +26,16 @@ window.nostr = {
|
||||
'*'
|
||||
)
|
||||
})
|
||||
},
|
||||
|
||||
nip04: {
|
||||
encrypt(peer, plaintext) {
|
||||
return window.nostr._call('nip04.encrypt', {peer, plaintext})
|
||||
},
|
||||
|
||||
decrypt(peer, ciphertext) {
|
||||
return window.nostr._call('nip04.decrypt', {peer, ciphertext})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,9 +49,9 @@ window.addEventListener('message', message => {
|
||||
return
|
||||
|
||||
if (message.data.response.error) {
|
||||
window.nostr._requests[message.data.id].reject(
|
||||
new Error(`nos2x: ${message.data.response.error}`)
|
||||
)
|
||||
let error = new Error('nos2x: ' + message.data.response.error.message)
|
||||
error.stack = message.data.response.error.stack
|
||||
window.nostr._requests[message.data.id].reject(error)
|
||||
} else {
|
||||
window.nostr._requests[message.data.id].resolve(message.data.response)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user