mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add auth awareness to comms channel
This commit is contained in:
parent
982997c3df
commit
74e1ef0823
@ -29,6 +29,10 @@ RED.comms = (function() {
|
|||||||
errornotification.close();
|
errornotification.close();
|
||||||
errornotification = null;
|
errornotification = null;
|
||||||
}
|
}
|
||||||
|
var auth_tokens = RED.settings.get("auth-tokens");
|
||||||
|
if (auth_tokens) {
|
||||||
|
ws.send(JSON.stringify({auth:auth_tokens.access_token}));
|
||||||
|
}
|
||||||
for (var t in subscriptions) {
|
for (var t in subscriptions) {
|
||||||
if (subscriptions.hasOwnProperty(t)) {
|
if (subscriptions.hasOwnProperty(t)) {
|
||||||
ws.send(JSON.stringify({subscribe:t}));
|
ws.send(JSON.stringify({subscribe:t}));
|
||||||
|
55
red/comms.js
55
red/comms.js
@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
var tokens = require("./api/auth/tokens");
|
||||||
|
|
||||||
var ws = require("ws");
|
var ws = require("ws");
|
||||||
var log = require("./log");
|
var log = require("./log");
|
||||||
|
|
||||||
@ -21,6 +23,7 @@ var server;
|
|||||||
var settings;
|
var settings;
|
||||||
|
|
||||||
var wsServer;
|
var wsServer;
|
||||||
|
var pendingConnections = [];
|
||||||
var activeConnections = [];
|
var activeConnections = [];
|
||||||
|
|
||||||
var retained = {};
|
var retained = {};
|
||||||
@ -43,13 +46,17 @@ function start() {
|
|||||||
wsServer = new ws.Server({server:server,path:path});
|
wsServer = new ws.Server({server:server,path:path});
|
||||||
|
|
||||||
wsServer.on('connection',function(ws) {
|
wsServer.on('connection',function(ws) {
|
||||||
activeConnections.push(ws);
|
var pendingAuth = (settings.httpAdminAuth != null);
|
||||||
|
if (!pendingAuth) {
|
||||||
|
activeConnections.push(ws);
|
||||||
|
} else {
|
||||||
|
pendingConnections.push(ws);
|
||||||
|
}
|
||||||
ws.on('close',function() {
|
ws.on('close',function() {
|
||||||
for (var i=0;i<activeConnections.length;i++) {
|
if (!pendingAuth) {
|
||||||
if (activeConnections[i] === ws) {
|
removeActiveConnection(ws);
|
||||||
activeConnections.splice(i,1);
|
} else {
|
||||||
break;
|
removePendingConnection(ws);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ws.on('message', function(data,flags) {
|
ws.on('message', function(data,flags) {
|
||||||
@ -60,8 +67,24 @@ function start() {
|
|||||||
log.warn("comms received malformed message : "+err.toString());
|
log.warn("comms received malformed message : "+err.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg.subscribe) {
|
if (!pendingAuth) {
|
||||||
handleRemoteSubscription(ws,msg.subscribe);
|
if (msg.subscribe) {
|
||||||
|
handleRemoteSubscription(ws,msg.subscribe);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (msg.auth) {
|
||||||
|
tokens.get(msg.auth).then(function(client) {
|
||||||
|
if (!client) {
|
||||||
|
ws.close();
|
||||||
|
} else {
|
||||||
|
pendingAuth = false;
|
||||||
|
removePendingConnection(ws);
|
||||||
|
activeConnections.push(ws);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
ws.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ws.on('error', function(err) {
|
ws.on('error', function(err) {
|
||||||
@ -123,6 +146,22 @@ function handleRemoteSubscription(ws,topic) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeActiveConnection(ws) {
|
||||||
|
for (var i=0;i<activeConnections.length;i++) {
|
||||||
|
if (activeConnections[i] === ws) {
|
||||||
|
activeConnections.splice(i,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function removePendingConnection(ws) {
|
||||||
|
for (var i=0;i<pendingConnections.length;i++) {
|
||||||
|
if (pendingConnections[i] === ws) {
|
||||||
|
pendingConnections.splice(i,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init:init,
|
init:init,
|
||||||
|
Loading…
Reference in New Issue
Block a user