Reload credentials after save and save credentials directly when Banner is disabled

This commit is contained in:
varjolintu 2021-02-18 22:18:42 +02:00
parent 894b8f4492
commit d16d04fc1d
4 changed files with 32 additions and 12 deletions

View file

@ -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;

View file

@ -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 {

View file

@ -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();
}

View file

@ -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();
});