From 7139fa0077971adf6a6eb42097e46dd532693025 Mon Sep 17 00:00:00 2001 From: varjolintu Date: Mon, 30 Oct 2017 11:19:26 +0200 Subject: [PATCH] Switched localStorage to browser.local.storage --- keepassxc-browser/background/browserAction.js | 2 +- keepassxc-browser/background/event.js | 53 ++++++----- keepassxc-browser/background/init.js | 18 ++-- keepassxc-browser/background/keepass.js | 88 +++++++++++-------- keepassxc-browser/background/page.js | 78 ++++++++-------- keepassxc-browser/keepassxc-browser.js | 12 +-- keepassxc-browser/options/options.js | 32 +++---- 7 files changed, 158 insertions(+), 125 deletions(-) diff --git a/keepassxc-browser/background/browserAction.js b/keepassxc-browser/background/browserAction.js index 3a67a12..34547a5 100644 --- a/keepassxc-browser/background/browserAction.js +++ b/keepassxc-browser/background/browserAction.js @@ -70,7 +70,7 @@ browserAction.showDefault = function(callback, tab) { iconType: 'normal', popup: 'popup.html' }; - keepass.isConfigured((response) => { + keepass.isConfigured().then((response) => { if (!response || keepass.isDatabaseClosed || !keepass.isKeePassXCAvailable || page.tabs[tab.id].errorMessage) { stackData.iconType = 'cross'; } diff --git a/keepassxc-browser/background/event.js b/keepassxc-browser/background/event.js index 2b0a440..d4af4e4 100644 --- a/keepassxc-browser/background/event.js +++ b/keepassxc-browser/background/event.js @@ -100,32 +100,37 @@ kpxcEvent.showStatus = function(configured, tab, callback) { }; kpxcEvent.onLoadSettings = function(callback, tab) { - page.settings = (typeof(localStorage.settings) === 'undefined') ? {} : JSON.parse(localStorage.settings); + browser.storage.local.get({'settings': {}}).then((item) => { + callback(item.settings); + }, (err) => { + console.log('error loading settings: ' + err); + }); }; kpxcEvent.onLoadKeyRing = function(callback, tab) { - keepass.keyRing = (typeof(localStorage.keyRing) === 'undefined') ? {} : JSON.parse(localStorage.keyRing); - if (keepass.isAssociated() && !keepass.keyRing[keepass.associated.hash]) { - keepass.associated = { - value: false, - hash: null - }; - } -}; - -kpxcEvent.onGetSettings = function(callback, tab) { - kpxcEvent.onLoadSettings(); - callback({ data: page.settings }); + browser.storage.local.get({'keyRing': {}}).then(function(item) { + keepass.keyRing = item.keyRing; + if (keepass.isAssociated() && !keepass.keyRing[keepass.associated.hash]) { + keepass.associated = { + "value": false, + "hash": null + }; + } + callback(item.keyRing); + }, (err) => { + console.log('error loading keyRing: ' + err); + }); }; kpxcEvent.onSaveSettings = function(callback, tab, settings) { - localStorage.settings = JSON.stringify(settings); - kpxcEvent.onLoadSettings(); + browser.storage.local.set({'settings': settings}).then(function() { + kpxcEvent.onLoadSettings(); + }); }; kpxcEvent.onGetStatus = function(callback, tab) { keepass.testAssociation((response) => { - keepass.isConfigured((configured) => { + keepass.isConfigured().then((configured) => { kpxcEvent.showStatus(configured, tab, callback); }); }, tab, true); @@ -141,7 +146,7 @@ kpxcEvent.onReconnect = function(callback, tab) { keepass.getDatabaseHash((gdRes) => { if (gdRes) { keepass.testAssociation((response) => { - keepass.isConfigured((configured) => { + keepass.isConfigured().then((configured) => { kpxcEvent.showStatus(configured, tab, callback); }); }, tab); @@ -175,12 +180,13 @@ kpxcEvent.onGetConnectedDatabase = function(callback, tab) { }; kpxcEvent.onGetKeePassXCVersions = function(callback, tab) { - if (keepass.currentKeePassXC.version === 0) { - keepass.getDatabaseHash((response) => { - callback({current: keepass.currentKeePassXC.version, latest: keepass.latestKeePassXC.version}); - }, tab); - } - callback({current: keepass.currentKeePassXC.version, latest: keepass.latestKeePassXC.version}); + if(keepass.currentKeePassXC.version == 0) { + keepass.getDatabaseHash(tab).then(() => { + callback({"current": keepass.currentKeePassXC.version, "latest": keepass.currentKeePassXC.version}); + }); + } else { + callback({"current": keepass.currentKeePassXC.version, "latest": keepass.currentKeePassXC.version}); +} }; kpxcEvent.onCheckUpdateKeePassXC = function(callback, tab) { @@ -254,7 +260,6 @@ kpxcEvent.messageHandlers = { 'check_update_keepassxc': kpxcEvent.onCheckUpdateKeePassXC, 'get_connected_database': kpxcEvent.onGetConnectedDatabase, 'get_keepassxc_versions': kpxcEvent.onGetKeePassXCVersions, - 'get_settings': kpxcEvent.onGetSettings, 'get_status': kpxcEvent.onGetStatus, 'get_tab_information': kpxcEvent.onGetTabInformation, 'load_keyring': kpxcEvent.onLoadKeyRing, diff --git a/keepassxc-browser/background/init.js b/keepassxc-browser/background/init.js index 6bc33c1..fa369a9 100644 --- a/keepassxc-browser/background/init.js +++ b/keepassxc-browser/background/init.js @@ -1,13 +1,15 @@ -keepass.convertKeyToKeyRing(); -page.initSettings(); -page.initOpenedTabs(); -keepass.connectToNative(); -keepass.generateNewKeyPair(); -keepass.changePublicKeys(null, (pkRes) => { - keepass.getDatabaseHash((gdRes) => {}, null); +keepass.migrateKeyRing().then(() => { + page.initSettings().then(() => { + page.initOpenedTabs().then(() => { + keepass.connectToNative(); + keepass.generateNewKeyPair(); + keepass.changePublicKeys(null, (pkRes) => { + keepass.getDatabaseHash((gdRes) => {}, null); + }); + }); + }); }); - // Milliseconds for intervall (e.g. to update browserAction) let _interval = 250; diff --git a/keepassxc-browser/background/keepass.js b/keepassxc-browser/background/keepass.js index 39be7cb..5b80f13 100644 --- a/keepassxc-browser/background/keepass.js +++ b/keepassxc-browser/background/keepass.js @@ -11,7 +11,6 @@ keepass.isDatabaseClosed = false; keepass.isKeePassXCAvailable = false; keepass.isEncryptionKeyUnrecognized = false; keepass.currentKeePassXC = {'version': 0, 'versionParsed': 0}; -keepass.latestKeePassXC = (typeof(localStorage.latestKeePassXC) === 'undefined') ? {'version': 0, 'versionParsed': 0, 'lastChecked': null} : JSON.parse(localStorage.latestKeePassXC); keepass.requiredKeePassXC = 220; keepass.nativeHostName = 'com.varjolintu.keepassxc_browser'; keepass.nativePort = null; @@ -77,6 +76,13 @@ const kpErrors = { } }; +browser.storage.local.get({ + 'latestKeePassXC': {'version': 0, 'versionParsed': 0, 'lastChecked': null}, + 'keyRing': {}}).then((item) => { + keepass.latestKeePassXC = item.latestKeePassXC; + keepass.keyRing = item.keyRing; +}); + keepass.addCredentials = function(callback, tab, username, password, url) { keepass.updateCredentials(callback, tab, null, username, password, url); }; @@ -621,15 +627,16 @@ keepass.generateNewKeyPair = function() { //console.log(keepass.b64e(keepass.keyPair.publicKey) + ' ' + keepass.b64e(keepass.keyPair.secretKey)); }; -keepass.isConfigured = function(callback) { - if (typeof(keepass.databaseHash) === 'undefined') { - keepass.getDatabaseHash((dbHash) => { - callback(keepass.databaseHash in keepass.keyRing); - }, null); - } - else { - callback(keepass.databaseHash in keepass.keyRing); - } +keepass.isConfigured = function() { + return new Promise((resolve, reject) => { + if (typeof(keepass.databaseHash) === 'undefined') { + keepass.getDatabaseHash().then((hash) => { + resolve(hash in keepass.keyRing); + }); + } else { + resolve(keepass.databaseHash in keepass.keyRing); + } + }); }; keepass.checkDatabaseHash = function(callback, tab) { @@ -640,22 +647,33 @@ keepass.isAssociated = function() { return (keepass.associated.value && keepass.associated.hash && keepass.associated.hash === keepass.databaseHash); }; -keepass.convertKeyToKeyRing = function() { - if (keepass.keyId in localStorage && keepass.keyBody in localStorage && !('keyRing' in localStorage)) { - keepass.getDatabaseHash((hash) => { - keepass.saveKey(hash, localStorage[keepass.keyId], localStorage[keepass.keyBody]); - - if ('keyRing' in localStorage) { - delete localStorage[keepass.keyId]; - delete localStorage[keepass.keyBody]; +keepass.migrateKeyRing = function() { + return new Promise((resolve, reject) => { + browser.storage.local.get('keyRing').then((item) => { + const keyring = item.keyRing; + // change dates to numbers, for compatibilty with chrome + if (keyring) { + let num = 0; + for (let keyHash in keyring) { + let key = keyring[keyHash]; + ['created', 'lastUsed'].forEach((fld) => { + let v = key[fld]; + if (v instanceof Date && v.valueOf() >= 0) { + key[fld] = v.valueOf(); + num++; + } else if (typeof v !== 'number') { + key[fld] = Date.now().valueOf(); + num++; + } + }); + } + if (num > 0) { + browser.storage.local.set({ keyRing: keyring }); + } } - }, null); - } - - if ('keyRing' in localStorage) { - delete localStorage[keepass.keyId]; - delete localStorage[keepass.keyBody]; - } + resolve(); + }); + }); }; keepass.saveKey = function(hash, id, key) { @@ -664,8 +682,8 @@ keepass.saveKey = function(hash, id, key) { id: id, key: key, hash: hash, - created: new Date(), - lastUsed: new Date() + created: new Date().valueOf(), + lastUsed: new Date().valueOf() }; } else { @@ -673,19 +691,19 @@ keepass.saveKey = function(hash, id, key) { keepass.keyRing[hash].key = key; keepass.keyRing[hash].hash = hash; } - localStorage.keyRing = JSON.stringify(keepass.keyRing); + browser.storage.local.set({'keyRing': keepass.keyRing}); }; keepass.updateLastUsed = function(hash) { if ((hash in keepass.keyRing)) { - keepass.keyRing[hash].lastUsed = new Date(); - localStorage.keyRing = JSON.stringify(keepass.keyRing); + keepass.keyRing[hash].lastUsed = new Date().valueOf(); + browser.storage.local.set({'keyRing': keepass.keyRing}); } }; keepass.deleteKey = function(hash) { delete keepass.keyRing[hash]; - localStorage.keyRing = JSON.stringify(keepass.keyRing); + browser.storage.local.set({'keyRing': keepass.keyRing}); }; keepass.setcurrentKeePassXCVersion = function(version) { @@ -699,7 +717,7 @@ keepass.setcurrentKeePassXCVersion = function(version) { keepass.keePassXCUpdateAvailable = function() { if (page.settings.checkUpdateKeePassXC && page.settings.checkUpdateKeePassXC > 0) { - const lastChecked = (keepass.latestKeePassXC.lastChecked) ? new Date(keepass.latestKeePassXC.lastChecked) : new Date('11/21/1986'); + const lastChecked = (keepass.latestKeePassXC.lastChecked) ? new Date(keepass.latestKeePassXC.lastChecked) : new Date(1986, 11, 21); const daysSinceLastCheck = Math.floor(((new Date()).getTime()-lastChecked.getTime())/86400000); if (daysSinceLastCheck >= page.settings.checkUpdateKeePassXC) { keepass.checkForNewKeePassXCVersion(); @@ -724,7 +742,7 @@ keepass.checkForNewKeePassXCVersion = function() { } if (version !== -1) { - localStorage.latestKeePassXC = JSON.stringify(keepass.latestKeePassXC); + browser.storage.local.set({'latestKeePassXC': keepass.latestKeePassXC}); } }; @@ -739,7 +757,7 @@ keepass.checkForNewKeePassXCVersion = function() { catch (ex) { console.log(ex); } - keepass.latestKeePassXC.lastChecked = new Date(); + keepass.latestKeePassXC.lastChecked = new Date().valueOf(); }; keepass.connectToNative = function() { @@ -749,7 +767,7 @@ keepass.connectToNative = function() { }; keepass.onNativeMessage = function(response) { - //console.log('Received message: ' + JSON.stringify(response)); + console.log('Received message: ' + JSON.stringify(response)); // Handle database lock/unlock status if (response.action === kpActions.DATABASE_LOCKED || response.action === kpActions.DATABASE_UNLOCKED) { diff --git a/keepassxc-browser/background/page.js b/keepassxc-browser/background/page.js index d6ee9fc..8e868d3 100644 --- a/keepassxc-browser/background/page.js +++ b/keepassxc-browser/background/page.js @@ -10,50 +10,56 @@ const defaultSettings = { var page = {}; page.tabs = {}; - page.currentTabId = -1; -page.settings = (typeof(localStorage.settings) === 'undefined') ? {} : JSON.parse(localStorage.settings); page.blockedTabs = {}; page.initSettings = function() { - kpxcEvent.onLoadSettings(); - if (!('checkUpdateKeePassXC' in page.settings)) { - page.settings.checkUpdateKeePassXC = defaultSettings.checkUpdateKeePassXC; - } - if (!('autoCompleteUsernames' in page.settings)) { - page.settings.autoCompleteUsernames = defaultSettings.autoCompleteUsernames; - } - if (!('autoFillAndSend' in page.settings)) { - page.settings.autoFillAndSend = defaultSettings.autoFillAndSend; - } - if (!('usePasswordGenerator' in page.settings)) { - page.settings.usePasswordGenerator = defaultSettings.usePasswordGenerator; - } - if (!('autoFillSingleEntry' in page.settings)) { - page.settings.autoFillSingleEntry = defaultSettings.autoFillSingleEntry; - } - if (!('autoRetrieveCredentials' in page.settings)) { - page.settings.autoRetrieveCredentials = defaultSettings.autoRetrieveCredentials; - } - if (!('port' in page.settings)) { - page.settings.port = defaultSettings.proxyPort; - } - localStorage.settings = JSON.stringify(page.settings); + return new Promise((resolve, reject) => { + kpxcEvent.onLoadSettings((settings) => { + page.settings = settings; + if (!('checkUpdateKeePassXC' in page.settings)) { + page.settings.checkUpdateKeePassXC = defaultSettings.checkUpdateKeePassXC; + } + if (!('autoCompleteUsernames' in page.settings)) { + page.settings.autoCompleteUsernames = defaultSettings.autoCompleteUsernames; + } + if (!('autoFillAndSend' in page.settings)) { + page.settings.autoFillAndSend = defaultSettings.autoFillAndSend; + } + if (!('usePasswordGenerator' in page.settings)) { + page.settings.usePasswordGenerator = defaultSettings.usePasswordGenerator; + } + if (!('autoFillSingleEntry' in page.settings)) { + page.settings.autoFillSingleEntry = defaultSettings.autoFillSingleEntry; + } + if (!('autoRetrieveCredentials' in page.settings)) { + page.settings.autoRetrieveCredentials = defaultSettings.autoRetrieveCredentials; + } + if (!('port' in page.settings)) { + page.settings.port = defaultSettings.proxyPort; + } + browser.storage.local.set({'settings': page.settings}); + resolve(); + }); + }); }; page.initOpenedTabs = function() { - browser.tabs.query({}).then((tabs) => { - for (const i of tabs) { - page.createTabEntry(i.id); - } - - // set initial tab-ID - browser.tabs.query({ "active": true, "currentWindow": true }).then((tabs) => { - if (tabs.length === 0) { - return; // For example: only the background devtools or a popup are opened + return new Promise((resolve, reject) => { + browser.tabs.query({}).then((tabs) => { + for (const i of tabs) { + page.createTabEntry(i.id); } - page.currentTabId = tabs[0].id; - browserAction.show(null, tabs[0]); + + // set initial tab-ID + browser.tabs.query({ "active": true, "currentWindow": true }).then((tabs) => { + if (tabs.length === 0) { + return; // For example: only the background devtools or a popup are opened + } + page.currentTabId = tabs[0].id; + browserAction.show(null, tabs[0]); + resolve(); + }); }); }); }; diff --git a/keepassxc-browser/keepassxc-browser.js b/keepassxc-browser/keepassxc-browser.js index af6ecbc..41962ac 100644 --- a/keepassxc-browser/keepassxc-browser.js +++ b/keepassxc-browser/keepassxc-browser.js @@ -54,7 +54,7 @@ browser.runtime.onMessage.addListener(function(req, sender, callback) { } else if (req.action === 'redetect_fields') { browser.runtime.sendMessage({ - action: 'get_settings', + action: 'load_settings', }).then((response) => { cip.settings = response.data; cip.initCredentialFields(true); @@ -1109,9 +1109,9 @@ jQuery(function() { cip.init = function() { browser.runtime.sendMessage({ - action: 'get_settings', + action: 'load_settings', }).then((response) => { - cip.settings = response.data; + cip.settings = response; cip.initCredentialFields(); }); }; @@ -1134,7 +1134,7 @@ cip.detectNewActiveFields = function() { // Try to do this in a way that database value if checked without polling the KeePassXC.. too many messages jumping around // Switch credentials if database is changed or closed cip.detectDatabaseChange = function() { - const dbDetectInterval = setInterval(function() { + let dbDetectInterval = setInterval(function() { if (document.visibilityState !== 'hidden') { browser.runtime.sendMessage({ action: 'check_databasehash' @@ -1153,9 +1153,9 @@ cip.detectDatabaseChange = function() { } else { if (response.new !== 'no-hash' && response.new !== response.old) { browser.runtime.sendMessage({ - action: 'get_settings', + action: 'load_settings', }).then((response) => { - cip.settings = response.data; + cip.settings = response; cip.initCredentialFields(true); }); } diff --git a/keepassxc-browser/options/options.js b/keepassxc-browser/options/options.js index 446ccb2..6328a29 100644 --- a/keepassxc-browser/options/options.js +++ b/keepassxc-browser/options/options.js @@ -3,18 +3,21 @@ if (jQuery) { } $(function() { - options.initMenu(); - options.initGeneralSettings(); - options.initConnectedDatabases(); - options.initSpecifiedCredentialFields(); - options.initAbout(); + browser.runtime.sendMessage({ action: 'load_settings' }).then((settings) => { + options.settings = settings; + browser.runtime.sendMessage({ action: 'load_keyring' }).then((keyRing) => { + options.keyRing = keyRing; + options.initMenu(); + options.initGeneralSettings(); + options.initConnectedDatabases(); + options.initSpecifiedCredentialFields(); + options.initAbout(); + }); + }); }); var options = options || {}; -options.settings = typeof(localStorage.settings) === 'undefined' ? {} : JSON.parse(localStorage.settings); -options.keyRing = typeof(localStorage.keyRing) === 'undefined' ? {} : JSON.parse(localStorage.keyRing); - options.initMenu = function() { $('.navbar:first ul.nav:first li a').click(function(e) { e.preventDefault(); @@ -32,22 +35,21 @@ options.saveSetting = function(name) { $($id).closest('.control-group').removeClass('error').addClass('success'); setTimeout(() => { $($id).closest('.control-group').removeClass('success'); }, 2500); - localStorage.settings = JSON.stringify(options.settings); - + browser.storage.local.set({'settings': options.settings}); browser.runtime.sendMessage({ action: 'load_settings' }); }; options.saveSettings = function() { - localStorage.settings = JSON.stringify(options.settings); + browser.storage.local.set({'settings': options.settings}); browser.runtime.sendMessage({ action: 'load_settings' }); }; options.saveKeyRing = function() { - localStorage.keyRing = JSON.stringify(options.keyRing); + browser.storage.local.set({'keyRing': options.keyRing}); browser.runtime.sendMessage({ action: 'load_keyring' }); @@ -107,7 +109,7 @@ options.initGeneralSettings = function() { $('#blinkTimeoutButton').click(function(){ const blinkTimeout = $.trim($('#blinkTimeout').val()); const blinkTimeoutval = Number(blinkTimeout); - + options.settings['blinkTimeout'] = String(blinkTimeoutval); options.saveSetting('blinkTimeout'); }); @@ -115,7 +117,7 @@ options.initGeneralSettings = function() { $('#blinkMinTimeoutButton').click(function(){ const blinkMinTimeout = $.trim($('#blinkMinTimeout').val()); const blinkMinTimeoutval = Number(blinkMinTimeout); - + options.settings['blinkMinTimeout'] = String(blinkMinTimeoutval); options.saveSetting('blinkMinTimeout'); }); @@ -123,7 +125,7 @@ options.initGeneralSettings = function() { $('#allowedRedirectButton').click(function(){ const allowedRedirect = $.trim($('#allowedRedirect').val()); const allowedRedirectval = Number(allowedRedirect); - + options.settings['allowedRedirect'] = String(allowedRedirectval); options.saveSetting('allowedRedirect'); });