mirror of https://github.com/keeweb/keeweb.git
option to remember keyfiles
This commit is contained in:
parent
c65b7f7331
commit
4eb5eb39e9
|
@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue