updating entries

This commit is contained in:
antelle 2021-04-27 19:15:03 +02:00
parent c15d709db2
commit e4693ecf61
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
3 changed files with 67 additions and 32 deletions

View File

@ -275,7 +275,9 @@ function isKeePassXcBrowser(request) {
function focusKeeWeb() { function focusKeeWeb() {
logger.debug('Focus KeeWeb'); logger.debug('Focus KeeWeb');
if (Launcher) { if (Launcher) {
Launcher.showMainWindow(); if (!Launcher.isAppFocused()) {
Launcher.showMainWindow();
}
} else { } else {
sendEvent({ action: 'attention-required' }); sendEvent({ action: 'attention-required' });
} }
@ -443,9 +445,7 @@ const ProtocolHandlers = {
const payload = decryptRequest(request); const payload = decryptRequest(request);
await checkContentRequestPermissions(request); await checkContentRequestPermissions(request);
if (payload.uuid || payload.groupUuid) { focusKeeWeb();
throw new Error('Modirying entries is not supported');
}
if (!payload.url) { if (!payload.url) {
throw new Error('Empty url'); throw new Error('Empty url');
@ -457,7 +457,28 @@ const ProtocolHandlers = {
let selectedGroup; 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); const file = files.find((f) => f.id === client.permissions.saveTo.fileId);
selectedGroup = file?.getGroup(client.permissions.saveTo.groupId); selectedGroup = file?.getGroup(client.permissions.saveTo.groupId);
} }
@ -509,6 +530,7 @@ const ProtocolHandlers = {
url: payload.url, url: payload.url,
user: payload.login, user: payload.login,
askSave: RuntimeDataModel.extensionSaveConfig?.askSave || 'always', askSave: RuntimeDataModel.extensionSaveConfig?.askSave || 'always',
update: !!entryToUpdate,
allGroups allGroups
}); });
@ -520,33 +542,46 @@ const ProtocolHandlers = {
}); });
const config = { ...saveEntryView.config }; const config = { ...saveEntryView.config };
if (config.groupId) { if (!entryToUpdate) {
const file = files.find((f) => f.id === config.fileId); if (config.groupId) {
selectedGroup = file.getGroup(config.groupId); const file = files.find((f) => f.id === config.fileId);
} else { selectedGroup = file.getGroup(config.groupId);
selectedGroup = appModel.createNewGroupWithName( } else {
files[0].groups[0], selectedGroup = appModel.createNewGroupWithName(
files[0], files[0].groups[0],
DefaultExtensionGroupName files[0],
); DefaultExtensionGroupName
selectedGroup.setIcon(ExtensionGroupIconId); );
config.groupId = selectedGroup.id; 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.askSave = config.askSave;
client.permissions.saveTo = { fileId: config.fileId, groupId: config.groupId };
} }
appModel.createNewEntryWithFields(selectedGroup, { const entryFields = {
Title: url.hostname, Title: url.hostname,
UserName: payload.login, UserName: payload.login,
Password: kdbxweb.ProtectedValue.fromString(payload.password || ''), Password: kdbxweb.ProtectedValue.fromString(payload.password || ''),
URL: payload.url 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++; client.stats.passwordsWritten++;
Events.emit('browser-extension-sessions-changed'); Events.emit('browser-extension-sessions-changed');
Events.emit('refresh'); Events.emit('refresh');

View File

@ -5,8 +5,8 @@ class ExtensionSaveEntryView extends View {
template = template; template = template;
events = { events = {
'change #extension-create-entry__auto': 'autoChanged', 'change #extension-save-entry__auto': 'autoChanged',
'change #extension-create-entry__group': 'groupChanged' 'change #extension-save-entry__group': 'groupChanged'
}; };
constructor(model) { constructor(model) {

View File

@ -1,16 +1,16 @@
<div class="extension-create-entry"> <div class="extension-save-entry">
<p>{{res 'extensionSaveEntryBody'}}</p> <p>{{res 'extensionSaveEntryBody'}}</p>
<p> <p>
<label for="extension-create-entry__url">{{Res 'website'}}:</label> <label for="extension-save-entry__url">{{Res 'website'}}:</label>
<span id="extension-create-entry__url">{{url}}</span> <span id="extension-save-entry__url">{{url}}</span>
</p> </p>
<p> <p>
<label for="extension-create-entry__user">{{Res 'user'}}:</label> <label for="extension-save-entry__user">{{Res 'user'}}:</label>
<span id="extension-create-entry__user">{{user}}</span> <span id="extension-save-entry__user">{{user}}</span>
</p> </p>
<p> <p>
<label for="extension-create-entry__group">{{Res 'group'}}:</label> <label for="extension-save-entry__group">{{Res 'group'}}:</label>
<select id="extension-create-entry__group" class="input-base"> <select id="extension-save-entry__group" class="input-base" {{#if update}}disabled{{/if}}>
{{#each allGroups as |group|}} {{#each allGroups as |group|}}
<option value="{{group.id}}" data-file="{{group.fileId}}" <option value="{{group.id}}" data-file="{{group.fileId}}"
{{#if group.selected}}selected{{/if}} {{#if group.selected}}selected{{/if}}
@ -22,7 +22,7 @@
</select> </select>
</p> </p>
<p> <p>
<input type="checkbox" id="extension-create-entry__auto" {{#ifeq askSave 'auto'}}checked{{/ifeq}} /> <input type="checkbox" id="extension-save-entry__auto" {{#ifeq askSave 'auto'}}checked{{/ifeq}} />
<label for="extension-create-entry__auto">{{res 'extensionSaveEntryAuto'}}</label> <label for="extension-save-entry__auto">{{res 'extensionSaveEntryAuto'}}</label>
</p> </p>
</div> </div>