diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/index.js b/packages/node_modules/@node-red/editor-api/lib/admin/index.js index 8406fa8e9..26eabe65b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/index.js @@ -14,8 +14,6 @@ * limitations under the License. **/ -var express = require("express"); - var nodes = require("./nodes"); var flows = require("./flows"); var flow = require("./flow"); @@ -37,18 +35,9 @@ module.exports = { plugins.init(runtimeAPI); diagnostics.init(settings, runtimeAPI); - var needsPermission = auth.needsPermission; - - var adminApp = express(); - - var defaultServerSettings = { - "x-powered-by": false - } - var serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{}); - for (var eOption in serverSettings) { - adminApp.set(eOption, serverSettings[eOption]); - } + const needsPermission = auth.needsPermission; + const adminApp = apiUtil.createExpressApp(settings) // Flows adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler); diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/index.js b/packages/node_modules/@node-red/editor-api/lib/editor/index.js index f210d90fe..42be1f270 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/index.js @@ -46,14 +46,15 @@ module.exports = { runtimeAPI = _runtimeAPI; needsPermission = auth.needsPermission; if (!settings.disableEditor) { - info.init(runtimeAPI); + info.init(settings, runtimeAPI); comms.init(server,settings,runtimeAPI); var ui = require("./ui"); ui.init(runtimeAPI); - var editorApp = express(); + const editorApp = apiUtil.createExpressApp(settings) + if (settings.requireHttps === true) { editorApp.enable('trust proxy'); editorApp.use(function (req, res, next) { @@ -86,7 +87,7 @@ module.exports = { //Projects var projects = require("./projects"); - projects.init(runtimeAPI); + projects.init(settings, runtimeAPI); editorApp.use("/projects",projects.app()); // Locales diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js index ad505a46e..5d1b2ff26 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/projects.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/projects.js @@ -14,9 +14,9 @@ * limitations under the License. **/ -var express = require("express"); var apiUtils = require("../util"); +var settings; var runtimeAPI; var needsPermission = require("../auth").needsPermission; @@ -77,11 +77,12 @@ function getProjectRemotes(req,res) { }) } module.exports = { - init: function(_runtimeAPI) { + init: function(_settings, _runtimeAPI) { + settings = _settings; runtimeAPI = _runtimeAPI; }, app: function() { - var app = express(); + var app = apiUtils.createExpressApp(settings) app.use(function(req,res,next) { runtimeAPI.projects.available().then(function(available) { diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js index 5fa2476e1..200ddf2c2 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js @@ -18,9 +18,9 @@ var runtimeAPI; var sshkeys = require("./sshkeys"); module.exports = { - init: function(_runtimeAPI) { + init: function(settings, _runtimeAPI) { runtimeAPI = _runtimeAPI; - sshkeys.init(runtimeAPI); + sshkeys.init(settings, runtimeAPI); }, userSettings: function(req, res) { var opts = { diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/sshkeys.js b/packages/node_modules/@node-red/editor-api/lib/editor/sshkeys.js index 6d1c62e11..08097571f 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/sshkeys.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/sshkeys.js @@ -17,13 +17,15 @@ var apiUtils = require("../util"); var express = require("express"); var runtimeAPI; +var settings; module.exports = { - init: function(_runtimeAPI) { + init: function(_settings, _runtimeAPI) { runtimeAPI = _runtimeAPI; + settings = _settings; }, app: function() { - var app = express(); + const app = apiUtils.createExpressApp(settings); // List all SSH keys app.get("/", function(req,res) { diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index c21a7e6e7..c3e8f975e 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -19,6 +19,7 @@ var util = require("util"); var path = require("path"); var fs = require("fs"); var clone = require("clone"); +const apiUtil = require("../util") var defaultContext = { page: { @@ -27,8 +28,7 @@ var defaultContext = { tabicon: { icon: "red/images/node-red-icon-black.svg", colour: "#8f0000" - }, - version: require(path.join(__dirname,"../../package.json")).version + } }, header: { title: "Node-RED", @@ -40,6 +40,7 @@ var defaultContext = { vendorMonaco: "" } }; +var settings; var theme = null; var themeContext = clone(defaultContext); @@ -92,7 +93,8 @@ function serveFilesFromTheme(themeValue, themeApp, directory, baseDirectory) { } module.exports = { - init: function(settings, _runtimeAPI) { + init: function(_settings, _runtimeAPI) { + settings = _settings; runtimeAPI = _runtimeAPI; themeContext = clone(defaultContext); if (process.env.NODE_ENV == "development") { @@ -113,7 +115,15 @@ module.exports = { var url; themeSettings = {}; - themeApp = express(); + themeApp = apiUtil.createExpressApp(settings); + + const defaultServerSettings = { + "x-powered-by": false + } + const serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{}); + for (const eOption in serverSettings) { + themeApp.set(eOption, serverSettings[eOption]); + } if (theme.page) { diff --git a/packages/node_modules/@node-red/editor-api/lib/index.js b/packages/node_modules/@node-red/editor-api/lib/index.js index 56f52a222..d9f34eafd 100644 --- a/packages/node_modules/@node-red/editor-api/lib/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/index.js @@ -37,7 +37,6 @@ var adminApp; var server; var editor; - /** * Initialise the module. * @param {Object} settings The runtime settings @@ -49,7 +48,7 @@ var editor; function init(settings,_server,storage,runtimeAPI) { server = _server; if (settings.httpAdminRoot !== false) { - adminApp = express(); + adminApp = apiUtil.createExpressApp(settings); var cors = require('cors'); var corsHandler = cors({ @@ -64,14 +63,6 @@ function init(settings,_server,storage,runtimeAPI) { } } - var defaultServerSettings = { - "x-powered-by": false - } - var serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{}); - for (var eOption in serverSettings) { - adminApp.set(eOption, serverSettings[eOption]); - } - auth.init(settings,storage); var maxApiRequestSize = settings.apiMaxLength || '5mb'; @@ -136,10 +127,11 @@ async function stop() { editor.stop(); } } + module.exports = { - init: init, - start: start, - stop: stop, + init, + start, + stop, /** * @memberof @node-red/editor-api diff --git a/packages/node_modules/@node-red/editor-api/lib/util.js b/packages/node_modules/@node-red/editor-api/lib/util.js index 621fd9e33..f1420235a 100644 --- a/packages/node_modules/@node-red/editor-api/lib/util.js +++ b/packages/node_modules/@node-red/editor-api/lib/util.js @@ -14,10 +14,9 @@ * limitations under the License. **/ +const express = require("express"); -var log = require("@node-red/util").log; // TODO: separate module -var i18n = require("@node-red/util").i18n; // TODO: separate module - +const { log, i18n } = require("@node-red/util"); module.exports = { errorHandler: function(err,req,res,next) { @@ -64,5 +63,17 @@ module.exports = { path: req.path, ip: (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined } + }, + createExpressApp: function(settings) { + const app = express(); + + const defaultServerSettings = { + "x-powered-by": false + } + const serverSettings = Object.assign({},defaultServerSettings,settings.httpServerOptions||{}); + for (let eOption in serverSettings) { + app.set(eOption, serverSettings[eOption]); + } + return app } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 84a1f4dad..1d08e9dd8 100644 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -504,6 +504,7 @@ "unassigned": "未割当", "global": "グローバル", "workspace": "ワークスペース", + "editor": "編集ダイアログ", "selectAll": "全てのノードを選択", "selectNone": "選択を外す", "selectAllConnected": "接続されたノードを選択", @@ -1203,7 +1204,7 @@ "fr": "フランス語", "ja": "日本語", "ko": "韓国語", - "pt-BR":"ポルトガル語", + "pt-BR": "ポルトガル語", "ru": "ロシア語", "zh-CN": "中国語(簡体)", "zh-TW": "中国語(繁体)" diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index d5c787c24..01a993a75 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -37,13 +37,13 @@ RED.clipboard = (function() { // IE11 workaround // IE does not support data uri scheme for downloading data var blob = new Blob([data], { - type: "data:text/plain;charset=utf-8" + type: "data:application/json;charset=utf-8" }); navigator.msSaveBlob(blob, file); } else { var element = document.createElement('a'); - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)); + element.setAttribute('href', 'data:application/json;charset=utf-8,' + encodeURIComponent(data)); element.setAttribute('download', file); element.style.display = 'none'; document.body.appendChild(element); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js b/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js index db1a8e86f..998484858 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/env-var.js @@ -50,7 +50,11 @@ RED.envVar = (function() { var new_env = []; var items = list.editableList('items'); var credentials = gconf ? gconf.credentials : null; - + if (!gconf && list.editableList('length') === 0) { + // No existing global-config node and nothing in the list, + // so no need to do anything more + return + } if (!credentials) { credentials = { _ : {}, @@ -78,6 +82,12 @@ RED.envVar = (function() { if (gconf === null) { gconf = getGlobalConf(true); } + if (!gconf.credentials) { + gconf.credentials = { + _ : {}, + map: {} + }; + } if ((JSON.stringify(new_env) !== JSON.stringify(gconf.env)) || (JSON.stringify(credentials) !== JSON.stringify(gconf.credentials))) { gconf.env = new_env; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index ec59c231a..2909e8182 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2606,6 +2606,16 @@ RED.view = (function() { var result = RED.nodes.removeJunction(node) removedJunctions.push(node); removedLinks = removedLinks.concat(result.links); + if (node.g) { + var group = RED.nodes.group(node.g); + if (selectedGroups.indexOf(group) === -1) { + // Don't use RED.group.removeFromGroup as that emits + // a change event on the node - but we're deleting it + var index = group.nodes.indexOf(node); + group.nodes.splice(index,1); + RED.group.markDirty(group); + } + } } else { if (node.direction === "out") { removedSubflowOutputs.push(node); diff --git a/packages/node_modules/@node-red/nodes/core/function/rbe.js b/packages/node_modules/@node-red/nodes/core/function/rbe.js index eb526a441..34a8e91ed 100644 --- a/packages/node_modules/@node-red/nodes/core/function/rbe.js +++ b/packages/node_modules/@node-red/nodes/core/function/rbe.js @@ -35,7 +35,11 @@ module.exports = function(RED) { } else { node.previous = {}; } } - var value = RED.util.getMessageProperty(msg,node.property); + var value; + try { + value = RED.util.getMessageProperty(msg,node.property); + } + catch(e) { } if (value !== undefined) { var t = "_no_topic"; if (node.septopics) { t = topic || t; } diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json index 3b5e3d6a4..a5736c60e 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -414,6 +414,7 @@ "port": "ポート", "keepalive": "キープアライブ時間", "cleansession": "セッションの初期化", + "autoUnsubscribe": "切断時に購読を自動解除", "cleanstart": "クリーンスタート", "use-tls": "TLSを使用", "tls-config": "TLS設定", diff --git a/packages/node_modules/@node-red/runtime/lib/index.js b/packages/node_modules/@node-red/runtime/lib/index.js index a886cd2ca..74f03c55c 100644 --- a/packages/node_modules/@node-red/runtime/lib/index.js +++ b/packages/node_modules/@node-red/runtime/lib/index.js @@ -89,6 +89,15 @@ function init(userSettings,httpServer,_adminApi) { nodeApp = express(); adminApp = express(); + const defaultServerSettings = { + "x-powered-by": false + } + const serverSettings = Object.assign({},defaultServerSettings,userSettings.httpServerOptions||{}); + for (let eOption in serverSettings) { + nodeApp.set(eOption, serverSettings[eOption]); + adminApp.set(eOption, serverSettings[eOption]); + } + if (_adminApi) { adminApi = _adminApi; diff --git a/test/nodes/core/common/20-inject_spec.js b/test/nodes/core/common/20-inject_spec.js index a4dbdd9e4..3e9a35391 100644 --- a/test/nodes/core/common/20-inject_spec.js +++ b/test/nodes/core/common/20-inject_spec.js @@ -854,7 +854,7 @@ describe('inject node', function() { }); n1.on("call:error", function(err) { count++; - if (count == 2) { + if (count == 1) { done(); } }); diff --git a/test/unit/@node-red/editor-api/lib/editor/index_spec.js b/test/unit/@node-red/editor-api/lib/editor/index_spec.js index 8ed4d88f3..2c11acbc3 100644 --- a/test/unit/@node-red/editor-api/lib/editor/index_spec.js +++ b/test/unit/@node-red/editor-api/lib/editor/index_spec.js @@ -61,12 +61,14 @@ describe("api/editor/index", function() { sinon.stub(NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/"+m),"init").callsFake(function(){}); }); sinon.stub(NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/theme"),"app").callsFake(function(){ return express()}); + sinon.stub(NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/settings"),"sshkeys").callsFake(function(){ return express()}); }); after(function() { mockList.forEach(function(m) { NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/"+m).init.restore(); }) NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/theme").app.restore(); + NR_TEST_UTILS.require("@node-red/editor-api/lib/editor/settings").sshkeys.restore(); auth.needsPermission.restore(); log.error.restore(); }); diff --git a/test/unit/@node-red/editor-api/lib/editor/settings_spec.js b/test/unit/@node-red/editor-api/lib/editor/settings_spec.js index 171dca564..19f72977a 100644 --- a/test/unit/@node-red/editor-api/lib/editor/settings_spec.js +++ b/test/unit/@node-red/editor-api/lib/editor/settings_spec.js @@ -41,7 +41,7 @@ describe("api/editor/settings", function() { }); it('returns the user settings', function(done) { - info.init({ + info.init({}, { settings: { getUserSettings: function(opts) { if (opts.user !== "fred") { @@ -67,7 +67,7 @@ describe("api/editor/settings", function() { }); it('updates the user settings', function(done) { var update; - info.init({ + info.init({}, { settings: { updateUserSettings: function(opts) { if (opts.user !== "fred") { diff --git a/test/unit/@node-red/editor-api/lib/editor/sshkeys_spec.js b/test/unit/@node-red/editor-api/lib/editor/sshkeys_spec.js index 1647cd99d..75e8063f6 100644 --- a/test/unit/@node-red/editor-api/lib/editor/sshkeys_spec.js +++ b/test/unit/@node-red/editor-api/lib/editor/sshkeys_spec.js @@ -34,7 +34,7 @@ describe("api/editor/sshkeys", function() { } } before(function() { - sshkeys.init(mockRuntime); + sshkeys.init({}, mockRuntime); app = express(); app.use(bodyParser.json()); app.use("/settings/user/keys", sshkeys.app());