Don't allow renaming to not allowed friendlyName. https://github.com/Koenkk/zigbee2mqtt/issues/3281

This commit is contained in:
Koen Kanters
2020-09-19 10:57:39 +02:00
parent c0faae73bb
commit 4f9c36ee44
4 changed files with 29 additions and 6 deletions
+5
View File
@@ -307,6 +307,11 @@ class Bridge extends Extension {
throw new Error('No device has joined since start');
}
const validationErrors = utils.validateFriendlyName(message.to);
if (validationErrors.length !== 0) {
throw new Error(validationErrors[0]);
}
const from = deviceAndHasLast ? this.lastJoinedDeviceIeeeAddr : message.from;
const to = message.to;
const homeAssisantRename = message.hasOwnProperty('homeassistant_rename') ?
+1 -6
View File
@@ -360,14 +360,9 @@ function validate() {
// Verify that all friendly names are unique
const names = [];
const postfixes = utils.getEndpointNames();
const check = (name) => {
if (names.includes(name)) errors.push(`Duplicate friendly_name '${name}' found`);
if (postfixes.includes(name)) errors.push(`Following friendly_name are not allowed: '${postfixes}'`);
if (name.match(/.*\/\d*$/)) errors.push(`Friendly name cannot end with a "/DIGIT" ('${name}')`);
if (name.includes('#') || name.includes('+')) {
errors.push(`MQTT wildcard (+ and #) not allowed in friendly_name ('${name}')`);
}
errors.push(...utils.validateFriendlyName(name));
names.push(name);
};
+11
View File
@@ -169,6 +169,16 @@ function toSnakeCase(value) {
}
}
function validateFriendlyName(name) {
const errors = [];
if (endpointNames.includes(name)) errors.push(`Following friendly_name are not allowed: '${endpointNames}'`);
if (name.match(/.*\/\d*$/)) errors.push(`Friendly name cannot end with a "/DIGIT" ('${name}')`);
if (name.includes('#') || name.includes('+')) {
errors.push(`MQTT wildcard (+ and #) not allowed in friendly_name ('${name}')`);
}
return errors;
}
module.exports = {
millisecondsToSeconds: (milliseconds) => milliseconds / 1000,
secondsToMilliseconds: (seconds) => seconds * 1000,
@@ -188,4 +198,5 @@ module.exports = {
capitalize,
parseJSON,
getExternalConvertersDefinitions,
validateFriendlyName,
};
+12
View File
@@ -465,6 +465,18 @@ describe('Bridge', () => {
);
});
it('Should throw error when renaming device through not allowed friendlyName', async () => {
MQTT.publish.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/request/device/rename', stringify({from: 'bulb', to: 'bulb_new_name/1'}));
await flushPromises();
console.log(MQTT.publish.mock.calls);
expect(MQTT.publish).toHaveBeenCalledWith(
'zigbee2mqtt/bridge/response/device/rename',
stringify({"data":{},"status":"error","error":`Friendly name cannot end with a "/DIGIT" ('bulb_new_name/1')`}),
{retain: false, qos: 0}, expect.any(Function)
);
});
it('Should throw error when renaming last joined device but none has joined', async () => {
MQTT.publish.mockClear();
MQTT.events.message('zigbee2mqtt/bridge/request/device/rename', stringify({last: true, to: 'bulb_new_name'}));