mirror of https://github.com/keeweb/keeweb.git
updating entries
This commit is contained in:
parent
c15d709db2
commit
e4693ecf61
|
@ -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');
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue