Added timeout handling and modified the isFirefox() to a function

This commit is contained in:
varjolintu 2017-09-29 11:23:33 +03:00
parent d7a8762f34
commit ac4a57b36d
7 changed files with 49 additions and 31 deletions

View file

@ -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

View file

@ -77,7 +77,7 @@ if (browser.webRequest.onAuthRequired) {
let reqType = 'blocking';
let opts = { urls: ['<all_urls>'] };
if (!isFirefox) {
if (!isFirefox()) {
handleReq = httpAuth.handleRequestCallback;
reqType = 'asyncBlocking';
}

View file

@ -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));
};

View file

@ -1,4 +1,6 @@
var isFirefox = false;
if (!(/Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor))) {
isFirefox = true;
}
var isFirefox = function() {
if (!(/Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor))) {
return true;
}
return false;
};

View file

@ -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;

View file

@ -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": {

View file

@ -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();
}
};