From 4fe23842cfee47efe7f3d41fc6b20825f87b869e Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Wed, 25 Mar 2020 20:46:20 +0100 Subject: [PATCH] Don't allow non existing entities on availability_blacklist or availability_whitelist. #3191 --- lib/util/settings.js | 21 +++++++++++++++++---- test/settings.test.js | 13 +++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/util/settings.js b/lib/util/settings.js index 27b04f4e..c7a2b27e 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -317,17 +317,30 @@ function validate() { } names.push(name); }; - Object.values(_settingsWithDefaults.devices).forEach((d) => check(d.friendly_name)); - Object.values(_settingsWithDefaults.groups).forEach((g) => check(g.friendly_name)); - if (_settingsWithDefaults.mqtt.version !== 5) { - for (const device of Object.values(_settingsWithDefaults.devices)) { + const settingsWithDefaults = getWithDefaults(); + Object.values(settingsWithDefaults.devices).forEach((d) => check(d.friendly_name)); + Object.values(settingsWithDefaults.groups).forEach((g) => check(g.friendly_name)); + + if (settingsWithDefaults.mqtt.version !== 5) { + for (const device of Object.values(settingsWithDefaults.devices)) { if (device.retention) { throw new Error('MQTT retention requires protocol version 5'); } } } + const checkAvailabilityList = (list, type) => { + list.forEach((e) => { + if (!getEntity(e)) { + throw new Error(`Non-existing entity '${e}' specified in '${type}'`); + } + }); + }; + + checkAvailabilityList(settingsWithDefaults.advanced.availability_blacklist, 'availability_blacklist'); + checkAvailabilityList(settingsWithDefaults.advanced.availability_whitelist, 'availability_whitelist'); + return !valid ? validate.errors.map((v) => `${v.dataPath.substring(1)} ${v.message}`) : null; } diff --git a/test/settings.test.js b/test/settings.test.js index 9cac65c7..f2905786 100644 --- a/test/settings.test.js +++ b/test/settings.test.js @@ -501,6 +501,19 @@ describe('Settings', () => { }).toThrowError('MQTT retention requires protocol version 5'); }); + it('Should not allow non-existing entities in availability blacklist', () => { + write(configurationFile, { + devices: {'0x0017880104e45519': {friendly_name: 'tain'}}, + advanced: {availability_blacklist: ['0x0017880104e45519', 'non_existing']}, + }); + + settings._reRead(); + + expect(() => { + settings.validate(); + }).toThrowError(`Non-existing entity 'non_existing' specified in 'availability_blacklist'`); + }); + it('Should ban devices', () => { write(configurationFile, {}); settings.banDevice('0x123');