node-red/red/runtime/nodes/credentials.js

179 lines
5.4 KiB
JavaScript
Raw Normal View History

2014-05-03 23:26:35 +02:00
/**
* Copyright 2014, 2016 IBM Corp.
2014-05-03 23:26:35 +02:00
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var when = require("when");
2014-05-03 23:26:35 +02:00
2015-02-03 23:02:26 +01:00
var log = require("../log");
2015-05-08 15:21:01 +02:00
2014-07-21 16:56:38 +02:00
var credentialCache = {};
var credentialsDef = {};
var dirty = false;
2014-07-21 16:56:38 +02:00
var api = module.exports = {
init: function() {
dirty = false;
credentialCache = {};
credentialsDef = {};
2014-05-03 23:26:35 +02:00
},
2014-07-21 16:56:38 +02:00
/**
* Sets the credentials from storage.
2014-07-21 16:56:38 +02:00
*/
load: function (credentials) {
credentialCache = credentials;
dirty = false;
return when.resolve();
// return storage.getCredentials().then(function (creds) {
// credentialCache = creds;
// }).otherwise(function (err) {
// log.warn(log._("nodes.credentials.error",{message: err}));
// });
2014-05-03 23:26:35 +02:00
},
2014-07-21 16:56:38 +02:00
/**
* Adds a set of credentials for the given node id.
* @param id the node id for the credentials
* @param creds an object of credential key/value pairs
* @return a promise for backwards compatibility TODO: can this be removed?
2014-07-21 16:56:38 +02:00
*/
add: function (id, creds) {
2014-07-21 16:56:38 +02:00
credentialCache[id] = creds;
dirty = true;
return when.resolve();
2014-05-03 23:26:35 +02:00
},
2014-07-21 16:56:38 +02:00
/**
* Gets the credentials for the given node id.
* @param id the node id for the credentials
* @return the credentials
*/
get: function (id) {
2014-07-21 16:56:38 +02:00
return credentialCache[id];
2014-05-03 23:26:35 +02:00
},
2014-07-21 16:56:38 +02:00
/**
* Deletes the credentials for the given node id.
* @param id the node id for the credentials
* @return a promise for the saving of credentials to storage
*/
delete: function (id) {
2014-07-21 16:56:38 +02:00
delete credentialCache[id];
dirty = true;
2014-05-03 23:26:35 +02:00
},
2014-07-21 16:56:38 +02:00
/**
* Deletes any credentials for nodes that no longer exist
* @param config a flow config
2014-07-21 16:56:38 +02:00
* @return a promise for the saving of credentials to storage
*/
clean: function (config) {
var existingIds = {};
config.forEach(function(n) {
existingIds[n.id] = true;
if (n.credentials) {
api.extract(n);
}
});
2014-05-03 23:26:35 +02:00
var deletedCredentials = false;
2014-07-21 16:56:38 +02:00
for (var c in credentialCache) {
if (credentialCache.hasOwnProperty(c)) {
if (!existingIds[c]) {
2014-07-02 00:46:25 +02:00
deletedCredentials = true;
2014-07-21 16:56:38 +02:00
delete credentialCache[c];
2014-07-02 00:46:25 +02:00
}
2014-05-03 23:26:35 +02:00
}
}
if (deletedCredentials) {
dirty = true;
2014-05-03 23:26:35 +02:00
}
return when.resolve();
},
2014-07-21 16:56:38 +02:00
/**
* Registers a node credential definition.
* @param type the node type
* @param definition the credential definition
*/
register: function (type, definition) {
var dashedType = type.replace(/\s+/g, '-');
credentialsDef[dashedType] = definition;
},
/**
2014-07-21 16:56:38 +02:00
* Extracts and stores any credential updates in the provided node.
* The provided node may have a .credentials property that contains
* new credentials for the node.
* This function loops through the credentials in the definition for
* the node-type and applies any of the updates provided in the node.
*
2014-07-21 16:56:38 +02:00
* This function does not save the credentials to disk as it is expected
* to be called multiple times when a new flow is deployed.
*
* @param node the node to extract credentials from
*/
2014-07-21 16:56:38 +02:00
extract: function(node) {
var nodeID = node.id;
var nodeType = node.type;
var newCreds = node.credentials;
if (newCreds) {
2015-12-09 22:51:46 +01:00
delete node.credentials;
2014-07-21 16:56:38 +02:00
var savedCredentials = credentialCache[nodeID] || {};
var dashedType = nodeType.replace(/\s+/g, '-');
var definition = credentialsDef[dashedType];
if (!definition) {
2015-05-08 15:21:01 +02:00
log.warn(log._("nodes.credentials.not-registered",{type:nodeType}));
2014-07-21 16:56:38 +02:00
return;
}
2014-07-21 16:56:38 +02:00
for (var cred in definition) {
if (definition.hasOwnProperty(cred)) {
if (newCreds[cred] === undefined) {
continue;
}
if (definition[cred].type == "password" && newCreds[cred] == '__PWRD__') {
continue;
}
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) {
delete savedCredentials[cred];
continue;
}
savedCredentials[cred] = newCreds[cred];
}
}
2014-07-21 16:56:38 +02:00
credentialCache[nodeID] = savedCredentials;
dirty = true;
}
},
/**
* Gets the credential definition for the given node type
* @param type the node type
* @return the credential definition
*/
getDefinition: function (type) {
return credentialsDef[type];
},
dirty: function() {
return dirty;
},
export: function() {
dirty = false;
return when.resolve(credentialCache);
2014-05-03 23:26:35 +02:00
}
}