Switched localStorage to browser.local.storage

This commit is contained in:
varjolintu 2017-10-30 11:19:26 +02:00
parent c40fdb3bbd
commit 7139fa0077
7 changed files with 158 additions and 125 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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