From defc45c6e47e14a333ceefedec98e54af4e185d2 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Tue, 1 Jul 2025 09:16:57 +0300 Subject: [PATCH] Move privacy to optional permissions --- dist/manifest_chromium.json | 4 +++- dist/manifest_firefox.json | 4 +++- keepassxc-browser/background/page.js | 1 + keepassxc-browser/common/global_ui.js | 7 +++++++ keepassxc-browser/manifest.json | 4 +++- keepassxc-browser/options/getting_started.js | 16 +++++----------- keepassxc-browser/options/options.js | 18 ++++++++---------- 7 files changed, 30 insertions(+), 24 deletions(-) diff --git a/dist/manifest_chromium.json b/dist/manifest_chromium.json index cb5f460..95b3399 100755 --- a/dist/manifest_chromium.json +++ b/dist/manifest_chromium.json @@ -162,7 +162,6 @@ "nativeMessaging", "notifications", "offscreen", - "privacy", "storage", "tabs", "webNavigation", @@ -170,6 +169,9 @@ "webRequestAuthProvider", "webRequestBlocking" ], + "optional_permissions": [ + "privacy" + ], "content_security_policy": { "extension_pages": "script-src 'self'" }, diff --git a/dist/manifest_firefox.json b/dist/manifest_firefox.json index acd7d26..85aee3d 100644 --- a/dist/manifest_firefox.json +++ b/dist/manifest_firefox.json @@ -166,7 +166,6 @@ "cookies", "nativeMessaging", "notifications", - "privacy", "storage", "tabs", "webNavigation", @@ -176,6 +175,9 @@ "http://*/*", "https://api.github.com/" ], + "optional_permissions": [ + "privacy" + ], "applications": { "gecko": { "id": "keepassxc-browser@keepassxc.org", diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index cc4008b..06d7880 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -19,6 +19,7 @@ const defaultSettings = { debugLogging: false, defaultGroup: '', defaultPasskeyGroup: '', + defaultPasswordManager: false, defaultGroupAlwaysAsk: false, downloadFaviconAfterSave: false, passkeys: false, diff --git a/keepassxc-browser/common/global_ui.js b/keepassxc-browser/common/global_ui.js index 6c8adca..0d31b40 100644 --- a/keepassxc-browser/common/global_ui.js +++ b/keepassxc-browser/common/global_ui.js @@ -10,6 +10,11 @@ HTMLElement.prototype.hide = function() { // Disables the browser's internal password manager and let the extension take the control const updateDefaultPasswordManager = async function() { + const permissionResponse = await browser.permissions.request({ permissions: [ 'privacy' ] }); + if (!permissionResponse) { + return false; + } + const passwordSavingEnabled = await browser.privacy.services.passwordSavingEnabled.get({}); if ((passwordSavingEnabled?.levelOfControl === 'controlled_by_this_extension' || passwordSavingEnabled?.levelOfControl === 'controllable_by_this_extension') @@ -18,4 +23,6 @@ const updateDefaultPasswordManager = async function() { value: !passwordSavingEnabled.value, }); } + + return passwordSavingEnabled.value; }; diff --git a/keepassxc-browser/manifest.json b/keepassxc-browser/manifest.json index cb5f460..95b3399 100755 --- a/keepassxc-browser/manifest.json +++ b/keepassxc-browser/manifest.json @@ -162,7 +162,6 @@ "nativeMessaging", "notifications", "offscreen", - "privacy", "storage", "tabs", "webNavigation", @@ -170,6 +169,9 @@ "webRequestAuthProvider", "webRequestBlocking" ], + "optional_permissions": [ + "privacy" + ], "content_security_policy": { "extension_pages": "script-src 'self'" }, diff --git a/keepassxc-browser/options/getting_started.js b/keepassxc-browser/options/getting_started.js index 9d99320..83d6cb8 100644 --- a/keepassxc-browser/options/getting_started.js +++ b/keepassxc-browser/options/getting_started.js @@ -9,11 +9,12 @@ const $ = function(elem) { const initPage = async function() { const changeCheckboxValue = async function(e) { const name = e.currentTarget.name; - const isChecked = e.currentTarget.checked; + let isChecked = e.currentTarget.checked; if (name === 'defaultPasswordManager') { - await updateDefaultPasswordManager(); - return; + const isDefaultPasswordManagerSet = await updateDefaultPasswordManager(); + isChecked = isDefaultPasswordManagerSet; + e.target.checked = isDefaultPasswordManagerSet; } options.settings[name] = isChecked; @@ -23,14 +24,7 @@ const initPage = async function() { // Switch/checkboxes const checkboxes = document.querySelectorAll('#tab-getting-started input[type=checkbox]'); for (const checkbox of checkboxes) { - if (checkbox.name === 'defaultPasswordManager') { - const passwordSavingEnabled = await browser.privacy.services.passwordSavingEnabled.get({}); - checkbox.checked = (passwordSavingEnabled?.levelOfControl === 'controlled_by_this_extension' - && !passwordSavingEnabled.value) || false; - } else { - checkbox.checked = options.settings[checkbox.name]; - } - + checkbox.checked = options.settings[checkbox.name]; checkbox.addEventListener('click', changeCheckboxValue); } diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index 29d47c7..4f040ac 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -64,6 +64,13 @@ options.initGeneralSettings = async function() { const isChecked = e.currentTarget.checked; options.settings[name] = isChecked; + // Default password manager setting relies on optional permission, and must be checked before saving options + if (name === 'defaultPasswordManager') { + const isDefaultPasswordManagerSet = await updateDefaultPasswordManager(); + options.settings[name] = isDefaultPasswordManagerSet; + e.target.checked = isDefaultPasswordManagerSet; + } + const updated = await options.saveSettings(); if (name === 'autoFillAndSend') { browser.runtime.sendMessage({ action: 'init_http_auth' }); @@ -78,8 +85,6 @@ options.initGeneralSettings = async function() { $('#passkeysFallback').disabled = !isChecked; } else if (name === 'useMonochromeToolbarIcon') { browser.runtime.sendMessage({ action: 'update_popup' }); - } else if (name === 'defaultPasswordManager') { - await updateDefaultPasswordManager(); } }; @@ -92,14 +97,7 @@ options.initGeneralSettings = async function() { const generalSettingsCheckboxes = document.querySelectorAll('#tab-general-settings input[type=checkbox]'); for (const checkbox of generalSettingsCheckboxes) { - if (checkbox.name === 'defaultPasswordManager') { - const passwordSavingEnabled = await browser.privacy.services.passwordSavingEnabled.get({}); - checkbox.checked = (passwordSavingEnabled?.levelOfControl === 'controlled_by_this_extension' - && !passwordSavingEnabled.value) || false; - } else { - checkbox.checked = options.settings[checkbox.name]; - } - + checkbox.checked = options.settings[checkbox.name]; if (checkbox.name === 'defaultGroupAlwaysAsk' && checkbox.checked) { $('#defaultGroup').disabled = true; $('#defaultGroupButton').disabled = true;