mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Add support for credential-stored env var in subflow
This commit is contained in:
@@ -238,17 +238,25 @@ var api = module.exports = {
|
||||
if (!credentials) {
|
||||
return resolve({});
|
||||
}
|
||||
var definition = runtime.nodes.getCredentialDefinition(opts.type) || {};
|
||||
|
||||
var sendCredentials = {};
|
||||
for (var cred in definition) {
|
||||
if (definition.hasOwnProperty(cred)) {
|
||||
if (definition[cred].type == "password") {
|
||||
var key = 'has_' + cred;
|
||||
sendCredentials[key] = credentials[cred] != null && credentials[cred] !== '';
|
||||
continue;
|
||||
var cred;
|
||||
if (/^subflow(:|$)/.test(opts.type)) {
|
||||
for (cred in credentials) {
|
||||
if (credentials.hasOwnProperty(cred)) {
|
||||
sendCredentials['has_'+cred] = credentials[cred] != null && credentials[cred] !== '';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var definition = runtime.nodes.getCredentialDefinition(opts.type) || {};
|
||||
for (cred in definition) {
|
||||
if (definition.hasOwnProperty(cred)) {
|
||||
if (definition[cred].type == "password") {
|
||||
var key = 'has_' + cred;
|
||||
sendCredentials[key] = credentials[cred] != null && credentials[cred] !== '';
|
||||
continue;
|
||||
}
|
||||
sendCredentials[cred] = credentials[cred] || '';
|
||||
}
|
||||
sendCredentials[cred] = credentials[cred] || '';
|
||||
}
|
||||
}
|
||||
resolve(sendCredentials);
|
||||
|
@@ -341,33 +341,62 @@ var api = module.exports = {
|
||||
extract: function(node) {
|
||||
var nodeID = node.id;
|
||||
var nodeType = node.type;
|
||||
var cred;
|
||||
var newCreds = node.credentials;
|
||||
if (newCreds) {
|
||||
delete node.credentials;
|
||||
var savedCredentials = credentialCache[nodeID] || {};
|
||||
var dashedType = nodeType.replace(/\s+/g, '-');
|
||||
var definition = credentialsDef[dashedType];
|
||||
if (!definition) {
|
||||
log.warn(log._("nodes.credentials.not-registered",{type:nodeType}));
|
||||
return;
|
||||
}
|
||||
if (/^subflow(:|$)/.test(nodeType)) {
|
||||
for (cred in newCreds) {
|
||||
if (newCreds.hasOwnProperty(cred)) {
|
||||
if (newCreds[cred] === "__PWRD__") {
|
||||
continue;
|
||||
}
|
||||
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) {
|
||||
delete savedCredentials[cred];
|
||||
dirty = true;
|
||||
continue;
|
||||
}
|
||||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) {
|
||||
savedCredentials[cred] = newCreds[cred];
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
for (var cred in definition) {
|
||||
if (definition.hasOwnProperty(cred)) {
|
||||
if (newCreds[cred] === undefined) {
|
||||
continue;
|
||||
}
|
||||
if (definition[cred].type == "password" && newCreds[cred] == '__PWRD__') {
|
||||
continue;
|
||||
}
|
||||
for (cred in savedCredentials) {
|
||||
if (savedCredentials.hasOwnProperty(cred)) {
|
||||
if (!newCreds.hasOwnProperty(cred)) {
|
||||
delete savedCredentials[cred];
|
||||
dirty = true;
|
||||
}
|
||||
}
|
||||
if (0 === newCreds[cred].length || /^\s*$/.test(newCreds[cred])) {
|
||||
delete savedCredentials[cred];
|
||||
dirty = true;
|
||||
continue;
|
||||
}
|
||||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) {
|
||||
savedCredentials[cred] = newCreds[cred];
|
||||
dirty = true;
|
||||
}
|
||||
} else {
|
||||
var dashedType = nodeType.replace(/\s+/g, '-');
|
||||
var definition = credentialsDef[dashedType];
|
||||
if (!definition) {
|
||||
log.warn(log._("nodes.credentials.not-registered",{type:nodeType}));
|
||||
return;
|
||||
}
|
||||
|
||||
for (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];
|
||||
dirty = true;
|
||||
continue;
|
||||
}
|
||||
if (!savedCredentials.hasOwnProperty(cred) || JSON.stringify(savedCredentials[cred]) !== JSON.stringify(newCreds[cred])) {
|
||||
savedCredentials[cred] = newCreds[cred];
|
||||
dirty = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -22,6 +22,9 @@ const util = require("util");
|
||||
const redUtil = require("@node-red/util").util;
|
||||
const flowUtil = require("./util");
|
||||
|
||||
|
||||
const credentials = require("../credentials");
|
||||
|
||||
var Log;
|
||||
|
||||
/**
|
||||
@@ -38,6 +41,9 @@ function evaluateInputValue(value, type, node) {
|
||||
if (type === "bool") {
|
||||
return (value === "true") || (value === true);
|
||||
}
|
||||
if (type === "cred") {
|
||||
return value;
|
||||
}
|
||||
return redUtil.evaluateNodeProperty(value, type, node, null, null);
|
||||
}
|
||||
|
||||
@@ -142,10 +148,16 @@ class Subflow extends Flow {
|
||||
this.node_map = node_map;
|
||||
this.path = parent.path+"/"+(subflowInstance._alias||subflowInstance.id);
|
||||
|
||||
this.templateCredentials = credentials.get(subflowDef.id);
|
||||
this.instanceCredentials = credentials.get(this.id);
|
||||
|
||||
var env = [];
|
||||
if (this.subflowDef.env) {
|
||||
this.subflowDef.env.forEach(e => {
|
||||
env[e.name] = e;
|
||||
if (e.type === "cred") {
|
||||
e.value = this.templateCredentials[e.name];
|
||||
}
|
||||
});
|
||||
}
|
||||
if (this.subflowInstance.env) {
|
||||
@@ -154,7 +166,14 @@ class Subflow extends Flow {
|
||||
var ui = old ? old.ui : null;
|
||||
env[e.name] = e;
|
||||
if (ui) {
|
||||
env[e.name].ui = ui;
|
||||
env[e.name].ui = ui;
|
||||
}
|
||||
if (e.type === "cred") {
|
||||
if (!old || this.instanceCredentials.hasOwnProperty(e.name) ) {
|
||||
e.value = this.instanceCredentials[e.name];
|
||||
} else if (old) {
|
||||
e.value = this.templateCredentials[e.name];
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -324,7 +343,6 @@ class Subflow extends Flow {
|
||||
* @return {Object} val value of env var
|
||||
*/
|
||||
getSetting(name) {
|
||||
this.trace("getSetting:"+name);
|
||||
if (!/^\$parent\./.test(name)) {
|
||||
var env = this.env;
|
||||
var is_info = name.endsWith("_info");
|
||||
@@ -333,7 +351,6 @@ class Subflow extends Flow {
|
||||
|
||||
if (env && env.hasOwnProperty(ename)) {
|
||||
var val = env[ename];
|
||||
|
||||
if (is_type) {
|
||||
return val ? val.type : undefined;
|
||||
}
|
||||
|
Reference in New Issue
Block a user