From d16d04fc1d141cda8000aa55a4c102d1b9fce7b6 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Thu, 18 Feb 2021 22:18:42 +0200 Subject: [PATCH] Reload credentials after save and save credentials directly when Banner is disabled --- keepassxc-browser/background/page.js | 7 ++--- keepassxc-browser/content/banner.js | 8 +++++- .../content/keepassxc-browser.js | 26 +++++++++++++------ keepassxc-browser/popups/popup.js | 3 +++ 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index 7efac4d..eeafbf9 100755 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -268,14 +268,15 @@ page.removePageInformationFromNotExistingTabs = async function() { // Retrieves the credentials. Returns cached values when found. // Page reload or tab switch clears the cache. +// If the retrieval is forced (from Credential Banner), get new credentials normally. page.retrieveCredentials = async function(tab, args = []) { - const [ url, submitUrl ] = args; - if (page.tabs[tab.id] && page.tabs[tab.id].credentials.length > 0) { + const [ url, submitUrl, force ] = args; + if (page.tabs[tab.id] && page.tabs[tab.id].credentials.length > 0 && !force) { return page.tabs[tab.id].credentials; } // Ignore duplicate requests - if (page.currentRequest.url === url && page.currentRequest.submitUrl === submitUrl) { + if (page.currentRequest.url === url && page.currentRequest.submitUrl === submitUrl && !force) { return []; } else { page.currentRequest.url = url; diff --git a/keepassxc-browser/content/banner.js b/keepassxc-browser/content/banner.js index a344883..cc91cdf 100644 --- a/keepassxc-browser/content/banner.js +++ b/keepassxc-browser/content/banner.js @@ -9,6 +9,10 @@ kpxcBanner.credentials = {}; kpxcBanner.wrapper = undefined; kpxcBanner.destroy = async function() { + if (!kpxcBanner.created) { + return; + } + kpxcBanner.created = false; kpxcBanner.credentials = {}; @@ -302,13 +306,15 @@ kpxcBanner.updateCredentials = async function(credentials = {}) { } }; -kpxcBanner.verifyResult = function(code) { +kpxcBanner.verifyResult = async function(code) { if (code === 'error') { kpxcUI.createNotification('error', tr('rememberErrorCannotSaveCredentials')); } else if (code === 'created') { kpxcUI.createNotification('success', tr('rememberCredentialsSaved', kpxcBanner.credentials.username || tr('rememberEmptyUsername'))); + await kpxc.retrieveCredentials(true); // Forced reload } else if (code === 'updated') { kpxcUI.createNotification('success', tr('rememberCredentialsUpdated', kpxcBanner.credentials.username || tr('rememberEmptyUsername'))); + await kpxc.retrieveCredentials(true); // Forced reload } else if (code === 'canceled') { kpxcUI.createNotification('warning', tr('rememberCredentialsNotSaved')); } else { diff --git a/keepassxc-browser/content/keepassxc-browser.js b/keepassxc-browser/content/keepassxc-browser.js index f40c9b6..b1f8d4e 100755 --- a/keepassxc-browser/content/keepassxc-browser.js +++ b/keepassxc-browser/content/keepassxc-browser.js @@ -1251,8 +1251,9 @@ kpxc.prepareCredentials = async function() { * @param {string} passwordValue Submitted password * @param {string} urlValue URL of the page where password change was detected * @param {Array} oldCredentials Credentials saved from the password change page, if available + * @param {boolean} useBanner If banner is disabled, save directly */ -kpxc.rememberCredentials = async function(usernameValue, passwordValue, urlValue, oldCredentials) { +kpxc.rememberCredentials = async function(usernameValue, passwordValue, urlValue, oldCredentials, useBanner = true) { const credentials = (oldCredentials !== undefined && oldCredentials.length > 0) ? oldCredentials : kpxc.credentials; if (passwordValue === '') { return undefined; @@ -1302,14 +1303,20 @@ kpxc.rememberCredentials = async function(usernameValue, passwordValue, urlValue } } - // Show the Credential Banner - kpxcBanner.create({ + const saveCredentials = { username: usernameValue, password: passwordValue, url: urlValue, usernameExists: usernameExists, list: credentialsList - }); + }; + + if (useBanner) { + kpxcBanner.create(saveCredentials); + } else { + kpxcBanner.credentials = saveCredentials; + kpxcBanner.saveNewCredentials(saveCredentials); + } return true; }; @@ -1326,7 +1333,7 @@ kpxc.rememberCredentialsFromContextMenu = async function() { const usernameValue = combination.username ? combination.username.value : ''; const passwordValue = combination.password ? combination.password.value : ''; - const result = await kpxc.rememberCredentials(usernameValue, passwordValue); + const result = await kpxc.rememberCredentials(usernameValue, passwordValue, undefined, undefined, kpxc.settings.showLoginNotifications); if (result === undefined) { kpxcUI.createNotification('error', tr('rememberNoPassword')); return; @@ -1337,13 +1344,14 @@ kpxc.rememberCredentialsFromContextMenu = async function() { } }; -// The basic function for retrieving credentials from KeePassXC -kpxc.retrieveCredentials = async function() { +// The basic function for retrieving credentials from KeePassXC. +// Credential Banner can force the retrieval for reloading new/modified credentials. +kpxc.retrieveCredentials = async function(force = false) { kpxc.url = document.location.href; kpxc.submitUrl = kpxc.getFormActionUrl(kpxc.combinations[0]); if (kpxc.settings.autoRetrieveCredentials && kpxc.url && kpxc.submitUrl) { - await kpxc.retrieveCredentialsCallback(await sendMessage('retrieve_credentials', [ kpxc.url, kpxc.submitUrl ])); + await kpxc.retrieveCredentialsCallback(await sendMessage('retrieve_credentials', [ kpxc.url, kpxc.submitUrl, force ])); } }; @@ -1878,6 +1886,8 @@ browser.runtime.onMessage.addListener(async function(req, sender) { kpxc.initCredentialFields(); } else if (req.action === 'remember_credentials') { kpxc.rememberCredentialsFromContextMenu(); + } else if (req.action === 'retrive_credentials_forced') { + await kpxc.retrieveCredentials(true); } else if (req.action === 'show_password_generator') { kpxcPasswordDialog.trigger(); } diff --git a/keepassxc-browser/popups/popup.js b/keepassxc-browser/popups/popup.js index bb626f8..8ea8e4d 100644 --- a/keepassxc-browser/popups/popup.js +++ b/keepassxc-browser/popups/popup.js @@ -57,6 +57,9 @@ $(async () => { await browser.runtime.sendMessage({ action: 'associate' }); + + // This does not work with Firefox because of https://bugzilla.mozilla.org/show_bug.cgi?id=1665380 + await sendMessageToTab('retrive_credentials_forced'); close(); });