working v1.

This commit is contained in:
fiatjaf
2022-01-14 09:49:03 -03:00
parent 0d38bc7eb3
commit db20f0c370
21 changed files with 884 additions and 1111 deletions

View File

@@ -2,8 +2,41 @@ import browser from 'webextension-polyfill'
import {Buffer} from 'buffer'
import {validateEvent, signEvent, getEventHash, getPublicKey} from 'nostr-tools'
import {
PERMISSIONS_REQUIRED,
readPermissionLevel,
updatePermission
} from './common'
const prompts = {}
browser.runtime.onMessage.addListener(async (req, sender) => {
let {type, params, host} = req
let {prompt} = req
if (prompt) {
return handlePromptMessage(req, sender)
} else {
return handleContentScriptMessage(req)
}
})
async function handleContentScriptMessage({type, params, host}) {
let level = await readPermissionLevel(host)
if (level >= PERMISSIONS_REQUIRED[type]) {
// authorized, proceed
} else {
// ask for authorization
try {
await promptPermission(host, PERMISSIONS_REQUIRED[type])
// authorized, proceed
} catch (_) {
// not authorized, stop here
return {
error: `insufficient permissions, required ${PERMISSIONS_REQUIRED[type]}`
}
}
}
try {
switch (type) {
@@ -38,4 +71,42 @@ browser.runtime.onMessage.addListener(async (req, sender) => {
} catch (error) {
return {error}
}
})
}
function handlePromptMessage({id, condition, host, level}, sender) {
switch (condition) {
case 'forever':
case 'expirable':
prompts[id]?.resolve?.()
updatePermission(host, {
level,
condition
})
break
case 'single':
prompts[id]?.resolve?.()
break
case 'no':
prompts[id]?.reject?.()
break
}
delete prompts[id]
browser.windows.remove(sender.tab.windowId)
}
function promptPermission(host, level) {
let id = Math.random().toString().slice(4)
let qs = new URLSearchParams({host, level, id})
return new Promise((resolve, reject) => {
browser.windows.create({
url: `${browser.runtime.getURL('prompt.html')}?${qs.toString()}`,
type: 'popup',
width: 340,
height: 230
})
prompts[id] = {resolve, reject}
})
}