From ac4a57b36da06506d52b8e87bb49e462da66d24e Mon Sep 17 00:00:00 2001 From: varjolintu Date: Fri, 29 Sep 2017 11:23:33 +0300 Subject: [PATCH] Added timeout handling and modified the isFirefox() to a function --- CHANGELOG | 6 ++- keepassxc-browser/background/init.js | 2 +- keepassxc-browser/background/keepass.js | 56 +++++++++++++++---------- keepassxc-browser/global.js | 10 +++-- keepassxc-browser/keepassxc-browser.js | 2 +- keepassxc-browser/manifest.json | 2 +- keepassxc-browser/options/options.js | 2 +- 7 files changed, 49 insertions(+), 31 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7ed60a0..6b5742a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.3.1 (2017-09-29) +========================= +- Added timeout handling for postMessage(). Allows proxy application to be reloaded. + 0.3.0 (2017-09-18) ========================= - Added Mozilla's browser-polyfill for making WebExtension compatibility easier @@ -117,13 +121,11 @@ 0.1.1 (2017-04-28) ========================= - - This version works with the KeePassXC fork - Upgraded JavaScripts to work asynchronously 0.1.0 (2017-04-12) ========================= - - Replaced crypto libraries with tweetnacl-js - New application and popup icons - Upgraded bootstrap to version 3.3.7 diff --git a/keepassxc-browser/background/init.js b/keepassxc-browser/background/init.js index a4b1a4e..72b4b9d 100644 --- a/keepassxc-browser/background/init.js +++ b/keepassxc-browser/background/init.js @@ -77,7 +77,7 @@ if (browser.webRequest.onAuthRequired) { let reqType = 'blocking'; let opts = { urls: [''] }; - if (!isFirefox) { + if (!isFirefox()) { handleReq = httpAuth.handleRequestCallback; reqType = 'asyncBlocking'; } diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 8ee12ed..4deb641 100644 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -20,6 +20,7 @@ keepass.databaseHash = 'no-hash'; //no-hash = KeePassXC is too old and does not keepass.keyRing = (typeof(localStorage.keyRing) === 'undefined') ? {} : JSON.parse(localStorage.keyRing); keepass.keyId = 'keepassxc-browser-cryptokey-name'; keepass.keyBody = 'keepassxc-browser-key'; +keepass.messageTimeout = 1000; // milliseconds const kpActions = { SET_LOGIN: 'set-login', @@ -106,7 +107,7 @@ keepass.updateCredentials = function(callback, tab, entryId, username, password, }; console.log(request); - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -116,7 +117,7 @@ keepass.updateCredentials = function(callback, tab, entryId, username, password, } } else if (response.error && response.errorCode) { - keepass.handleError(tab.id, response.error, response.errorCode); + keepass.handleError(tab, response.error, response.errorCode); } else { browserAction.showDefault(null, tab); @@ -126,7 +127,7 @@ keepass.updateCredentials = function(callback, tab, entryId, username, password, }); }; -keepass.retrieveCredentials = function (callback, tab, url, submiturl, forceCallback, triggerUnlock) { +keepass.retrieveCredentials = function(callback, tab, url, submiturl, forceCallback, triggerUnlock) { page.debug('keepass.retrieveCredentials(callback, {1}, {2}, {3}, {4})', tab.id, url, submiturl, forceCallback); keepass.testAssociation((response) => { @@ -168,7 +169,7 @@ keepass.retrieveCredentials = function (callback, tab, url, submiturl, forceCall clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -192,7 +193,7 @@ keepass.retrieveCredentials = function (callback, tab, url, submiturl, forceCall } } else if (response.error && response.errorCode) { - keepass.handleError(tab.id, response.error, response.errorCode); + keepass.handleError(tab, response.error, response.errorCode); } else { browserAction.showDefault(null, tab); @@ -203,20 +204,33 @@ keepass.retrieveCredentials = function (callback, tab, url, submiturl, forceCall }; // Redirects the callback to a listener (handleReply()) -keepass.callbackOnId = function (ev, id, callback) { - let listener = ((port, id) => { +keepass.callbackOnId = function(ev, action, tab, callback) { + let listener = ((port, action) => { let handler = (msg) => { - if (msg && msg.action === id) { + if (msg && msg.action === action) { ev.removeListener(handler); + clearTimeout(timeout); callback(msg); } }; return handler; - })(ev, id, callback); + })(ev, action, tab, callback); ev.addListener(listener); + + // Handle timeouts + let timeout = setTimeout(() => { + const errorMessage = { + action: action, + error: kpErrors.getError(5), + errorCode: 5 + }; + keepass.isKeePassXCAvailable = false; + callback(errorMessage); + ev.removeListener(listener.handler); + }, keepass.messageTimeout); }; -keepass.generatePassword = function (callback, tab, forceCallback) { +keepass.generatePassword = function(callback, tab, forceCallback) { if (!keepass.isConnected) { callback([]); return; @@ -247,7 +261,7 @@ keepass.generatePassword = function (callback, tab, forceCallback) { clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -271,7 +285,7 @@ keepass.generatePassword = function (callback, tab, forceCallback) { } } else if (response.error && response.errorCode) { - keepass.handleError(tab.id, response.error, response.errorCode); + keepass.handleError(tab, response.error, response.errorCode); } }); keepass.nativePort.postMessage(request); @@ -308,7 +322,7 @@ keepass.associate = function(callback, tab) { clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -330,14 +344,14 @@ keepass.associate = function(callback, tab) { } } else if (response.error && response.errorCode) { - keepass.handleError(tab.id, response.error, response.errorCode); + keepass.handleError(tab, response.error, response.errorCode); } }); keepass.nativePort.postMessage(request); }, tab); }; -keepass.testAssociation = function (callback, tab, triggerUnlock) { +keepass.testAssociation = function(callback, tab, triggerUnlock) { if (tab && page.tabs[tab.id]) { page.tabs[tab.id].errorMessage = null; } @@ -391,7 +405,7 @@ keepass.testAssociation = function (callback, tab, triggerUnlock) { clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -419,7 +433,7 @@ keepass.testAssociation = function (callback, tab, triggerUnlock) { } } else if (response.error && response.errorCode) { - keepass.handleError(tab.id, response.error, response.errorCode); + keepass.handleError(tab, response.error, response.errorCode); } callback(keepass.isAssociated()); }); @@ -427,7 +441,7 @@ keepass.testAssociation = function (callback, tab, triggerUnlock) { }, tab, triggerUnlock); }; -keepass.getDatabaseHash = function (callback, tab, triggerUnlock) { +keepass.getDatabaseHash = function(callback, tab, triggerUnlock) { if (!keepass.isConnected) { keepass.handleError(tab, kpErrors.TIMEOUT_OR_NOT_CONNECTED); callback([]); @@ -459,7 +473,7 @@ keepass.getDatabaseHash = function (callback, tab, triggerUnlock) { clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { if (response.message && response.nonce) { const res = keepass.decrypt(response.message, response.nonce); if (res) { @@ -518,7 +532,7 @@ keepass.changePublicKeys = function(tab, callback) { clientID: keepass.clientID }; - keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, (response) => { + keepass.callbackOnId(keepass.nativePort.onMessage, kpAction, tab, (response) => { keepass.setcurrentKeePassXCVersion(response.version); if (!keepass.verifyKeyResponse(response, key, nonce)) { @@ -664,7 +678,7 @@ keepass.connectToNative = function() { } }; -keepass.onNativeMessage = function (response) { +keepass.onNativeMessage = function(response) { //console.log('Received message: ' + JSON.stringify(response)); }; diff --git a/keepassxc-browser/global.js b/keepassxc-browser/global.js index c6b5df2..9833a33 100644 --- a/keepassxc-browser/global.js +++ b/keepassxc-browser/global.js @@ -1,4 +1,6 @@ -var isFirefox = false; -if (!(/Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor))) { - isFirefox = true; -} \ No newline at end of file +var isFirefox = function() { + if (!(/Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor))) { + return true; + } + return false; +}; diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js index 5d57b75..52a5338 100644 --- a/keepassxc-browser/keepassxc-browser.js +++ b/keepassxc-browser/keepassxc-browser.js @@ -316,7 +316,7 @@ cipPassword.createDialog = function() { }; cipPassword.createIcon = function(field) { - const $className = (isFirefox ? 'key-moz' : 'key'); + const $className = (isFirefox() ? 'key-moz' : 'key'); const $size = (field.outerHeight() > 28) ? 24 : 16; let $offset = Math.floor((field.outerHeight() - $size) / 3); $offset = ($offset < 0) ? 0 : $offset; diff --git a/keepassxc-browser/manifest.json b/keepassxc-browser/manifest.json index 12882b8..7973a95 100644 --- a/keepassxc-browser/manifest.json +++ b/keepassxc-browser/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "keepassxc-browser", - "version": "0.3.0", + "version": "0.3.1", "description": "KeePassXC integration for modern web browsers", "author": "Sami Vänttinen", "icons": { diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index 384b821..446ccb2 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -253,7 +253,7 @@ options.initSpecifiedCredentialFields = function() { options.initAbout = function() { $('#tab-about em.versionCIP').text(browser.runtime.getManifest().version); - if (isFirefox) { + if (isFirefox()) { $('#chrome-only').remove(); } };