From b62d044b0aef9d0aa81de94b2bd469e02e08dedc Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Sun, 11 Jun 2023 09:07:24 -0300 Subject: [PATCH] show notifications when a request is denied or accepted. --- extension/background.js | 35 ++++++++++++++++++++++++++++++++ extension/icons/denied48.png | Bin 0 -> 9205 bytes extension/manifest.json | 1 + extension/options.jsx | 38 +++++++++++++++++++++++++++++++++-- 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 extension/icons/denied48.png diff --git a/extension/background.js b/extension/background.js index 85109c7..cc10fc3 100644 --- a/extension/background.js +++ b/extension/background.js @@ -101,9 +101,44 @@ async function handleContentScriptMessage({type, params, host}) { if (allowed === true) { // authorized, proceed releasePromptMutex() + browser.notifications + .create(undefined, { + type: 'basic', + title: `${type} allowed for ${host}`, + message: JSON.stringify( + params?.event + ? { + kind: params.event.kind, + content: params.event.content, + tags: params.event.tags + } + : params, + null, + 2 + ), + iconUrl: 'icons/denied48.png' + }) + .then(console.log) + .catch(console.log) } else if (allowed === false) { // denied, just refuse immediately releasePromptMutex() + browser.notifications.create(undefined, { + type: 'basic', + title: `${type} denied for ${host}`, + message: JSON.stringify( + params?.event + ? { + kind: params.event.kind, + content: params.event.content, + tags: params.event.tags + } + : params, + null, + 2 + ), + iconUrl: 'icons/denied48.png' + }) return { error: 'denied' } diff --git a/extension/icons/denied48.png b/extension/icons/denied48.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3da86001dd109b85138494b4dce104f1f82723 GIT binary patch literal 9205 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 OfUc&YM&(7jTmJ>d;*2~1 literal 0 HcmV?d00001 diff --git a/extension/manifest.json b/extension/manifest.json index 9913bfa..210e4be 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -26,6 +26,7 @@ } ], "permissions": ["storage"], + "optional_permissions": ["notifications"], "web_accessible_resources": [ { "resources": ["nostr-provider.js"], diff --git a/extension/options.jsx b/extension/options.jsx index 181c61c..c4be03e 100644 --- a/extension/options.jsx +++ b/extension/options.jsx @@ -13,6 +13,7 @@ function Options() { let [policies, setPermissions] = useState() let [protocolHandler, setProtocolHandler] = useState(null) let [hidingPrivateKey, hidePrivateKey] = useState(true) + let [showNotifications, setNotifications] = useState(false) let [message, setMessage] = useState('') const showMessage = useCallback(msg => { @@ -22,7 +23,7 @@ function Options() { useEffect(() => { browser.storage.local - .get(['private_key', 'relays', 'protocol_handler']) + .get(['private_key', 'relays', 'protocol_handler', 'notifications']) .then(results => { if (results.private_key) { setPrivKey(nip19.nsecEncode(results.private_key)) @@ -40,6 +41,9 @@ function Options() { if (results.protocol_handler) { setProtocolHandler(results.protocol_handler) } + if (results.notifications) { + setNotifications(true) + } }) }, []) @@ -156,7 +160,23 @@ function Options() { {policies?.length > 0 && ( <> -

policies

+
+

policies

+ +
@@ -355,6 +375,20 @@ function Options() { } } + async function handleNotifications() { + if (showNotifications) { + setNotifications(false) + } else { + let granted = await browser.permissions.request({ + permissions: ['notifications'] + }) + if (granted) { + await browser.storage.local.set({notifications: true}) + setNotifications(true) + } + } + } + async function saveRelays() { await browser.storage.local.set({ relays: Object.fromEntries(