mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add setting to disable tcp/udp server (inbound)
This commit is contained in:
parent
7da3773f7f
commit
5a21f026f2
@ -70,7 +70,16 @@
|
|||||||
color: "Silver",
|
color: "Silver",
|
||||||
defaults: {
|
defaults: {
|
||||||
name: {value:""},
|
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: {
|
host: {
|
||||||
value:"",
|
value:"",
|
||||||
validate:function(v, opt) {
|
validate:function(v, opt) {
|
||||||
@ -218,7 +227,16 @@
|
|||||||
return RED._("node-red:tcpin.errors.invalid-port");
|
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},
|
base64: {value:false, required:true},
|
||||||
end: {value:false, required:true},
|
end: {value:false, required:true},
|
||||||
tls: {type:"tls-config", value:'', required:false,
|
tls: {type:"tls-config", value:'', required:false,
|
||||||
|
@ -19,6 +19,7 @@ module.exports = function(RED) {
|
|||||||
let reconnectTime = RED.settings.socketReconnectTime || 10000;
|
let reconnectTime = RED.settings.socketReconnectTime || 10000;
|
||||||
let socketTimeout = RED.settings.socketTimeout || null;
|
let socketTimeout = RED.settings.socketTimeout || null;
|
||||||
const msgQueueSize = RED.settings.tcpMsgQueueSize || 1000;
|
const msgQueueSize = RED.settings.tcpMsgQueueSize || 1000;
|
||||||
|
const allowInbound = RED.settings.tcpInAllowInboundConnections === false ? false : true
|
||||||
const Denque = require('denque');
|
const Denque = require('denque');
|
||||||
const net = require('net');
|
const net = require('net');
|
||||||
const tls = require('tls');
|
const tls = require('tls');
|
||||||
@ -196,8 +197,7 @@ module.exports = function(RED) {
|
|||||||
clearTimeout(reconnectTimeout);
|
clearTimeout(reconnectTimeout);
|
||||||
if (!node.connected) { done(); }
|
if (!node.connected) { done(); }
|
||||||
});
|
});
|
||||||
}
|
} else if (allowInbound) {
|
||||||
else {
|
|
||||||
let srv = net;
|
let srv = net;
|
||||||
let connOpts;
|
let connOpts;
|
||||||
if (n.tls) {
|
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) {
|
function TcpOut(n) {
|
||||||
@ -434,7 +444,7 @@ module.exports = function(RED) {
|
|||||||
nodeDone();
|
nodeDone();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else if (allowInbound) {
|
||||||
const connectedSockets = new Set();
|
const connectedSockets = new Set();
|
||||||
node.status({text:RED._("tcpin.status.connections",{count:0})});
|
node.status({text:RED._("tcpin.status.connections",{count:0})});
|
||||||
let srv = net;
|
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);
|
RED.nodes.registerType("tcp out",TcpOut);
|
||||||
|
|
||||||
|
|
||||||
function TcpGet(n) {
|
function TcpGet(n) {
|
||||||
RED.nodes.createNode(this,n);
|
RED.nodes.createNode(this,n);
|
||||||
this.server = n.server;
|
this.server = n.server;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<script type="text/html" data-template-name="udp in">
|
<script type="text/html" data-template-name="udp in">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-port"><i class="fa fa-sign-in"></i> <span data-i18n="udp.label.listen"></span></label>
|
<label for="node-input-port"><i class="fa fa-sign-in"></i> <span data-i18n="udp.label.listen"></span></label>
|
||||||
<select id="node-input-multicast" style='width:70%'>
|
<select id="node-input-multicast" style="width:70%">
|
||||||
<option value="false" data-i18n="udp.udpmsgs"></option>
|
<option value="false" data-i18n="udp.udpmsgs"></option>
|
||||||
<option value="true" data-i18n="udp.mcmsgs"></option>
|
<option value="true" data-i18n="udp.mcmsgs"></option>
|
||||||
</select>
|
</select>
|
||||||
@ -68,7 +68,16 @@
|
|||||||
validate:RED.validators.number(false)
|
validate:RED.validators.number(false)
|
||||||
},
|
},
|
||||||
ipv: {value:"udp4"},
|
ipv: {value:"udp4"},
|
||||||
multicast: {value:"false"},
|
multicast: {
|
||||||
|
value:"false",
|
||||||
|
validate: function(v, opt) {
|
||||||
|
console.log("validating client/server mode")
|
||||||
|
if (RED.settings.udpInAllowInboundConnections === false) {
|
||||||
|
return RED._("node-red:udp.errors.inbound-disabled");
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
},
|
||||||
group: {
|
group: {
|
||||||
value:"",
|
value:"",
|
||||||
validate:function(v,opt) {
|
validate:function(v,opt) {
|
||||||
|
@ -16,9 +16,10 @@
|
|||||||
|
|
||||||
module.exports = function(RED) {
|
module.exports = function(RED) {
|
||||||
"use strict";
|
"use strict";
|
||||||
var os = require('os');
|
const os = require('os');
|
||||||
var dgram = require('dgram');
|
const dgram = require('dgram');
|
||||||
var udpInputPortsInUse = {};
|
const udpInputPortsInUse = {};
|
||||||
|
const allowInbound = RED.settings.udpInAllowInboundConnections === false ? false : true
|
||||||
|
|
||||||
// The Input Node
|
// The Input Node
|
||||||
function UDPin(n) {
|
function UDPin(n) {
|
||||||
@ -29,8 +30,9 @@ module.exports = function(RED) {
|
|||||||
this.iface = n.iface || null;
|
this.iface = n.iface || null;
|
||||||
this.multicast = n.multicast;
|
this.multicast = n.multicast;
|
||||||
this.ipv = n.ipv || "udp4";
|
this.ipv = n.ipv || "udp4";
|
||||||
var node = this;
|
const node = this;
|
||||||
|
let server;
|
||||||
|
if (allowInbound) {
|
||||||
if (node.iface && node.iface.indexOf(".") === -1) {
|
if (node.iface && node.iface.indexOf(".") === -1) {
|
||||||
try {
|
try {
|
||||||
if ((os.networkInterfaces())[node.iface][0].hasOwnProperty("scopeid")) {
|
if ((os.networkInterfaces())[node.iface][0].hasOwnProperty("scopeid")) {
|
||||||
@ -54,9 +56,8 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var opts = {type:node.ipv, reuseAddr:true};
|
let opts = {type:node.ipv, reuseAddr:true};
|
||||||
if (process.version.indexOf("v0.10") === 0) { opts = node.ipv; }
|
if (process.version.indexOf("v0.10") === 0) { opts = node.ipv; }
|
||||||
var server;
|
|
||||||
|
|
||||||
if (!udpInputPortsInUse.hasOwnProperty(node.port)) {
|
if (!udpInputPortsInUse.hasOwnProperty(node.port)) {
|
||||||
server = dgram.createSocket(opts); // default to udp4
|
server = dgram.createSocket(opts); // default to udp4
|
||||||
@ -98,7 +99,7 @@ module.exports = function(RED) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server.on('message', function (message, remote) {
|
server.on('message', function (message, remote) {
|
||||||
var msg;
|
let msg;
|
||||||
if (node.datatype =="base64") {
|
if (node.datatype =="base64") {
|
||||||
msg = { payload:message.toString('base64'), fromip:remote.address+':'+remote.port, ip:remote.address, port:remote.port };
|
msg = { payload:message.toString('base64'), fromip:remote.address+':'+remote.port, ip:remote.address, port:remote.port };
|
||||||
} else if (node.datatype =="utf8") {
|
} else if (node.datatype =="utf8") {
|
||||||
@ -110,16 +111,21 @@ module.exports = function(RED) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server.on('listening', function () {
|
server.on('listening', function () {
|
||||||
var address = server.address();
|
const address = server.address();
|
||||||
node.log(RED._("udp.status.listener-at",{host:node.iface||address.address,port:address.port}));
|
node.log(RED._("udp.status.listener-at",{host:node.iface||address.address,port:address.port}));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
} 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.on("close", function() {
|
node.on("close", function() {
|
||||||
try {
|
try {
|
||||||
|
if (server) {
|
||||||
if (node.multicast == "true") { server.dropMembership(node.group); }
|
if (node.multicast == "true") { server.dropMembership(node.group); }
|
||||||
server.close();
|
server.close();
|
||||||
node.log(RED._("udp.status.listener-stopped"));
|
node.log(RED._("udp.status.listener-stopped"));
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
//node.error(err);
|
//node.error(err);
|
||||||
}
|
}
|
||||||
@ -133,7 +139,14 @@ module.exports = function(RED) {
|
|||||||
RED.httpAdmin.get('/udp-ports/:id', RED.auth.needsPermission('udp-ports.read'), function(req,res) {
|
RED.httpAdmin.get('/udp-ports/:id', RED.auth.needsPermission('udp-ports.read'), function(req,res) {
|
||||||
res.json(Object.keys(udpInputPortsInUse));
|
res.json(Object.keys(udpInputPortsInUse));
|
||||||
});
|
});
|
||||||
RED.nodes.registerType("udp in",UDPin);
|
RED.nodes.registerType("udp in",UDPin, {
|
||||||
|
settings: {
|
||||||
|
udpInAllowInboundConnections: {
|
||||||
|
value: true,
|
||||||
|
exportable: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -647,6 +647,7 @@
|
|||||||
"connections_plural": "__count__ connections"
|
"connections_plural": "__count__ connections"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
|
"inbound-disabled": "inbound connections are disabled",
|
||||||
"connection-lost": "connection lost to __host__:__port__",
|
"connection-lost": "connection lost to __host__:__port__",
|
||||||
"timeout": "timeout closed socket port __port__",
|
"timeout": "timeout closed socket port __port__",
|
||||||
"cannot-listen": "unable to listen on port __port__, error: __error__",
|
"cannot-listen": "unable to listen on port __port__, error: __error__",
|
||||||
@ -711,6 +712,7 @@
|
|||||||
"re-use": "udp re-use socket: __outport__ -> __host__:__port__"
|
"re-use": "udp re-use socket: __outport__ -> __host__:__port__"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
|
"inbound-disabled": "inbound connections are disabled",
|
||||||
"access-error": "UDP access error, you may need root access for ports below 1024",
|
"access-error": "UDP access error, you may need root access for ports below 1024",
|
||||||
"error": "error: __error__",
|
"error": "error: __error__",
|
||||||
"bad-mcaddress": "Bad Multicast Address",
|
"bad-mcaddress": "Bad Multicast Address",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user