unlocking on request from browser extension

This commit is contained in:
antelle 2021-04-26 12:06:03 +02:00
parent cdc3f5e1df
commit d5b9aefa01
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
3 changed files with 38 additions and 5 deletions

View File

@ -11,6 +11,7 @@ import { KnownAppVersions } from 'const/known-app-versions';
import { ExtensionConnectView } from 'views/extension/extension-connect-view';
import { RuntimeDataModel } from 'models/runtime-data-model';
import { Timeouts } from 'const/timeouts';
import { AppSettingsModel } from '../../models/app-settings-model';
const KeeWebAssociationId = 'KeeWeb';
const KeeWebHash = '398d9c782ec76ae9e9877c2321cbda2b31fc6d18ccf0fed5ca4bd746bab4d64a'; // sha256('KeeWeb')
@ -135,8 +136,25 @@ function ensureAtLeastOneFileIsOpen() {
}
}
function checkContentRequestPermissions(request) {
ensureAtLeastOneFileIsOpen();
async function checkContentRequestPermissions(request) {
if (!appModel.files.hasOpenFiles()) {
if (AppSettingsModel.extensionFocusIfLocked) {
try {
focusKeeWeb();
await appModel.unlockAnyFile(
'extensionUnlockMessage',
Timeouts.KeeWebConnectRequest
);
} catch {
if (Launcher) {
Launcher.hideApp();
}
throw makeError(Errors.noOpenFiles);
}
} else {
throw makeError(Errors.noOpenFiles);
}
}
const client = getClient(request);
if (client.permissions) {
@ -324,7 +342,7 @@ const ProtocolHandlers = {
'test-associate'(request) {
const payload = decryptRequest(request);
ensureAtLeastOneFileIsOpen();
// ensureAtLeastOneFileIsOpen();
if (payload.id !== KeeWebAssociationId) {
throw makeError(Errors.noOpenFiles);

View File

@ -786,5 +786,6 @@
"extensionConnectAskSave": "Ask before saving new passwords to KeeWeb:",
"extensionConnectAskSaveAlways": "always",
"extensionConnectAskSaveAuto": "when it's not possible to save automatically",
"extensionConnectSettingsAreForSession": "Settings you select here are valid only for the active session. You can view and manage sessions in KeeWeb settings."
"extensionConnectSettingsAreForSession": "Settings you select here are valid only for the active session. You can view and manage sessions in KeeWeb settings.",
"extensionUnlockMessage": "Unlock to connect browser extension"
}

View File

@ -1432,10 +1432,24 @@ class AppModel {
}
}
unlockAnyFile(unlockRes) {
unlockAnyFile(unlockRes, timeout) {
this.rejectPendingFileUnlockPromise('Replaced with a new operation');
return new Promise((resolve, reject) => {
this.fileUnlockPromise = { resolve, reject, unlockRes };
if (timeout) {
const timer = setTimeout(
() => this.rejectPendingFileUnlockPromise('Timeout'),
timeout
);
this.fileUnlockPromise.resolve = (res) => {
clearTimeout(timer);
resolve(res);
};
this.fileUnlockPromise.reject = (err) => {
clearTimeout(timer);
reject(err);
};
}
this.appLogger.info('Pending file unlock operation is set');
Events.emit('unlock-message-changed', unlockRes);
});