From b7e3e2d739399beb9b78de20bc67b98b7be72a75 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 16 Feb 2014 23:17:15 +0000 Subject: [PATCH] Add username/password to Mongo nodes Fixes #159 --- nodes/core/storage/66-mongodb.html | 53 ++++++++++- nodes/core/storage/66-mongodb.js | 147 ++++++++++++++++++++--------- 2 files changed, 149 insertions(+), 51 deletions(-) diff --git a/nodes/core/storage/66-mongodb.html b/nodes/core/storage/66-mongodb.html index a7c4857a4..3a2490440 100644 --- a/nodes/core/storage/66-mongodb.html +++ b/nodes/core/storage/66-mongodb.html @@ -29,6 +29,14 @@ +
+ + +
+
+ + +
@@ -110,7 +155,7 @@ align: "right", label: function() { var mongoNode = RED.nodes.node(this.mongodb); - return this.name||(mongoNode?mongoNode.label()+"//"+this.collection:"mongodb"); + return this.name||(mongoNode?mongoNode.label()+" "+this.collection:"mongodb"); }, labelStyle: function() { return this.name?"node_label_italic":""; @@ -154,7 +199,7 @@ icon: "mongodb.png", label: function() { var mongoNode = RED.nodes.node(this.mongodb); - return this.name||(mongoNode?mongoNode.label()+"//"+this.collection:"mongodb"); + return this.name||(mongoNode?mongoNode.label()+" "+this.collection:"mongodb"); }, labelStyle: function() { return this.name?"node_label_italic":""; diff --git a/nodes/core/storage/66-mongodb.js b/nodes/core/storage/66-mongodb.js index 4340a2634..897c03b6d 100644 --- a/nodes/core/storage/66-mongodb.js +++ b/nodes/core/storage/66-mongodb.js @@ -16,6 +16,7 @@ var RED = require(process.env.NODE_RED_HOME+"/red/red"); var mongo = require('mongodb'); +var MongoClient = mongo.MongoClient; function MongoNode(n) { RED.nodes.createNode(this,n); @@ -23,9 +24,62 @@ function MongoNode(n) { this.port = n.port; this.db = n.db; this.name = n.name; + var credentials = RED.nodes.getCredentials(n.id); + if (credentials) { + this.username = credentials.user; + this.password = credentials.password; + } + + var url = "mongodb://"; + if (this.username && this.password) { + url += this.username+":"+this.password+"@"; + } + url += this.hostname+":"+this.port+"/"+this.db; + + this.url = url; } + RED.nodes.registerType("mongodb",MongoNode); +var querystring = require('querystring'); + +RED.httpAdmin.get('/mongodb/:id',function(req,res) { + var credentials = RED.nodes.getCredentials(req.params.id); + if (credentials) { + res.send(JSON.stringify({user:credentials.user,hasPassword:(credentials.password&&credentials.password!="")})); + } else { + res.send(JSON.stringify({})); + } +}); + +RED.httpAdmin.delete('/mongodb/:id',function(req,res) { + RED.nodes.deleteCredentials(req.params.id); + res.send(200); +}); + +RED.httpAdmin.post('/mongodb/:id',function(req,res) { + var body = ""; + req.on('data', function(chunk) { + body+=chunk; + }); + req.on('end', function(){ + var newCreds = querystring.parse(body); + var credentials = RED.nodes.getCredentials(req.params.id)||{}; + if (newCreds.user == null || newCreds.user == "") { + delete credentials.user; + } else { + credentials.user = newCreds.user; + } + if (newCreds.password == "") { + delete credentials.password; + } else { + credentials.password = newCreds.password||credentials.password; + } + RED.nodes.addCredentials(req.params.id,credentials); + res.send(200); + }); +}); + function MongoOutNode(n) { RED.nodes.createNode(this,n); @@ -37,34 +91,33 @@ function MongoOutNode(n) { if (this.mongoConfig) { var node = this; - this.clientDb = new mongo.Db(node.mongoConfig.db, new mongo.Server(node.mongoConfig.hostname, node.mongoConfig.port, {}), {w: 1}); - this.clientDb.open(function(err,cli) { - if (err) { node.error(err); } - else { - node.clientDb.collection(node.collection,function(err,coll) { - if (err) { node.error(err); } - else { - node.on("input",function(msg) { - if (node.operation == "store") { - delete msg._topic; - if (node.payonly) { - if (typeof msg.payload !== "object") { msg.payload = {"payload":msg.payload}; } - coll.save(msg.payload,function(err,item){ if (err){node.error(err);} }); - } - else coll.save(msg,function(err,item){if (err){node.error(err);}}); - } - else if (node.operation == "insert") { - delete msg._topic; - if (node.payonly) { - if (typeof msg.payload !== "object") { msg.payload = {"payload":msg.payload}; } - coll.insert(msg.payload,function(err,item){ if (err){node.error(err);} }); - } - else coll.insert(msg,function(err,item){if (err){node.error(err);}}); - } - if (node.operation == "delete") { - coll.remove(msg.payload, {w:1}, function(err, items){ if (err) node.error(err); }); - } - }); + MongoClient.connect(this.mongoConfig.url, function(err,db) { + if (err) { + node.error(err); + } else { + node.clientDb = db; + var coll = db.collection(node.collection); + node.on("input",function(msg) { + if (node.operation == "store") { + delete msg._topic; + if (node.payonly) { + if (typeof msg.payload !== "object") { msg.payload = {"payload":msg.payload}; } + coll.save(msg.payload,function(err,item){ if (err){node.error(err);} }); + } else { + coll.save(msg,function(err,item){if (err){node.error(err);}}); + } + } + else if (node.operation == "insert") { + delete msg._topic; + if (node.payonly) { + if (typeof msg.payload !== "object") { msg.payload = {"payload":msg.payload}; } + coll.insert(msg.payload,function(err,item){ if (err){node.error(err);} }); + } else { + coll.insert(msg,function(err,item){if (err){node.error(err);}}); + } + } + if (node.operation == "delete") { + coll.remove(msg.payload, {w:1}, function(err, items){ if (err) node.error(err); }); } }); } @@ -90,25 +143,25 @@ function MongoInNode(n) { if (this.mongoConfig) { var node = this; - this.clientDb = new mongo.Db(node.mongoConfig.db, new mongo.Server(node.mongoConfig.hostname, node.mongoConfig.port, {}), {w: 1}); - this.clientDb.open(function(err,cli) { - if (err) { node.error(err); } - else { - node.clientDb.collection(node.collection,function(err,coll) { - if (err) { node.error(err); } - else { - node.on("input",function(msg) { - msg.projection = msg.projection || {}; - coll.find(msg.payload,msg.projection).sort(msg.sort).limit(msg.limit).toArray(function(err, items) { - if (err) { node.error(err); } - msg.payload = items; - delete msg.projection; - delete msg.sort; - delete msg.limit; - node.send(msg); - }); - }); - } + MongoClient.connect(this.mongoConfig.url, function(err,db) { + if (err) { + node.error(err); + } else { + node.clientDb = db; + var coll = db.collection(node.collection); + node.on("input",function(msg) { + msg.projection = msg.projection || {}; + coll.find(msg.payload,msg.projection).sort(msg.sort).limit(msg.limit).toArray(function(err, items) { + if (err) { + node.error(err); + } else { + msg.payload = items; + delete msg.projection; + delete msg.sort; + delete msg.limit; + node.send(msg); + } + }); }); } });