From e4693ecf613e75763bc1955c0d56b0b8d566587d Mon Sep 17 00:00:00 2001 From: antelle Date: Tue, 27 Apr 2021 19:15:03 +0200 Subject: [PATCH] updating entries --- app/scripts/comp/extension/protocol-impl.js | 77 ++++++++++++++----- .../extension/extension-save-entry-view.js | 4 +- .../extension/extension-save-entry.hbs | 18 ++--- 3 files changed, 67 insertions(+), 32 deletions(-) diff --git a/app/scripts/comp/extension/protocol-impl.js b/app/scripts/comp/extension/protocol-impl.js index 38432aa2..56ebe394 100644 --- a/app/scripts/comp/extension/protocol-impl.js +++ b/app/scripts/comp/extension/protocol-impl.js @@ -275,7 +275,9 @@ function isKeePassXcBrowser(request) { function focusKeeWeb() { logger.debug('Focus KeeWeb'); if (Launcher) { - Launcher.showMainWindow(); + if (!Launcher.isAppFocused()) { + Launcher.showMainWindow(); + } } else { sendEvent({ action: 'attention-required' }); } @@ -443,9 +445,7 @@ const ProtocolHandlers = { const payload = decryptRequest(request); await checkContentRequestPermissions(request); - if (payload.uuid || payload.groupUuid) { - throw new Error('Modirying entries is not supported'); - } + focusKeeWeb(); if (!payload.url) { throw new Error('Empty url'); @@ -457,7 +457,28 @@ const ProtocolHandlers = { let selectedGroup; - if (client.permissions.askSave === 'auto' && client.permissions.saveTo) { + let entryToUpdate; + if (payload.uuid) { + for (const file of files) { + const entryId = kdbxweb.ByteUtils.bytesToBase64( + kdbxweb.ByteUtils.hexToBytes(payload.uuid) + ); + const foundEntry = file.getEntry(file.subId(entryId)); + if (foundEntry) { + if (entryToUpdate) { + throw new Error('Two entries with the same ID found'); + } else { + entryToUpdate = foundEntry; + selectedGroup = foundEntry.group; + } + } + } + if (!entryToUpdate) { + throw new Error('Updated entry not found'); + } + } + + if (client.permissions.askSave === 'auto' && client.permissions.saveTo && !selectedGroup) { const file = files.find((f) => f.id === client.permissions.saveTo.fileId); selectedGroup = file?.getGroup(client.permissions.saveTo.groupId); } @@ -509,6 +530,7 @@ const ProtocolHandlers = { url: payload.url, user: payload.login, askSave: RuntimeDataModel.extensionSaveConfig?.askSave || 'always', + update: !!entryToUpdate, allGroups }); @@ -520,33 +542,46 @@ const ProtocolHandlers = { }); const config = { ...saveEntryView.config }; - if (config.groupId) { - const file = files.find((f) => f.id === config.fileId); - selectedGroup = file.getGroup(config.groupId); - } else { - selectedGroup = appModel.createNewGroupWithName( - files[0].groups[0], - files[0], - DefaultExtensionGroupName - ); - selectedGroup.setIcon(ExtensionGroupIconId); - config.groupId = selectedGroup.id; + if (!entryToUpdate) { + if (config.groupId) { + const file = files.find((f) => f.id === config.fileId); + selectedGroup = file.getGroup(config.groupId); + } else { + selectedGroup = appModel.createNewGroupWithName( + files[0].groups[0], + files[0], + DefaultExtensionGroupName + ); + selectedGroup.setIcon(ExtensionGroupIconId); + config.groupId = selectedGroup.id; + } + + RuntimeDataModel.extensionSaveConfig = config; + client.permissions.saveTo = { fileId: config.fileId, groupId: config.groupId }; } - RuntimeDataModel.extensionSaveConfig = config; - client.permissions.askSave = config.askSave; - client.permissions.saveTo = { fileId: config.fileId, groupId: config.groupId }; } - appModel.createNewEntryWithFields(selectedGroup, { + const entryFields = { Title: url.hostname, UserName: payload.login, Password: kdbxweb.ProtectedValue.fromString(payload.password || ''), URL: payload.url - }); + }; + + if (entryToUpdate) { + for (const [field, value] of Object.entries(entryFields)) { + if (value) { + entryToUpdate.setField(field, value); + } + } + } else { + appModel.createNewEntryWithFields(selectedGroup, entryFields); + } client.stats.passwordsWritten++; + Events.emit('browser-extension-sessions-changed'); Events.emit('refresh'); diff --git a/app/scripts/views/extension/extension-save-entry-view.js b/app/scripts/views/extension/extension-save-entry-view.js index 30b12c10..d8889c65 100644 --- a/app/scripts/views/extension/extension-save-entry-view.js +++ b/app/scripts/views/extension/extension-save-entry-view.js @@ -5,8 +5,8 @@ class ExtensionSaveEntryView extends View { template = template; events = { - 'change #extension-create-entry__auto': 'autoChanged', - 'change #extension-create-entry__group': 'groupChanged' + 'change #extension-save-entry__auto': 'autoChanged', + 'change #extension-save-entry__group': 'groupChanged' }; constructor(model) { diff --git a/app/templates/extension/extension-save-entry.hbs b/app/templates/extension/extension-save-entry.hbs index be9da195..aec1da4f 100644 --- a/app/templates/extension/extension-save-entry.hbs +++ b/app/templates/extension/extension-save-entry.hbs @@ -1,16 +1,16 @@ -
+

{{res 'extensionSaveEntryBody'}}

- - {{url}} + + {{url}}

- - {{user}} + + {{user}}

- - {{#each allGroups as |group|}}

- - + +