From b94e0f33e79f7b0505547f7381ad15de7be2b2f3 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Mon, 30 Oct 2017 13:48:45 +0200 Subject: [PATCH] Database locking fixes --- keepassxc-browser/background/event.js | 6 +- keepassxc-browser/background/init.js | 2 +- keepassxc-browser/background/keepass.js | 133 ++++++++++++------------ 3 files changed, 72 insertions(+), 69 deletions(-) diff --git a/keepassxc-browser/background/event.js b/keepassxc-browser/background/event.js index caf36e3..666ad07 100644 --- a/keepassxc-browser/background/event.js +++ b/keepassxc-browser/background/event.js @@ -142,7 +142,7 @@ kpxcEvent.onReconnect = function(callback, tab) { // Add a small timeout after reconnecting. Just to make sure. It's not pretty, I know :( setTimeout(() => { keepass.generateNewKeyPair(); - keepass.changePublicKeys(tab, (pkRes) => { + keepass.changePublicKeys(tab).then((pkRes) => { keepass.getDatabaseHash((gdRes) => { if (gdRes) { keepass.testAssociation((response) => { @@ -157,9 +157,9 @@ kpxcEvent.onReconnect = function(callback, tab) { }; kpxcEvent.lockDatabase = function(callback, tab) { - keepass.lockDatabase((response) => { + keepass.lockDatabase(tab).then((response => { kpxcEvent.showStatus(true, tab, callback); - }, tab); + })); }; kpxcEvent.onPopStack = function(callback, tab) { diff --git a/keepassxc-browser/background/init.js b/keepassxc-browser/background/init.js index fa369a9..127f4d6 100644 --- a/keepassxc-browser/background/init.js +++ b/keepassxc-browser/background/init.js @@ -3,7 +3,7 @@ keepass.migrateKeyRing().then(() => { page.initOpenedTabs().then(() => { keepass.connectToNative(); keepass.generateNewKeyPair(); - keepass.changePublicKeys(null, (pkRes) => { + keepass.changePublicKeys(null, keepass.messageTimeout).then((pkRes) => { keepass.getDatabaseHash((gdRes) => {}, null); }); }); diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 78cfe98..568245f 100644 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -473,7 +473,7 @@ keepass.getDatabaseHash = function(callback, tab, enableTimeout = false) { } if (!keepass.serverPublicKey) { - keepass.changePublicKeys(tab, null); + keepass.changePublicKeys(tab); } const kpAction = kpActions.GET_DATABASE_HASH; @@ -529,8 +529,8 @@ keepass.getDatabaseHash = function(callback, tab, enableTimeout = false) { else { keepass.databaseHash = 'no-hash'; keepass.isDatabaseClosed = true; - keepass.isKeePassXCAvailable = false; - if (response.message === "") { + if (response.message === '') { + keepass.isKeePassXCAvailable = false; keepass.handleError(tab, kpErrors.TIMEOUT_OR_NOT_CONNECTED); } else { @@ -541,83 +541,86 @@ keepass.getDatabaseHash = function(callback, tab, enableTimeout = false) { }); }; -keepass.changePublicKeys = function(tab, callback) { - if (!keepass.isConnected) { - callback([]); - return; - } +keepass.changePublicKeys = function(tab, enableTimeout = false) { + return new Promise((resolve, reject) => { + if (!keepass.isConnected) { + reject(false); + } - const kpAction = kpActions.CHANGE_PUBLIC_KEYS; - const key = keepass.b64e(keepass.keyPair.publicKey); - let nonce = nacl.randomBytes(keepass.keySize); - nonce = keepass.b64e(nonce); - keepass.clientID = keepass.b64e(nacl.randomBytes(keepass.keySize)); + const kpAction = kpActions.CHANGE_PUBLIC_KEYS; + const key = keepass.b64e(keepass.keyPair.publicKey); + let nonce = nacl.randomBytes(keepass.keySize); + nonce = keepass.b64e(nonce); + keepass.clientID = keepass.b64e(nacl.randomBytes(keepass.keySize)); - const request = { - action: kpAction, - publicKey: key, - proxyPort: (page.settings.port ? page.settings.port : 19700), - nonce: nonce, - clientID: keepass.clientID - }; + const request = { + action: kpAction, + publicKey: key, + proxyPort: (page.settings.port ? page.settings.port : 19700), + nonce: nonce, + clientID: keepass.clientID + }; - keepass.sendNativeMessage(request).then((response) => { - keepass.setcurrentKeePassXCVersion(response.version); + keepass.sendNativeMessage(request, enableTimeout).then((response) => { + keepass.setcurrentKeePassXCVersion(response.version); - if (!keepass.verifyKeyResponse(response, key, nonce)) { - if (tab && page.tabs[tab.id]) { - keepass.handleError(tab, kpErrors.KEY_CHANGE_FAILED); - callback(false); + if (!keepass.verifyKeyResponse(response, key, nonce)) { + if (tab && page.tabs[tab.id]) { + keepass.handleError(tab, kpErrors.KEY_CHANGE_FAILED); + reject(false); + } } - } - else { - keepass.isKeePassXCAvailable = true; - console.log('Server public key: ' + keepass.b64e(keepass.serverPublicKey)); - } - callback(true); + else { + keepass.isKeePassXCAvailable = true; + console.log('Server public key: ' + keepass.b64e(keepass.serverPublicKey)); + } + resolve(true); + }); }); }; -keepass.lockDatabase = function(callback, tab, forceCallback) { - if (!keepass.isConnected) { - keepass.handleError(tab, kpErrors.TIMEOUT_OR_NOT_CONNECTED); - callback([]); - return; - } +keepass.lockDatabase = function(tab) { + return new Promise((resolve, reject) => { + if (!keepass.isConnected) { + keepass.handleError(tab, kpErrors.TIMEOUT_OR_NOT_CONNECTED); + reject(false); + } - const kpAction = kpActions.LOCK_DATABASE; - const nonce = nacl.randomBytes(keepass.keySize); + const kpAction = kpActions.LOCK_DATABASE; + const nonce = nacl.randomBytes(keepass.keySize); - const messageData = { - action: kpAction - }; + const messageData = { + action: kpAction + }; - const request = { - action: kpAction, - message: keepass.encrypt(messageData, nonce), - nonce: keepass.b64e(nonce), - clientID: keepass.clientID - }; + const request = { + action: kpAction, + message: keepass.encrypt(messageData, nonce), + nonce: keepass.b64e(nonce), + clientID: keepass.clientID + }; - keepass.sendNativeMessage(request).then((response) => { - if (response.message && response.nonce) { - const res = keepass.decrypt(response.message, response.nonce); - if (res) { - const message = nacl.util.encodeUTF8(res); - const parsed = JSON.parse(message); - keepass.setcurrentKeePassXCVersion(parsed.version); + keepass.sendNativeMessage(request).then((response) => { + if (response.message && response.nonce) { + const res = keepass.decrypt(response.message, response.nonce); + if (res) { + const message = nacl.util.encodeUTF8(res); + const parsed = JSON.parse(message); + keepass.setcurrentKeePassXCVersion(parsed.version); - if (keepass.verifyResponse(parsed, response.nonce)) { - keepass.isDatabaseClosed = true; - keepass.handleError(tab, kpErrors.DATABASE_NOT_OPENED); - callback(false); + if (keepass.verifyResponse(parsed, response.nonce)) { + keepass.isDatabaseClosed = true; + keepass.handleError(tab, kpErrors.DATABASE_NOT_OPENED); + resolve(false); + } } } - } - else if (response.error && response.errorCode) { - keepass.handleError(tab, response.errorCode, response.error); - } - callback(false); + else if (response.error && response.errorCode) { + keepass.isDatabaseClosed = true; + keepass.handleError(tab, response.errorCode, response.error); + } + resolve(false); + }); }); };