diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index e87a4c7ad..bfed09c23 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -459,7 +459,6 @@ module.exports = function(RED) { if(!opts || typeof opts !== "object") { return; //nothing to change, simply return } - const originalBrokerURL = node.brokerurl; //apply property changes (only if the property exists in the opts object) setIfHasProperty(opts, node, "url", init); @@ -468,7 +467,6 @@ module.exports = function(RED) { setIfHasProperty(opts, node, "clientid", init); setIfHasProperty(opts, node, "autoConnect", init); setIfHasProperty(opts, node, "usetls", init); - setIfHasProperty(opts, node, "usews", init); setIfHasProperty(opts, node, "verifyservercert", init); setIfHasProperty(opts, node, "compatmode", init); setIfHasProperty(opts, node, "protocolVersion", init); @@ -571,9 +569,6 @@ module.exports = function(RED) { if (typeof node.usetls === 'undefined') { node.usetls = false; } - if (typeof node.usews === 'undefined') { - node.usews = false; - } if (typeof node.verifyservercert === 'undefined') { node.verifyservercert = false; } @@ -1000,7 +995,7 @@ module.exports = function(RED) { node.client.publish(msg.topic, msg.payload, options, function (err) { if (done) { done(err) - } else { + } else if(err) { node.error(err, msg) } }) diff --git a/test/nodes/core/network/21-mqtt_spec.js b/test/nodes/core/network/21-mqtt_spec.js index fd1309b74..f97442b50 100644 --- a/test/nodes/core/network/21-mqtt_spec.js +++ b/test/nodes/core/network/21-mqtt_spec.js @@ -489,6 +489,39 @@ describe('MQTT Nodes', function () { } testSendRecv(brokerOptions, { topic: brokerOptions.birthTopic }, {}, options, hooks); }); + itConditional('should safely discard bad birth topic', function (done) { + if (skipTests) { return this.skip() } + this.timeout = 2000; + const baseTopic = nextTopic(); + const brokerOptions = { + protocolVersion: 4, + birthTopic: baseTopic + "#", // a publish topic should never have a wildcard + birthPayload: "broker connected", + birthQos: 2, + } + const options = {}; + const hooks = { done: null, beforeLoad: null, afterLoad: null, afterConnect: null }; + hooks.afterLoad = (helperNode, mqttBroker, mqttIn, mqttOut) => { + helperNode.on("input", function (msg) { + try { + msg.should.have.a.property("error").type("object"); + msg.error.should.have.a.property("source").type("object"); + msg.error.source.should.have.a.property("id", mqttIn.id); + done(); + } catch (err) { + done(err) + } + }); + return true; //handled + } + options.expectMsg = null; + try { + testSendRecv(brokerOptions, { topic: brokerOptions.birthTopic }, {}, options, hooks); + done() + } catch(err) { + done(e) + } + }); itConditional('should publish close message', function (done) { if (skipTests) { return this.skip() } this.timeout = 2000; @@ -646,12 +679,13 @@ function testSendRecv(brokerOptions, inNodeOptions, outNodeOptions, options, hoo const mqttBroker = helper.getNode(brokerOptions.id); const mqttIn = helper.getNode(nodes.mqtt_in.id); const mqttOut = helper.getNode(nodes.mqtt_out.id); - let afterLoadHandled = false; + let afterLoadHandled = false, finished = false; if (hooks.afterLoad) { afterLoadHandled = hooks.afterLoad(helperNode, mqttBroker, mqttIn, mqttOut) } if (!afterLoadHandled) { helperNode.on("input", function (msg) { + finished = true try { compareMsgToExpected(msg, expectMsg); if (hooks.done) { hooks.done(); } @@ -676,10 +710,12 @@ function testSendRecv(brokerOptions, inNodeOptions, outNodeOptions, options, hoo } }) .catch((e) => { + if(finished) { return } if (hooks.done) { hooks.done(e); } else { throw e; } }); } catch (err) { + if(finished) { return } if (hooks.done) { hooks.done(err); } else { throw err; } }