working v1.
This commit is contained in:
@@ -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}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user