support field references in auto-type

This commit is contained in:
antelle 2016-08-14 22:32:13 +03:00
parent e28d58a1cf
commit a09d567301
2 changed files with 42 additions and 27 deletions

View File

@ -170,14 +170,7 @@ AutoTypeRunner.prototype.getEntryFieldKeys = function(field, op) {
if (!field || !this.entry) {
return '';
}
field = field.toLowerCase();
var value = null;
_.findKey(this.entry.entry.fields, (val, f) => {
if (f.toLowerCase() === field) {
value = val;
return true;
}
});
var value = this.entry.getFieldValue(field);
if (!value) {
return '';
}

View File

@ -275,28 +275,50 @@ var EntryModel = Backbone.Model.extend({
this.hasFieldRefs = false;
this.fieldRefFields.forEach(field => {
let fieldValue = this[field];
if (!fieldValue) {
return;
let refValue = this._resolveFieldReference(fieldValue);
if (refValue !== undefined) {
this[field] = refValue;
this.hasFieldRefs = true;
}
if (fieldValue.isProtected && fieldValue.isFieldReference()) {
fieldValue = fieldValue.getText();
}
if (typeof fieldValue !== 'string') {
return;
}
let match = fieldValue.match(this.fieldRefRegex);
if (!match) {
return;
}
this.hasFieldRefs = true;
let value = this._getReferenceValue(match[1], match[2]);
if (!value) {
return;
}
this[field] = value;
});
},
getFieldValue: function(field) {
field = field.toLowerCase();
let resolvedField;
Object.keys(this.entry.fields).some(entryField => {
if (entryField.toLowerCase() === field) {
resolvedField = entryField;
return true;
}
});
if (resolvedField) {
let fieldValue = this.entry.fields[resolvedField];
let refValue = this._resolveFieldReference(fieldValue);
if (refValue !== undefined) {
fieldValue = refValue;
}
return fieldValue;
}
},
_resolveFieldReference: function(fieldValue) {
if (!fieldValue) {
return;
}
if (fieldValue.isProtected && fieldValue.isFieldReference()) {
fieldValue = fieldValue.getText();
}
if (typeof fieldValue !== 'string') {
return;
}
let match = fieldValue.match(this.fieldRefRegex);
if (!match) {
return;
}
return this._getReferenceValue(match[1], match[2]);
},
_getReferenceValue: function(fieldRefId, idStr) {
let id = new Uint8Array(16);
for (let i = 0; i < 16; i++) {
@ -305,7 +327,7 @@ var EntryModel = Backbone.Model.extend({
let uuid = new kdbxweb.KdbxUuid(id);
let entry = this.file.getEntry(this.file.subId(uuid.id));
if (!entry) {
return undefined;
return;
}
return entry.entry.fields[this.fieldRefIds[fieldRefId]];
},