mirror of https://github.com/keeweb/keeweb
unlocking on request from browser extension
parent
cdc3f5e1df
commit
d5b9aefa01
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue