diff --git a/docs/plugins/keewebhttp/manifest.json b/docs/plugins/keewebhttp/manifest.json index 589d998..6dfd367 100644 --- a/docs/plugins/keewebhttp/manifest.json +++ b/docs/plugins/keewebhttp/manifest.json @@ -11,7 +11,7 @@ "licence": "MIT", "url": "https://plugins.keeweb.info/plugins/keewebhttp", "resources": { - "js": "to0fWxarSAgke4VqZoV3P/dO92ea7RDlmCCyXJEbFOKER+JpJraPsPn0oeWoSzY396T7e2hRxM8HNo7rcnZtkojtCNALmOmz5aSg1cD8CmB3jYJJaG3r5t7WduyrOrha9+tU8XM5faAYeg6lrJb42D6e67/GHZG3GkPSpq3963Wjv36lb9/XQtUkgAOpV5dnuJhNdostFqngWnadvov1NnSNZtr6fbSoq+4worBPUnZTuDqzPTW0QIa2rfoA+Qsg4DLUBnuRLrgTA/8ObzI+qH5aKujIk4sBw6QZffGMpzESFlockS65cr5gmSu152A5oEgkqXT1sRKhMDC1qrFgnA==" + "js": "TckiF5MG/wcxxDccWP/JWeAQUlw6PD8/cNLirc/68eUNJ9MhwT7Rox1191V26BN8pdbzvqamBy30gGa1WvHa8byRAN9l7BoN2gCHOrf52hNPAkWGVXrrDEKkuMlvODifqjbzqW0llPoF1Ylq9vmTVei0qYLhCgsiz3Y8q5v7Ng6MWqph//DpiZuXq8xN23qjMEav5Rkab4/7IIbNlZOCEgt9JALQ6uW76OOWpoXNWegWIGDvkrs83Dq4WRn9As2YP6EueAywVkCCSjc9XkrbMTNOBOhTL7vgzyx5QiPfW7cWilcp27DGXbTp2uAbzyEnAiNg/U0wDckmqr8k2BwSbQ==" }, "publicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0oZB2Kt7AzRFNqf8FuO3C3kepHPAIQYiDPYdQxHcsiaFCwyKVx6K1cE/3vBhb8/2rj+QIIWNfAAuu1Y+2VK90ZBeq6HciukWzQRO/HWhfdy0c7JwDAslmyGI5olj0ZQkNLhkde1MiMxjDPpRhZtdJaryVO5cFJaJESpv3dV6m0qXsaQCluWYOSNfSjP9C8o2zRVjSi3ZQZnZIV5pnk9K2MtlZIPXrN9iJiM5zZ9DTSnqApI6dC9mX4R3LvGN+GTovm9C8Crl+qb106nGRR3LcweicDnPyMtZLa/E0DBpWYxUVLDp6WeLhxoUBr+6+t3Xp9IDnPoANDQXJXD0f1vQxQIDAQAB", "desktop": true, diff --git a/docs/plugins/keewebhttp/plugin.js b/docs/plugins/keewebhttp/plugin.js index 97c409d..75fef88 100644 --- a/docs/plugins/keewebhttp/plugin.js +++ b/docs/plugins/keewebhttp/plugin.js @@ -10,6 +10,7 @@ function run() { const path = nodeRequire('path'); const electron = nodeRequire('electron'); + const Backbone = require('backbone'); const kdbxweb = require('kdbxweb'); const AppModel = require('models/app-model'); const EntryModel = require('models/entry-model'); @@ -24,6 +25,7 @@ function run() { const FileReadTimeout = 500; const EntryTitle = 'KeePassHttp Settings'; const EntryFieldPrefix = 'AES Key: '; + const EntryUuid = 'NGl6QIpbQcCfNol9Yj7LMQ=='; const keys = {}; const addedKeys = {}; @@ -163,6 +165,7 @@ function run() { let settingsEntry = getSettingsEntry(file); if (!settingsEntry) { settingsEntry = EntryModel.newEntry(file.get('groups').first(), file); + settingsEntry.entry.uuid = new kdbxweb.KdbxUuid(EntryUuid); settingsEntry.setField('Title', EntryTitle); } for (const key of Object.keys(addedKeys)) { @@ -177,16 +180,11 @@ function run() { } } file.reload(); + Backbone.trigger('refresh'); } function getSettingsEntry(file) { - let entry = null; - file.get('groups').first().forEachOwnEntry({ textLower: EntryTitle.toLowerCase() }, e => { - if (e.title === EntryTitle) { - entry = e; - } - }); - return entry; + return file.getEntry(file.subId(EntryUuid)); } class RequestContext { @@ -362,7 +360,7 @@ function run() { } }); }).then(() => { - this.req.Id = 'KeeWeb_' + new Date().toISOString() + '_' + crypto.randomBytes(16).toString('hex'); + this.req.Id = 'KeeWeb ' + new Date().toISOString(); logger.info(`associate: ${this.req.Id}`); this.saveKeyWithId(); this.createResponse(); @@ -385,13 +383,24 @@ function run() { this.resp.Count = entries.length; logger.info(`getLogins(${url}): ${this.resp.Count}`); if (!config.onlyCount) { - this.resp.Entries = entries.map(entry => ({ - Login: entry.user ? this.encrypt(entry.user) : '', - Name: entry.title ? this.encrypt(entry.title) : '', - Password: entry.password ? this.encrypt(entry.password) : '', - StringFields: null, - Uuid: this.encrypt(entry.id) - })); + this.resp.Entries = entries.map(entry => { + let customFields = null; + for (const field of Object.keys(entry.fields)) { + if (!customFields) { + customFields = []; + } + const fieldKey = this.encrypt(field); + const fieldValue = this.encrypt(entry.fields[field]); + customFields.push({ Key: fieldKey, Value: fieldValue }); + } + return { + Login: entry.user ? this.encrypt(entry.user) : '', + Name: entry.title ? this.encrypt(entry.title) : '', + Password: entry.password ? this.encrypt(entry.password) : '', + StringFields: customFields, + Uuid: this.encrypt(entry.entry.uuid.id) + }; + }); } }