mirror of https://github.com/keeweb/keeweb
fix #1255: file format version and kdf selection in settings
parent
cdedcd9dac
commit
ba122e786c
|
@ -489,6 +489,7 @@
|
|||
"setFileUnsavedBody": "There are unsaved changes in this file",
|
||||
"setFileCloseNoSave": "Close and lose changes",
|
||||
"setFileDontClose": "Don't close",
|
||||
"setFileFormatVersion": "File format",
|
||||
|
||||
"setShTitle": "Shortcuts",
|
||||
"setShShowAll": "show all items",
|
||||
|
|
|
@ -178,12 +178,14 @@ const FileModel = Backbone.Model.extend({
|
|||
{
|
||||
uuid: this.db.getDefaultGroup().uuid.toString(),
|
||||
groups,
|
||||
formatVersion: this.db.header.versionMajor,
|
||||
defaultUser: this.db.meta.defaultUser,
|
||||
recycleBinEnabled: this.db.meta.recycleBinEnabled,
|
||||
historyMaxItems: this.db.meta.historyMaxItems,
|
||||
historyMaxSize: this.db.meta.historyMaxSize,
|
||||
keyEncryptionRounds: this.db.header.keyEncryptionRounds,
|
||||
keyChangeForce: this.db.meta.keyChangeForce,
|
||||
kdfName: this.readKdfName(),
|
||||
kdfParameters: this.readKdfParams()
|
||||
},
|
||||
{ silent: true }
|
||||
|
@ -201,6 +203,25 @@ const FileModel = Backbone.Model.extend({
|
|||
this.resolveFieldReferences();
|
||||
},
|
||||
|
||||
readKdfName() {
|
||||
if (this.db.header.versionMajor === 4 && this.db.header.kdfParameters) {
|
||||
const kdfParameters = this.db.header.kdfParameters;
|
||||
let uuid = kdfParameters.get('$UUID');
|
||||
if (uuid) {
|
||||
uuid = kdbxweb.ByteUtils.bytesToBase64(uuid);
|
||||
switch (uuid) {
|
||||
case kdbxweb.Consts.KdfId.Argon2:
|
||||
return 'Argon2';
|
||||
case kdbxweb.Consts.KdfId.Aes:
|
||||
return 'Aes';
|
||||
}
|
||||
}
|
||||
return 'Unknown';
|
||||
} else {
|
||||
return 'Aes';
|
||||
}
|
||||
},
|
||||
|
||||
readKdfParams() {
|
||||
const kdfParameters = this.db.header.kdfParameters;
|
||||
if (!kdfParameters) {
|
||||
|
@ -211,14 +232,20 @@ const FileModel = Backbone.Model.extend({
|
|||
return undefined;
|
||||
}
|
||||
uuid = kdbxweb.ByteUtils.bytesToBase64(uuid);
|
||||
if (uuid !== kdbxweb.Consts.KdfId.Argon2) {
|
||||
return undefined;
|
||||
switch (uuid) {
|
||||
case kdbxweb.Consts.KdfId.Argon2:
|
||||
return {
|
||||
parallelism: kdfParameters.get('P').valueOf(),
|
||||
iterations: kdfParameters.get('I').valueOf(),
|
||||
memory: kdfParameters.get('M').valueOf()
|
||||
};
|
||||
case kdbxweb.Consts.KdfId.Aes:
|
||||
return {
|
||||
rounds: kdfParameters.get('R').valueOf()
|
||||
};
|
||||
default:
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
parallelism: kdfParameters.get('P').valueOf(),
|
||||
iterations: kdfParameters.get('I').valueOf(),
|
||||
memory: kdfParameters.get('M').valueOf()
|
||||
};
|
||||
},
|
||||
|
||||
subId(id) {
|
||||
|
@ -605,6 +632,9 @@ const FileModel = Backbone.Model.extend({
|
|||
case 'parallelism':
|
||||
this.db.header.kdfParameters.set('P', ValueType.UInt32, value);
|
||||
break;
|
||||
case 'rounds':
|
||||
this.db.header.kdfParameters.set('R', ValueType.UInt32, value);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -649,6 +679,31 @@ const FileModel = Backbone.Model.extend({
|
|||
|
||||
renameTag(from, to) {
|
||||
this.forEachEntry({}, entry => entry.renameTag(from, to));
|
||||
},
|
||||
|
||||
setFormatVersion(version) {
|
||||
this.db.setVersion(version);
|
||||
this.setModified();
|
||||
this.readModel();
|
||||
},
|
||||
|
||||
setKdf(kdfName) {
|
||||
const kdfParameters = this.db.header.kdfParameters;
|
||||
if (!kdfParameters) {
|
||||
throw new Error('Cannot set KDF on this version');
|
||||
}
|
||||
switch (kdfName) {
|
||||
case 'Aes':
|
||||
this.db.setKdf(kdbxweb.Consts.KdfId.Aes);
|
||||
break;
|
||||
case 'Argon2':
|
||||
this.db.setKdf(kdbxweb.Consts.KdfId.Argon2);
|
||||
break;
|
||||
default:
|
||||
throw new Error('Bad KDF name');
|
||||
}
|
||||
this.setModified();
|
||||
this.readModel();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -45,6 +45,8 @@ const SettingsFileView = Backbone.View.extend({
|
|||
'change #settings__file-trash': 'changeTrash',
|
||||
'input #settings__file-hist-len': 'changeHistoryLength',
|
||||
'input #settings__file-hist-size': 'changeHistorySize',
|
||||
'change #settings__file-format-version': 'changeFormatVersion',
|
||||
'change #settings__file-kdf': 'changeKdf',
|
||||
'input #settings__file-key-rounds': 'changeKeyRounds',
|
||||
'input #settings__file-key-change-force': 'changeKeyChangeForce',
|
||||
'input .settings__input-kdf': 'changeKdfParameter'
|
||||
|
@ -102,6 +104,8 @@ const SettingsFileView = Backbone.View.extend({
|
|||
backupSchedule: backup ? backup.schedule : DefaultBackupSchedule,
|
||||
historyMaxItems: this.model.get('historyMaxItems'),
|
||||
historyMaxSize: Math.round(this.model.get('historyMaxSize') / 1024 / 1024),
|
||||
formatVersion: this.model.get('formatVersion'),
|
||||
kdfName: this.model.get('kdfName'),
|
||||
keyEncryptionRounds: this.model.get('keyEncryptionRounds'),
|
||||
keyChangeForce:
|
||||
this.model.get('keyChangeForce') > 0 ? this.model.get('keyChangeForce') : null,
|
||||
|
@ -625,6 +629,17 @@ const SettingsFileView = Backbone.View.extend({
|
|||
this.model.setHistoryMaxSize(value * 1024 * 1024);
|
||||
},
|
||||
|
||||
changeFormatVersion(e) {
|
||||
const version = +e.target.value;
|
||||
this.model.setFormatVersion(version);
|
||||
this.render();
|
||||
},
|
||||
|
||||
changeKdf(e) {
|
||||
this.model.setKdf(e.target.value);
|
||||
this.render();
|
||||
},
|
||||
|
||||
changeKeyRounds(e) {
|
||||
if (!e.target.validity.valid) {
|
||||
return;
|
||||
|
|
|
@ -126,28 +126,46 @@
|
|||
<input type="text" pattern="\d+" required class="settings__input input-base" id="settings__file-hist-size" value="{{historyMaxSize}}" maxlength="3" />
|
||||
|
||||
<h2>{{res 'advanced'}}</h2>
|
||||
<label for="settings__file-format-version">{{res 'setFileFormatVersion'}}</label>
|
||||
<select class="settings__select input-base" id="settings__file-format-version">
|
||||
<option value="3" {{#ifeq formatVersion 3}}selected{{/ifeq}}>KDBX 3</option>
|
||||
<option value="4" {{#ifeq formatVersion 4}}selected{{/ifeq}}>KDBX 4</option>
|
||||
</select>
|
||||
<label for="settings__file-kdf">{{res 'setFileKdfParams'}}</label>
|
||||
<select class="settings__select input-base" id="settings__file-kdf" {{#ifneq formatVersion 4}}disabled{{/ifneq}}>
|
||||
<option value="Aes" {{#ifeq kdfName 'AES'}}selected{{/ifeq}}>AES</option>
|
||||
{{#ifeq formatVersion 4}}<option value="Argon2" {{#ifeq kdfName 'Argon2'}}selected{{/ifeq}}>Argon2</option>{{/ifeq}}
|
||||
</select>
|
||||
{{#if keyEncryptionRounds}}
|
||||
<label for="settings__file-key-rounds">{{res 'setFileRounds'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base" id="settings__file-key-rounds" value="{{keyEncryptionRounds}}" maxlength="10" />
|
||||
{{else if kdfParameters}}
|
||||
<label>{{res 'setFileKdfParams'}}: Argon2</label>
|
||||
<div class="settings__row">
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-iter">{{res 'setFileKdfParamsIter'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="iterations" id="settings__file-kdf-iter" value="{{kdfParameters.iterations}}" maxlength="10" />
|
||||
</div>
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-mem">{{res 'setFileKdfParamsMem'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="memory" data-mul="1024" id="settings__file-kdf-mem" value="{{kdfParameters.memory}}" maxlength="10" />
|
||||
</div>
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-par">{{res 'setFileKdfParamsPar'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="parallelism" id="settings__file-kdf-par" value="{{kdfParameters.parallelism}}" maxlength="2" />
|
||||
</div>
|
||||
</div>
|
||||
{{#ifeq kdfName 'Aes'}}
|
||||
<div>
|
||||
<label for="settings__file-kdf-rounds">{{res 'setFileRounds'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
id="settings__file-kdf-rounds" data-field="rounds" value="{{kdfParameters.rounds}}" maxlength="10" />
|
||||
</div>
|
||||
{{/ifeq}}
|
||||
{{#ifeq kdfName 'Argon2'}}
|
||||
<div class="settings__row">
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-iter">{{res 'setFileKdfParamsIter'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="iterations" id="settings__file-kdf-iter" value="{{kdfParameters.iterations}}" maxlength="10" />
|
||||
</div>
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-mem">{{res 'setFileKdfParamsMem'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="memory" data-mul="1024" id="settings__file-kdf-mem" value="{{kdfParameters.memory}}" maxlength="10" />
|
||||
</div>
|
||||
<div class="settings__col-small">
|
||||
<label class="settings__col-small-label" for="settings__file-kdf-par">{{res 'setFileKdfParamsPar'}}:</label>
|
||||
<input type="text" pattern="\d+" required class="settings__input input-base settings__input-kdf"
|
||||
data-field="parallelism" id="settings__file-kdf-par" value="{{kdfParameters.parallelism}}" maxlength="2" />
|
||||
</div>
|
||||
</div>
|
||||
{{/ifeq}}
|
||||
{{/if}}
|
||||
|
||||
<label for="settings__file-key-change-force">{{res 'setFileKeyChangeForce'}}:</label>
|
||||
|
|
|
@ -7616,9 +7616,9 @@
|
|||
"integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ=="
|
||||
},
|
||||
"kdbxweb": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/kdbxweb/-/kdbxweb-1.3.0.tgz",
|
||||
"integrity": "sha512-bAuGlASXp/79FXhZZj6U0842U31NK1yDUe7QOsuwxXvGl1zt69Wk3E0gIfMrI4C1+KkASuKjaiY3dmafVu87PA==",
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/kdbxweb/-/kdbxweb-1.4.1.tgz",
|
||||
"integrity": "sha512-JXN7z26vYkU/scn4rdvTyCwG1WndLbPeUVHSkMqrPcW0pXIYAgO+2mNqixL05elhWy2qXprsP4FVlzFijwsiRg==",
|
||||
"requires": {
|
||||
"pako": "github:keeweb/pako#653c0b00d8941c89d09ed4546d2179001ec44efc",
|
||||
"text-encoding": "github:keeweb/text-encoding#4dfb7cb0954c222852092f8b06ae4f6b4f60bfbb",
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
"jquery": "3.4.1",
|
||||
"json-loader": "^0.5.7",
|
||||
"jsqrcode": "github:antelle/jsqrcode#0.1.3",
|
||||
"kdbxweb": "1.3.0",
|
||||
"kdbxweb": "1.4.1",
|
||||
"load-grunt-tasks": "5.1.0",
|
||||
"mini-css-extract-plugin": "^0.8.0",
|
||||
"node-sass": "^4.12.0",
|
||||
|
|
|
@ -4,6 +4,7 @@ Release notes
|
|||
`+` #1226: 7-digit Authy OTP support
|
||||
`+` #107: multiline custom fields support
|
||||
`+` #1243: auto-type any field
|
||||
`+` #1255: file format version and kdf selection in settings
|
||||
`-` fix #764: multiple attachments display
|
||||
`-` fix multi-line fields display in history
|
||||
`-` fix #554: checking active window id during auto-type
|
||||
|
|
Loading…
Reference in New Issue