Skip to content
This repository has been archived by the owner on Oct 16, 2019. It is now read-only.

Issue/213 #237

Merged
merged 3 commits into from Sep 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 11 additions & 12 deletions services/keepassReference.js
Expand Up @@ -26,26 +26,24 @@ function KeepassReference() {
if (expressions.index >= lastIndex) {
result += fieldValue.substring(lastIndex, expressions.index);
}
result += resolveReference(expressions[1], currentEntry, allEntries);
result += my.resolveReference(expressions[1], currentEntry, allEntries);
lastIndex = expressions.index + expressions[1].length;
expressions = re.exec(fieldValue || '');
}

if (lastIndex < fieldValue.length) {
result += fieldValue.substring(lastIndex, fieldValue.length);
}

return result;
}

my.keewebGetDecryptedFieldValue = function(entry, fieldName) {
if (entry.protectedData === undefined || !entry.protectedData[fieldName]) {
if (entry.protectedData === undefined || !(fieldName in entry['protectedData'])) {
return entry[fieldName] || ""; //not an encrypted field
}
let keewebProtectedValue = new kdbxweb.ProtectedValue(
return new kdbxweb.ProtectedValue(
entry['protectedData'][fieldName].value,
entry['protectedData'][fieldName].salt);
return keewebProtectedValue.getText();
entry['protectedData'][fieldName].salt).getText();
}

my.getFieldValue = function(currentEntry, fieldName, allEntries) {
Expand All @@ -55,7 +53,7 @@ function KeepassReference() {
return my.processAllReferences(my.majorVersion, plainText, currentEntry, allEntries);
}

function resolveReference(referenceText, currentEntry, allEntries) {
my.resolveReference = function(referenceText, currentEntry, allEntries) {
var localParts = /^\{([a-zA-Z]+)\}$/.exec(referenceText)
if (localParts) {
// local field
Expand Down Expand Up @@ -91,30 +89,31 @@ function KeepassReference() {
var wantedField = getPropertyNameFromCode(refString[1]);
var searchIn = getPropertyNameFromCode(refString[2]);
var text = refString[3];

var matches = allEntries.filter(function(e) {
if (searchIn === '*') {
var customFieldMatches = e.keys.filter(function(key) {
return String(e[key] || '').indexOf(text) !== -1;
});
return customFieldMatches.length > 0;
} else if (searchIn === 'id') {
return String(e[searchIn]).toLowerCase() === text.toLowerCase();
} else {
return String(e[searchIn] || '').indexOf(text) !== -1;
}
});
if (matches.length) {
if (my.majorVersion >= 3)
if (my.majorVersion >= 3) {
return my.keewebGetDecryptedFieldValue(matches[0], wantedField);
else
} else {
throw "Database Version Not Supported";
}
}
}

return referenceText;
}

my.resolveReference = resolveReference;

function getPropertyNameFromCode(code) {
switch (code) {
case 'T':
Expand Down
11 changes: 9 additions & 2 deletions services/keepassService.js
Expand Up @@ -130,7 +130,14 @@ function KeepassService(keepassHeader, settings, passwordFileStoreRegistry, keep
entry.keys.forEach(function(key) {
var fieldRefs = keepassReference.hasReferences(entry[key]);
if (fieldRefs) {
entry[key] = keepassReference.processAllReferences(majorVersion, entry[key], entry, entries)
let value = keepassReference.processAllReferences(majorVersion, entry[key], entry, entries);
if (['password', 'otp'].indexOf(key) >= 0) {
let newProtectedVal = kdbxweb.ProtectedValue.fromString(value);
entry.protectedData[Case.camel(key)] = protectedValueToJSON(newProtectedVal);
delete entry[key];
} else {
entry[key] = value;
}
}
});
}
Expand Down Expand Up @@ -183,7 +190,7 @@ function KeepassService(keepassHeader, settings, passwordFileStoreRegistry, keep
var field_keys = Object.keys(db_entry.fields);
for (let k = 0; k < field_keys.length; k++) {
var field = field_keys[k];
if (typeof db_entry.fields[field] == "object") {
if (typeof db_entry.fields[field] === 'object') {
// type = object ? protected value
entry.protectedData[Case.camel(field)] = protectedValueToJSON(db_entry.fields[field]);
} else {
Expand Down
8 changes: 5 additions & 3 deletions tests/components/test.unlock.vue.js
Expand Up @@ -11,9 +11,11 @@ PROPS
links: Object
*/

chrome.runtime.getManifest = function() {
return {
version: "1.0.0"
chrome.runtime = {
getManifest() {
return {
version: "1.0.0"
}
}
}

Expand Down
20 changes: 10 additions & 10 deletions tests/services/test.keepassReference.js
Expand Up @@ -8,7 +8,7 @@ describe('Keepass References', function () {

var refService = KeepassReference();
var entry = {
id: 1,
id: "1",
title: 'Sample Title',
userName: 'UserX',
url: 'http://keepass.info/',
Expand All @@ -24,7 +24,7 @@ describe('Keepass References', function () {
}
};
var entry2 = {
id: 2,
id: "2b",
title: 'Sample Title2',
userName: 'UserX2',
url: 'http://keepass.info/2',
Expand Down Expand Up @@ -87,25 +87,25 @@ describe('Keepass References', function () {

describe('All entries', function() {
it('should resolve wanted title', function() {
refService.resolveReference('{REF:T@I:2}', entry, entries).should.equal(entry2.title);
refService.resolveReference('{REF:T@I:2B}', entry, entries).should.equal(entry2.title);
})
it('should resolve wanted username', function() {
refService.resolveReference('{REF:U@I:2}', entry, entries).should.equal(entry2.userName);
refService.resolveReference('{REF:U@I:2B}', entry, entries).should.equal(entry2.userName);
})
it('should resolve wanted url', function() {
refService.resolveReference('{REF:A@I:2}', entry, entries).should.equal(entry2.url);
refService.resolveReference('{REF:A@I:2b}', entry, entries).should.equal(entry2.url);
})
it('should resolve wanted password', function() {
refService.resolveReference('{REF:P@I:2}', entry, entries).should.equal("Password");
refService.resolveReference('{REF:P@I:2b}', entry, entries).should.equal("Password");
})
it('should resolve wanted notes', function() {
refService.resolveReference('{REF:N@I:2}', entry, entries).should.equal(entry2.notes);
refService.resolveReference('{REF:N@I:2b}', entry, entries).should.equal(entry2.notes);
})
it('should resolve wanted id', function() {
refService.resolveReference('{REF:I@I:2}', entry, entries).should.equal(entry2.id);
refService.resolveReference('{REF:I@I:2B}', entry, entries).should.equal(entry2.id);
})
it('should return expression back when unknown wanted field', function() {
refService.resolveReference('{REF:Z@I:2}', entry, entries).should.equal('{REF:Z@I:2}');
refService.resolveReference('{REF:Z@I:2b}', entry, entries).should.equal('{REF:Z@I:2b}');
})
it('should return expression back when unmatched text', function() {
refService.resolveReference('{REF:Z@I:3333}', entry, entries).should.equal('{REF:Z@I:3333}');
Expand All @@ -130,7 +130,7 @@ describe('Keepass References', function () {
refService.resolveReference('{REF:I@I:' + entry2.id + '}', entry, entries).should.equal(entry2.id);
})
it('should return expression back when unknown search field', function() {
refService.resolveReference('{REF:I@Z:2}', entry, entries).should.equal('{REF:I@Z:2}');
refService.resolveReference('{REF:I@Z:2b}', entry, entries).should.equal('{REF:I@Z:2b}');
})
it('should return expression back when unmatched text', function() {
refService.resolveReference('{REF:I@I:3333}', entry, entries).should.equal('{REF:I@I:3333}');
Expand Down