From 5a21f026f23bbbb73efc59a685030083b98213a8 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 26 Oct 2022 08:59:36 +0100 Subject: [PATCH 1/6] Add setting to disable tcp/udp server (inbound) --- .../nodes/core/network/31-tcpin.html | 22 ++- .../@node-red/nodes/core/network/31-tcpin.js | 22 ++- .../@node-red/nodes/core/network/32-udp.html | 13 +- .../@node-red/nodes/core/network/32-udp.js | 187 ++++++++++-------- .../nodes/locales/en-US/messages.json | 2 + 5 files changed, 150 insertions(+), 96 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html index cd85a655b..2138c48c4 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html @@ -70,7 +70,16 @@ color: "Silver", defaults: { name: {value:""}, - server: {value:"server", required:true}, + server: { + value: RED.settings.tcpInAllowInboundConnections === false ? "client" : "server", + validate: function(v, opt) { + console.log("validating client/server mode") + if (v === 'server' && RED.settings.tcpInAllowInboundConnections === false) { + return RED._("node-red:tcpin.errors.inbound-disabled"); + } + return ["client", "server"].indexOf(v) >= 0 + } + }, host: { value:"", validate:function(v, opt) { @@ -218,7 +227,16 @@ return RED._("node-red:tcpin.errors.invalid-port"); } }, - beserver: {value:"client", required:true}, + beserver: { + value: "client", + validate: function(v, opt) { + console.log("validating client/server mode") + if (v === 'server' && RED.settings.tcpInAllowInboundConnections === false) { + return RED._("node-red:tcpin.errors.inbound-disabled"); + } + return ["client", "server", "reply"].indexOf(v) >= 0 + } + }, base64: {value:false, required:true}, end: {value:false, required:true}, tls: {type:"tls-config", value:'', required:false, diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index d2de33522..605023938 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -19,6 +19,7 @@ module.exports = function(RED) { let reconnectTime = RED.settings.socketReconnectTime || 10000; let socketTimeout = RED.settings.socketTimeout || null; const msgQueueSize = RED.settings.tcpMsgQueueSize || 1000; + const allowInbound = RED.settings.tcpInAllowInboundConnections === false ? false : true const Denque = require('denque'); const net = require('net'); const tls = require('tls'); @@ -196,8 +197,7 @@ module.exports = function(RED) { clearTimeout(reconnectTimeout); if (!node.connected) { done(); } }); - } - else { + } else if (allowInbound) { let srv = net; let connOpts; if (n.tls) { @@ -308,9 +308,19 @@ module.exports = function(RED) { }); } }); + } else { + node.warn(RED._("tcpin.errors.inbound-disabled",{host:node.host,port:node.port})); + node.status({fill:"red",shape:"dot",text:"tcpin.errors.inbound-disabled"}); } } - RED.nodes.registerType("tcp in",TcpIn); + RED.nodes.registerType("tcp in",TcpIn, { + settings: { + tcpInAllowInboundConnections: { + value: true, + exportable: true + } + } + }); function TcpOut(n) { @@ -434,7 +444,7 @@ module.exports = function(RED) { nodeDone(); }); } - else { + else if (allowInbound) { const connectedSockets = new Set(); node.status({text:RED._("tcpin.status.connections",{count:0})}); let srv = net; @@ -507,11 +517,13 @@ module.exports = function(RED) { }); } }); + } else { + node.warn(RED._("tcpin.errors.inbound-disabled",{host:node.host,port:node.port})); + node.status({fill:"red",shape:"dot",text:"tcpin.errors.inbound-disabled"}); } } RED.nodes.registerType("tcp out",TcpOut); - function TcpGet(n) { RED.nodes.createNode(this,n); this.server = n.server; diff --git a/packages/node_modules/@node-red/nodes/core/network/32-udp.html b/packages/node_modules/@node-red/nodes/core/network/32-udp.html index 4d5eeb23e..8ab527df5 100644 --- a/packages/node_modules/@node-red/nodes/core/network/32-udp.html +++ b/packages/node_modules/@node-red/nodes/core/network/32-udp.html @@ -18,7 +18,7 @@ diff --git a/packages/node_modules/@node-red/nodes/core/network/32-udp.js b/packages/node_modules/@node-red/nodes/core/network/32-udp.js index 2d6b3718a..e3b202182 100644 --- a/packages/node_modules/@node-red/nodes/core/network/32-udp.js +++ b/packages/node_modules/@node-red/nodes/core/network/32-udp.js @@ -116,8 +116,8 @@ module.exports = function(RED) { }); } else { - node.warn(RED._("udp.errors.inbound-disabled",{host:node.host,port:node.port})); - node.status({fill:"red",shape:"dot",text:"udp.errors.inbound-disabled"}); + node.warn(RED._("udp.status.inbound-disabled",{host:node.host,port:node.port})); + node.status({fill:"gray",shape:"circle",text:"udp.status.inbound-disabled"}); } node.on("close", function() { try { diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index a781e4330..7a9f37811 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -636,6 +636,9 @@ "never": "never - keep connection open", "immed": "immediately - don't wait for reply" }, + "tip": { + "inbound-disabled": "inbound connections are disabled for this Node-RED instance" + }, "status": { "connecting": "connecting to __host__:__port__", "connected": "connected to __host__:__port__", @@ -644,10 +647,10 @@ "connection-from": "connection from __host__:__port__", "connection-closed": "connection closed from __host__:__port__", "connections": "__count__ connection", - "connections_plural": "__count__ connections" + "connections_plural": "__count__ connections", + "inbound-disabled": "inbound connections are disabled" }, "errors": { - "inbound-disabled": "inbound connections are disabled", "connection-lost": "connection lost to __host__:__port__", "timeout": "timeout closed socket port __port__", "cannot-listen": "unable to listen on port __port__, error: __error__", @@ -698,7 +701,8 @@ "tip": { "in": "Tip: Make sure your firewall will allow the data in.", "out": "Tip: leave address and port blank if you want to set using msg.ip and msg.port.", - "port": "Ports already in use: " + "port": "Ports already in use: ", + "inbound-disabled": "inbound connections are disabled for this Node-RED instance" }, "status": { "listener-at": "udp listener at __host__:__port__", @@ -709,10 +713,10 @@ "bc-ready": "udp broadcast ready: __outport__ -> __host__:__port__", "ready": "udp ready: __outport__ -> __host__:__port__", "ready-nolocal": "udp ready: __host__:__port__", - "re-use": "udp re-use socket: __outport__ -> __host__:__port__" + "re-use": "udp re-use socket: __outport__ -> __host__:__port__", + "inbound-disabled": "inbound connections are disabled" }, "errors": { - "inbound-disabled": "inbound connections are disabled", "access-error": "UDP access error, you may need root access for ports below 1024", "error": "error: __error__", "bad-mcaddress": "Bad Multicast Address", From 24b1c42820b546e83378f628ba4ee814d068d9ca Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Tue, 1 Nov 2022 13:44:23 +0000 Subject: [PATCH 3/6] improve tip layout when nested in a form row --- .../@node-red/editor-client/src/sass/editor.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index 1730b9e35..9c1f0d60e 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -229,6 +229,12 @@ button.red-ui-tray-resize-button { border: 1px solid var(--red-ui-secondary-border-color); max-width: 450px; } + .form-row > div.form-tips { + width: 70%; + display: inline-block; + box-sizing: border-box; + max-width: 350px; // 100 less for label width + } .form-tips code { border: none; padding: auto; From 7c5d8b60ba5e31c1b0f5a78f14b3600b4371f37f Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Tue, 1 Nov 2022 13:47:20 +0000 Subject: [PATCH 4/6] correct duplicate test IDs (copy+paste error) --- test/nodes/core/network/31-tcpin_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/nodes/core/network/31-tcpin_spec.js b/test/nodes/core/network/31-tcpin_spec.js index 3644a0ba1..8bf16147d 100644 --- a/test/nodes/core/network/31-tcpin_spec.js +++ b/test/nodes/core/network/31-tcpin_spec.js @@ -157,7 +157,7 @@ describe('TCP in Node', function() { testTCP0(flow, ["foo\nbar\nbaz"], ["foo\nbar\nbaz"], done); }); - it('should recv data (Stream/Base64)', function(done) { + it('should recv data (Single/Base64)', function(done) { var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"single", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] }, {id:"n2", type:"helper"}]; testTCP0(flow, ["foo"], [Buffer("foo").toString('base64')], done); @@ -227,7 +227,7 @@ describe('TCP in Node', function() { testTCP1(flow, ["foo\nbar\nbaz"], ["foo\nbar\nbaz"], done); }); - it('should connect & recv data (Stream/Base64)', function(done) { + it('should connect & recv data (Single/Base64)', function(done) { var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"single", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] }, {id:"n2", type:"helper"}]; testTCP1(flow, ["foo"], [Buffer("foo").toString('base64')], done); From d66828aaf17d14acebf59faacf75f872e38531d6 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sun, 4 Dec 2022 11:07:52 +0000 Subject: [PATCH 5/6] add note to built-in help RE: "inbound disabled" --- .../@node-red/nodes/locales/en-US/network/31-tcpin.html | 4 +++- .../@node-red/nodes/locales/en-US/network/32-udp.html | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html index 173f003f7..e788decca 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html +++ b/packages/node_modules/@node-red/nodes/locales/en-US/network/31-tcpin.html @@ -16,9 +16,11 @@