diff --git a/nodes/core/io/05-tls.html b/nodes/core/io/05-tls.html index 5de7e99c4..b28ab7314 100644 --- a/nodes/core/io/05-tls.html +++ b/nodes/core/io/05-tls.html @@ -15,17 +15,45 @@ --> diff --git a/nodes/core/io/05-tls.js b/nodes/core/io/05-tls.js index a0929d988..a93ed1b39 100644 --- a/nodes/core/io/05-tls.js +++ b/nodes/core/io/05-tls.js @@ -21,34 +21,65 @@ module.exports = function(RED) { function TLSConfig(n) { RED.nodes.createNode(this,n); this.valid = true; + this.verifyservercert = n.verifyservercert; var certPath = n.cert.trim(); var keyPath = n.key.trim(); var caPath = n.ca.trim(); - if ( (certPath.length > 0) !== (keyPath.length > 0)) { - this.valid = false; - this.error(RED._("tls.error.missing-file")); - return; - } - this.verifyservercert = n.verifyservercert; + if ((certPath.length > 0) || (keyPath.length > 0)) { - try { - if (certPath) { - this.cert = fs.readFileSync(certPath); + if ( (certPath.length > 0) !== (keyPath.length > 0)) { + this.valid = false; + this.error(RED._("tls.error.missing-file")); + return; } - if (keyPath) { - this.key = fs.readFileSync(keyPath); + + try { + if (certPath) { + this.cert = fs.readFileSync(certPath); + } + if (keyPath) { + this.key = fs.readFileSync(keyPath); + } + if (caPath) { + this.ca = fs.readFileSync(caPath); + } + } catch(err) { + this.valid = false; + this.error(err.toString()); + return; + } + } else { + if (this.credentials) { + var certData = this.credentials.certdata || ""; + var keyData = this.credentials.keydata || ""; + var caData = this.credentials.cadata || ""; + + if ((certData.length > 0) !== (keyData.length > 0)) { + this.valid = false; + this.error(RED._("tls.error.missing-file")); + return; + } + + if (certData) { + this.cert = certData; + } + if (keyData) { + this.key = keyData; + } + if (caData) { + this.ca = caData; + } } - if (caPath) { - this.ca = fs.readFileSync(caPath); - } - } catch(err) { - this.valid = false; - this.error(err.toString()); - return; } } - RED.nodes.registerType("tls-config",TLSConfig); + RED.nodes.registerType("tls-config", TLSConfig, { + credentials: { + certdata: {type:"text"}, + keydata: {type:"text"}, + cadata: {type:"text"} + } + }); TLSConfig.prototype.addTLSOptions = function(opts) { if (this.valid) { diff --git a/nodes/core/locales/en-US/messages.json b/nodes/core/locales/en-US/messages.json index 0ad39f7a8..448382e4a 100644 --- a/nodes/core/locales/en-US/messages.json +++ b/nodes/core/locales/en-US/messages.json @@ -126,6 +126,8 @@ "tls": { "tls": "TLS configuration", "label": { + "use-local-files": "Use key and certificates from local files", + "upload": "Upload", "cert": "Certificate", "key": "Private Key", "ca": "CA Certificate", diff --git a/red/api/info.js b/red/api/info.js index e2661bdc3..72ec52b93 100644 --- a/red/api/info.js +++ b/red/api/info.js @@ -43,6 +43,10 @@ module.exports = { safeSettings.flowFilePretty = settings.flowFilePretty; } + if (settings.tlsDisableLocalFiles) { + safeSettings.tlsDisableLocalFiles = settings.tlsDisableLocalFiles; + } + if (!runtime.nodes.paletteEditorEnabled()) { safeSettings.editorTheme = safeSettings.editorTheme || {}; safeSettings.editorTheme.palette = safeSettings.editorTheme.palette || {}; diff --git a/settings.js b/settings.js index 79e8839f7..6b9228343 100644 --- a/settings.js +++ b/settings.js @@ -47,6 +47,10 @@ module.exports = { // The maximum length, in characters, of any message sent to the debug sidebar tab debugMaxLength: 1000, + // To disable the option for using local files for storing keys and certificates in the TLS configuration + // node, set this to true + //tlsDisableLocalFiles:true, + // Colourise the console output of the debug node //debugUseColors: true,