REST API for Credentials

Adding RED.nodes.registerCredentials to register the credentials definition server sided.
Adding the property credentials in the template definition client-side.

Connecting the editor to the credential API.
I added a TODO for the validation of Credentials field.
As the other field, the developer should be able to set the credentials as required and also give a validation function.
This commit is contained in:
Antoine Aflalo
2014-05-07 21:19:08 +03:00
parent 848e5a9824
commit 6a7b3cf62c
4 changed files with 184 additions and 64 deletions

View File

@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var clone = require("clone");
var flows = require("./flows");
var credentials = require('./credentials')
var comms = require("../comms");
function Node(n) {
@@ -120,5 +120,4 @@ Node.prototype.error = function(msg) {
Node.prototype.status = function(status,retain) {
comms.publish("status/"+this.id,status,retain);
}
module.exports = Node;

View File

@@ -18,33 +18,114 @@ var util = require("util");
var credentials = {};
var storage = null;
var credentialsDef = {};
var redApp = null;
var querystring = require('querystring');
var Credentials;
function getCredDef(type) {
var dashedType = type.replace(/\s+/g, '-');
return credentialsDef[dashedType];
}
function isRegistered(type) {
return getCredDef(type) != undefined;
}
function restPOST(type) {
redApp.post('/credentials/' + type + '/:id', function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
var nodeType = type;
var nodeID = req.params.id;
var newCreds = querystring.parse(body);
var credentials = Credentials.get(nodeID) || {};
var definition = getCredDef(nodeType);
for (var cred in definition) {
if (newCreds[cred] == undefined) {
continue;
}
if (definition[cred].type == "password" && newCreds[cred] == '__PWRD__') {
continue;
}
if (newCreds[cred] == '') {
delete credentials[cred];
}
credentials[cred] = newCreds[cred];
}
Credentials.add(nodeID, credentials);
res.send(200);
});
});
}
function restGET(type) {
redApp.get('/credentials/' + type + '/:id', function (req, res) {
var nodeType = type;
var nodeID = req.params.id;
var credentials = Credentials.get(nodeID);
if (credentials == undefined) {
res.json({});
return;
}
var definition = getCredDef(nodeType);
var sendCredentials = {};
for (var cred in definition) {
if (definition[cred].type == "password") {
var key = 'has' + cred;
sendCredentials[key] = credentials[cred] != null && credentials[cred] != '';
continue;
}
sendCredentials[cred] = credentials[cred] || '';
}
res.json(sendCredentials);
});
}
function restDELETE(type) {
redApp.delete('/credentials/' + type + '/:id', function (req, res) {
var nodeID = req.params.id;
Credentials.delete(nodeID);
res.send(200);
});
}
module.exports = {
init: function(_storage) {
init: function (_storage) {
storage = _storage;
redApp = require("../server").app;
Credentials = this;
},
load: function() {
return storage.getCredentials().then(function(creds) {
load: function () {
return storage.getCredentials().then(function (creds) {
credentials = creds;
}).otherwise(function(err) {
util.log("[red] Error loading credentials : "+err);
}).otherwise(function (err) {
util.log("[red] Error loading credentials : " + err);
});
},
add: function(id,creds) {
add: function (id, creds) {
credentials[id] = creds;
storage.saveCredentials(credentials);
},
get: function(id) {
get: function (id) {
return credentials[id];
},
delete: function(id) {
delete: function (id) {
delete credentials[id];
storage.saveCredentials(credentials);
},
clean: function(getNode) {
clean: function (getNode) {
var deletedCredentials = false;
for (var c in credentials) {
var n = getNode(c);
@@ -56,6 +137,13 @@ module.exports = {
if (deletedCredentials) {
storage.saveCredentials(credentials);
}
},
register: function (type, definition) {
var dashedType = type.replace(/\s+/g, '-');
credentialsDef[dashedType] = definition;
restDELETE(dashedType);
restGET(dashedType);
restPOST(dashedType);
}
}

View File

@@ -36,6 +36,7 @@ module.exports = {
addCredentials: credentials.add,
getCredentials: credentials.get,
deleteCredentials: credentials.delete,
registerCredentials: credentials.register,
createNode: createNode,
registerType: registry.registerType,
getType: registry.get,