diff --git a/lib/util/settings.ts b/lib/util/settings.ts index 38ce5b272..751b0e758 100644 --- a/lib/util/settings.ts +++ b/lib/util/settings.ts @@ -196,6 +196,7 @@ function write(): void { // In case the setting is defined in a separte file (e.g. !secret network_key) update it there. for (const path of [ + ['mqtt', 'server'], ['mqtt', 'user'], ['mqtt', 'password'], ['advanced', 'network_key'], @@ -323,11 +324,18 @@ function read(): Settings { } }; - if (s.mqtt?.user && s.mqtt?.password) { + if (s.mqtt?.user) { s.mqtt.user = interpetValue(s.mqtt.user); + } + + if (s.mqtt?.password) { s.mqtt.password = interpetValue(s.mqtt.password); } + if (s.mqtt?.server) { + s.mqtt.server = interpetValue(s.mqtt.server); + } + if (s.advanced?.network_key) { s.advanced.network_key = interpetValue(s.advanced.network_key); } diff --git a/test/settings.test.js b/test/settings.test.js index d751890a7..3c955d751 100644 --- a/test/settings.test.js +++ b/test/settings.test.js @@ -39,6 +39,7 @@ describe('Settings', () => { beforeEach(() => { remove(configurationFile); + remove(secretFile); remove(devicesFile); remove(groupsFile); clearEnvironmentVariables(); @@ -171,6 +172,49 @@ describe('Settings', () => { expect(read(secretFile)).toStrictEqual({...contentSecret, username: 'test123', network_key: [1,2,3,4]}); }); + it('Should read ALL secrets form a separate file', () => { + const contentConfiguration = { + mqtt: { + server: '!secret server', + user: '!secret username', + password: '!secret password', + }, + advanced: { + network_key: '!secret network_key', + } + }; + + const contentSecret = { + server: 'my.mqtt.server', + username: 'mysecretusername', + password: 'mysecretpassword', + network_key: [1,2,3], + }; + + write(secretFile, contentSecret, false); + write(configurationFile, contentConfiguration); + + const expected = { + base_topic: 'zigbee2mqtt', + include_device_information: false, + force_disable_retain: false, + password: "mysecretpassword", + server: "my.mqtt.server", + user: "mysecretusername", + }; + + expect(settings.get().mqtt).toStrictEqual(expected); + expect(settings.get().advanced.network_key).toStrictEqual([1,2,3]); + + settings.testing.write(); + expect(read(configurationFile)).toStrictEqual(contentConfiguration); + expect(read(secretFile)).toStrictEqual(contentSecret); + + settings.set(['mqtt', 'server'], 'not.secret.server'); + expect(read(configurationFile)).toStrictEqual(contentConfiguration); + expect(read(secretFile)).toStrictEqual({...contentSecret, server: 'not.secret.server'}); + }); + it('Should read devices form a separate file', () => { const contentConfiguration = { devices: 'devices.yaml',