From 4eb5eb39e9b3993e72c9baa62411614aa42df720 Mon Sep 17 00:00:00 2001 From: Antelle Date: Sun, 14 Feb 2016 14:20:21 +0300 Subject: [PATCH] option to remember keyfiles --- app/scripts/models/app-model.js | 34 +++++++++++++++++-- app/scripts/models/app-settings-model.js | 1 + app/scripts/models/file-info-model.js | 4 ++- app/scripts/models/file-model.js | 10 ++++++ app/scripts/util/locale.js | 2 ++ .../views/settings/settings-general-view.js | 10 ++++++ app/templates/settings/settings-general.hbs | 7 +++- bower.json | 2 +- release-notes.md | 1 + 9 files changed, 66 insertions(+), 5 deletions(-) diff --git a/app/scripts/models/app-model.js b/app/scripts/models/app-model.js index c50ebb05..da96663d 100644 --- a/app/scripts/models/app-model.js +++ b/app/scripts/models/app-model.js @@ -333,6 +333,10 @@ var AppModel = Backbone.Model.extend({ openFileWithData: function(params, callback, fileInfo, data, updateCacheOnSuccess) { var logger = new Logger('open', params.name); + if (!params.keyFileName && fileInfo.get('keyFileName') && this.settings.get('rememberKeyFiles')) { + params.keyFileName = fileInfo.get('keyFileName'); + params.keyFileData = FileModel.createKeyFileWithHash(fileInfo.get('keyFileHash')); + } var file = new FileModel({ name: params.name, storage: params.storage, @@ -386,6 +390,12 @@ var AppModel = Backbone.Model.extend({ syncDate: file.get('syncDate') || dt, openDate: dt }); + if (this.settings.get('rememberKeyFiles')) { + fileInfo.set({ + keyFileName: file.get('keyFileName') || null, + keyFileHash: file.getKeyFileHash() + }); + } this.fileInfos.remove(file.get('cacheId')); this.fileInfos.unshift(fileInfo); this.fileInfos.save(); @@ -412,6 +422,11 @@ var AppModel = Backbone.Model.extend({ this.fileInfos.save(); }, + getFileInfo: function(file) { + return file.get('cacheId') ? this.fileInfos.get(file.get('cacheId')) : + this.fileInfos.getMatch(file.get('storage'), file.get('name'), file.get('path')); + }, + syncFile: function(file, options, callback) { var that = this; if (file.get('demo')) { @@ -430,8 +445,7 @@ var AppModel = Backbone.Model.extend({ path = Storage[storage].getPathForName(file.get('name')); } logger.info('Sync started', storage, path, options); - var fileInfo = file.get('cacheId') ? this.fileInfos.get(file.get('cacheId')) : - this.fileInfos.getMatch(file.get('storage'), file.get('name'), file.get('path')); + var fileInfo = this.getFileInfo(file); if (!fileInfo) { logger.info('Create new file info'); var dt = new Date(); @@ -462,6 +476,12 @@ var AppModel = Backbone.Model.extend({ syncDate: file.get('syncDate'), cacheId: fileInfo.id }); + if (that.settings.get('rememberKeyFiles')) { + fileInfo.set({ + keyFileName: file.get('keyFileName') || null, + keyFileHash: file.getKeyFileHash() + }); + } if (!that.fileInfos.get(fileInfo.id)) { that.fileInfos.unshift(fileInfo); } @@ -599,6 +619,16 @@ var AppModel = Backbone.Model.extend({ } }); } + }, + + clearStoredKeyFiles: function() { + this.fileInfos.each(function(fileInfo) { + fileInfo.set({ + keyFileName: null, + keyFileHash: null + }); + }); + this.fileInfos.save(); } }); diff --git a/app/scripts/models/app-settings-model.js b/app/scripts/models/app-settings-model.js index c8a1045a..9cba9db03 100644 --- a/app/scripts/models/app-settings-model.js +++ b/app/scripts/models/app-settings-model.js @@ -13,6 +13,7 @@ var AppSettingsModel = Backbone.Model.extend({ autoUpdate: 'install', clipboardSeconds: 0, autoSave: true, + rememberKeyFiles: false, idleMinutes: 15, minimizeOnClose: false, tableView: false, diff --git a/app/scripts/models/file-info-model.js b/app/scripts/models/file-info-model.js index 9ef05483..758b7adf 100644 --- a/app/scripts/models/file-info-model.js +++ b/app/scripts/models/file-info-model.js @@ -12,7 +12,9 @@ var FileInfoModel = Backbone.Model.extend({ editState: null, rev: null, syncDate: null, - openDate: null + openDate: null, + keyFileName: null, + keyFileHash: null }, initialize: function(data, options) { diff --git a/app/scripts/models/file-model.js b/app/scripts/models/file-model.js index acb370ce..a709a28d 100644 --- a/app/scripts/models/file-model.js +++ b/app/scripts/models/file-model.js @@ -283,6 +283,11 @@ var FileModel = Backbone.Model.extend({ this.db.saveXml(cb); }, + getKeyFileHash: function() { + var hash = this.db.credentials.keyFileHash; + return hash ? kdbxweb.ByteUtils.bytesToBase64(hash.getBinary()) : null; + }, + setSyncProgress: function() { this.set({ syncing: true }); }, @@ -352,6 +357,7 @@ var FileModel = Backbone.Model.extend({ this.db.meta.keyChanged = this._oldKeyChangeDate; } this.set({ keyFileName: '', keyFileChanged: changed }); + this.setModified(); }, setName: function(name) { @@ -424,4 +430,8 @@ var FileModel = Backbone.Model.extend({ } }); +FileModel.createKeyFileWithHash = function(hash) { + return kdbxweb.Credentials.createKeyFileWithHash(hash); +}; + module.exports = FileModel; diff --git a/app/scripts/util/locale.js b/app/scripts/util/locale.js index d7dd69ce..2f95cacb 100644 --- a/app/scripts/util/locale.js +++ b/app/scripts/util/locale.js @@ -200,7 +200,9 @@ var Locale = { setGenShowSubgroups: 'Show entries from all subgroups', setGenTableView: 'Entries list table view', setGenColorfulIcons: 'Colorful custom icons in list', + setGenFunction: 'Function', setGenAutoSync: 'Automatically save and sync', + setGenRememberKeyFiles: 'Remember key files', setGenLockInactive: 'Auto-lock if the app is inactive', setGenNoAutoLock: 'Don\'t auto-lock', setGenLockMinutes: 'In {} minutes', diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index 846ea1cc..8ac75385 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -21,6 +21,7 @@ var SettingsGeneralView = Backbone.View.extend({ 'change .settings__general-idle-minutes': 'changeIdleMinutes', 'change .settings__general-clipboard': 'changeClipboard', 'change .settings__general-auto-save': 'changeAutoSave', + 'change .settings__general-remember-key-files': 'changeRememberKeyFiles', 'change .settings__general-minimize': 'changeMinimize', 'change .settings__general-lock-on-minimize': 'changeLockOnMinimize', 'change .settings__general-table-view': 'changeTableView', @@ -53,6 +54,7 @@ var SettingsGeneralView = Backbone.View.extend({ expandGroups: AppSettingsModel.instance.get('expandGroups'), canClearClipboard: !!Launcher, clipboardSeconds: AppSettingsModel.instance.get('clipboardSeconds'), + rememberKeyFiles: AppSettingsModel.instance.get('rememberKeyFiles'), autoSave: AppSettingsModel.instance.get('autoSave'), idleMinutes: AppSettingsModel.instance.get('idleMinutes'), minimizeOnClose: AppSettingsModel.instance.get('minimizeOnClose'), @@ -144,6 +146,14 @@ var SettingsGeneralView = Backbone.View.extend({ AppSettingsModel.instance.set('autoSave', autoSave); }, + changeRememberKeyFiles: function(e) { + var rememberKeyFiles = e.target.checked || false; + AppSettingsModel.instance.set('rememberKeyFiles', rememberKeyFiles); + if (!rememberKeyFiles) { + this.appModel.clearStoredKeyFiles(); + } + }, + changeMinimize: function(e) { var minimizeOnClose = e.target.checked || false; AppSettingsModel.instance.set('minimizeOnClose', minimizeOnClose); diff --git a/app/templates/settings/settings-general.hbs b/app/templates/settings/settings-general.hbs index dad03a9d..d3d50ea6 100644 --- a/app/templates/settings/settings-general.hbs +++ b/app/templates/settings/settings-general.hbs @@ -60,12 +60,17 @@ -

Function

+

{{res 'setGenFunction'}}

+
+ + +