option to remember keyfiles

This commit is contained in:
Antelle 2016-02-14 14:20:21 +03:00
parent c65b7f7331
commit 4eb5eb39e9
9 changed files with 66 additions and 5 deletions

View File

@ -333,6 +333,10 @@ var AppModel = Backbone.Model.extend({
openFileWithData: function(params, callback, fileInfo, data, updateCacheOnSuccess) { openFileWithData: function(params, callback, fileInfo, data, updateCacheOnSuccess) {
var logger = new Logger('open', params.name); 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({ var file = new FileModel({
name: params.name, name: params.name,
storage: params.storage, storage: params.storage,
@ -386,6 +390,12 @@ var AppModel = Backbone.Model.extend({
syncDate: file.get('syncDate') || dt, syncDate: file.get('syncDate') || dt,
openDate: 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.remove(file.get('cacheId'));
this.fileInfos.unshift(fileInfo); this.fileInfos.unshift(fileInfo);
this.fileInfos.save(); this.fileInfos.save();
@ -412,6 +422,11 @@ var AppModel = Backbone.Model.extend({
this.fileInfos.save(); 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) { syncFile: function(file, options, callback) {
var that = this; var that = this;
if (file.get('demo')) { if (file.get('demo')) {
@ -430,8 +445,7 @@ var AppModel = Backbone.Model.extend({
path = Storage[storage].getPathForName(file.get('name')); path = Storage[storage].getPathForName(file.get('name'));
} }
logger.info('Sync started', storage, path, options); logger.info('Sync started', storage, path, options);
var fileInfo = file.get('cacheId') ? this.fileInfos.get(file.get('cacheId')) : var fileInfo = this.getFileInfo(file);
this.fileInfos.getMatch(file.get('storage'), file.get('name'), file.get('path'));
if (!fileInfo) { if (!fileInfo) {
logger.info('Create new file info'); logger.info('Create new file info');
var dt = new Date(); var dt = new Date();
@ -462,6 +476,12 @@ var AppModel = Backbone.Model.extend({
syncDate: file.get('syncDate'), syncDate: file.get('syncDate'),
cacheId: fileInfo.id cacheId: fileInfo.id
}); });
if (that.settings.get('rememberKeyFiles')) {
fileInfo.set({
keyFileName: file.get('keyFileName') || null,
keyFileHash: file.getKeyFileHash()
});
}
if (!that.fileInfos.get(fileInfo.id)) { if (!that.fileInfos.get(fileInfo.id)) {
that.fileInfos.unshift(fileInfo); 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();
} }
}); });

View File

@ -13,6 +13,7 @@ var AppSettingsModel = Backbone.Model.extend({
autoUpdate: 'install', autoUpdate: 'install',
clipboardSeconds: 0, clipboardSeconds: 0,
autoSave: true, autoSave: true,
rememberKeyFiles: false,
idleMinutes: 15, idleMinutes: 15,
minimizeOnClose: false, minimizeOnClose: false,
tableView: false, tableView: false,

View File

@ -12,7 +12,9 @@ var FileInfoModel = Backbone.Model.extend({
editState: null, editState: null,
rev: null, rev: null,
syncDate: null, syncDate: null,
openDate: null openDate: null,
keyFileName: null,
keyFileHash: null
}, },
initialize: function(data, options) { initialize: function(data, options) {

View File

@ -283,6 +283,11 @@ var FileModel = Backbone.Model.extend({
this.db.saveXml(cb); this.db.saveXml(cb);
}, },
getKeyFileHash: function() {
var hash = this.db.credentials.keyFileHash;
return hash ? kdbxweb.ByteUtils.bytesToBase64(hash.getBinary()) : null;
},
setSyncProgress: function() { setSyncProgress: function() {
this.set({ syncing: true }); this.set({ syncing: true });
}, },
@ -352,6 +357,7 @@ var FileModel = Backbone.Model.extend({
this.db.meta.keyChanged = this._oldKeyChangeDate; this.db.meta.keyChanged = this._oldKeyChangeDate;
} }
this.set({ keyFileName: '', keyFileChanged: changed }); this.set({ keyFileName: '', keyFileChanged: changed });
this.setModified();
}, },
setName: function(name) { setName: function(name) {
@ -424,4 +430,8 @@ var FileModel = Backbone.Model.extend({
} }
}); });
FileModel.createKeyFileWithHash = function(hash) {
return kdbxweb.Credentials.createKeyFileWithHash(hash);
};
module.exports = FileModel; module.exports = FileModel;

View File

@ -200,7 +200,9 @@ var Locale = {
setGenShowSubgroups: 'Show entries from all subgroups', setGenShowSubgroups: 'Show entries from all subgroups',
setGenTableView: 'Entries list table view', setGenTableView: 'Entries list table view',
setGenColorfulIcons: 'Colorful custom icons in list', setGenColorfulIcons: 'Colorful custom icons in list',
setGenFunction: 'Function',
setGenAutoSync: 'Automatically save and sync', setGenAutoSync: 'Automatically save and sync',
setGenRememberKeyFiles: 'Remember key files',
setGenLockInactive: 'Auto-lock if the app is inactive', setGenLockInactive: 'Auto-lock if the app is inactive',
setGenNoAutoLock: 'Don\'t auto-lock', setGenNoAutoLock: 'Don\'t auto-lock',
setGenLockMinutes: 'In {} minutes', setGenLockMinutes: 'In {} minutes',

View File

@ -21,6 +21,7 @@ var SettingsGeneralView = Backbone.View.extend({
'change .settings__general-idle-minutes': 'changeIdleMinutes', 'change .settings__general-idle-minutes': 'changeIdleMinutes',
'change .settings__general-clipboard': 'changeClipboard', 'change .settings__general-clipboard': 'changeClipboard',
'change .settings__general-auto-save': 'changeAutoSave', 'change .settings__general-auto-save': 'changeAutoSave',
'change .settings__general-remember-key-files': 'changeRememberKeyFiles',
'change .settings__general-minimize': 'changeMinimize', 'change .settings__general-minimize': 'changeMinimize',
'change .settings__general-lock-on-minimize': 'changeLockOnMinimize', 'change .settings__general-lock-on-minimize': 'changeLockOnMinimize',
'change .settings__general-table-view': 'changeTableView', 'change .settings__general-table-view': 'changeTableView',
@ -53,6 +54,7 @@ var SettingsGeneralView = Backbone.View.extend({
expandGroups: AppSettingsModel.instance.get('expandGroups'), expandGroups: AppSettingsModel.instance.get('expandGroups'),
canClearClipboard: !!Launcher, canClearClipboard: !!Launcher,
clipboardSeconds: AppSettingsModel.instance.get('clipboardSeconds'), clipboardSeconds: AppSettingsModel.instance.get('clipboardSeconds'),
rememberKeyFiles: AppSettingsModel.instance.get('rememberKeyFiles'),
autoSave: AppSettingsModel.instance.get('autoSave'), autoSave: AppSettingsModel.instance.get('autoSave'),
idleMinutes: AppSettingsModel.instance.get('idleMinutes'), idleMinutes: AppSettingsModel.instance.get('idleMinutes'),
minimizeOnClose: AppSettingsModel.instance.get('minimizeOnClose'), minimizeOnClose: AppSettingsModel.instance.get('minimizeOnClose'),
@ -144,6 +146,14 @@ var SettingsGeneralView = Backbone.View.extend({
AppSettingsModel.instance.set('autoSave', autoSave); 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) { changeMinimize: function(e) {
var minimizeOnClose = e.target.checked || false; var minimizeOnClose = e.target.checked || false;
AppSettingsModel.instance.set('minimizeOnClose', minimizeOnClose); AppSettingsModel.instance.set('minimizeOnClose', minimizeOnClose);

View File

@ -60,12 +60,17 @@
<label for="settings__general-colorful-icons">{{res 'setGenColorfulIcons'}}</label> <label for="settings__general-colorful-icons">{{res 'setGenColorfulIcons'}}</label>
</div> </div>
<h2>Function</h2> <h2>{{res 'setGenFunction'}}</h2>
<div> <div>
<input type="checkbox" class="settings__input input-base settings__general-auto-save" id="settings__general-auto-save" <input type="checkbox" class="settings__input input-base settings__general-auto-save" id="settings__general-auto-save"
{{#if autoSave}}checked{{/if}} /> {{#if autoSave}}checked{{/if}} />
<label for="settings__general-auto-save">{{res 'setGenAutoSync'}}</label> <label for="settings__general-auto-save">{{res 'setGenAutoSync'}}</label>
</div> </div>
<div>
<input type="checkbox" class="settings__input input-base settings__general-remember-key-files" id="settings__general-remember-key-files"
{{#if rememberKeyFiles}}checked{{/if}} />
<label for="settings__general-remember-key-files">{{res 'setGenRememberKeyFiles'}}</label>
</div>
<div> <div>
<label for="settings__general-idle-minutes">{{res 'setGenLockInactive'}}:</label> <label for="settings__general-idle-minutes">{{res 'setGenLockInactive'}}:</label>
<select class="settings__general-idle-minutes settings__select input-base" id="settings__general-idle-minutes"> <select class="settings__general-idle-minutes settings__select input-base" id="settings__general-idle-minutes">

View File

@ -29,7 +29,7 @@
"dropbox": "antelle/dropbox-js#0.10.6", "dropbox": "antelle/dropbox-js#0.10.6",
"font-awesome": "~4.4.0", "font-awesome": "~4.4.0",
"install": "~1.0.4", "install": "~1.0.4",
"kdbxweb": "~0.3.3", "kdbxweb": "~0.3.4",
"normalize.css": "~3.0.3", "normalize.css": "~3.0.3",
"pikaday": "~1.3.3", "pikaday": "~1.3.3",
"FileSaver.js": "eligrey/FileSaver.js", "FileSaver.js": "eligrey/FileSaver.js",

View File

@ -2,6 +2,7 @@ Release notes
------------- -------------
##### v1.1.0 (Q2 2016) ##### v1.1.0 (Q2 2016)
Storage providers, usability improvements Storage providers, usability improvements
`+` option to remember keyfiles
`+` beta version app `+` beta version app
##### v1.0.0 (2016-02-12) ##### v1.0.0 (2016-02-12)