fix #1255: file format version and kdf selection in settings

This commit is contained in:
antelle 2019-09-14 09:34:23 +02:00
parent cdedcd9dac
commit ba122e786c
7 changed files with 119 additions and 29 deletions

View File

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

View File

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

View File

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

View File

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

6
package-lock.json generated
View File

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

View File

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

View File

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