mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
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:
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user