Add auth awareness to comms channel

This commit is contained in:
Nick O'Leary 2014-11-12 13:21:59 +00:00
parent 982997c3df
commit 74e1ef0823
2 changed files with 51 additions and 8 deletions

View File

@ -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}));

View File

@ -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,