From 3123a5ee510e601063ac3ac74b8f5be88a4c5f4f Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Tue, 14 Nov 2023 20:44:04 +0000 Subject: [PATCH 01/18] Feat: Add ability to set headers for WebSocket client --- .../nodes/core/network/22-websocket.html | 201 +++++++++++++++++- .../nodes/core/network/22-websocket.js | 41 ++++ .../@node-red/nodes/locales/de/messages.json | 3 +- .../nodes/locales/en-US/messages.json | 3 +- .../@node-red/nodes/locales/fr/messages.json | 3 +- .../@node-red/nodes/locales/ja/messages.json | 3 +- .../@node-red/nodes/locales/ko/messages.json | 3 +- .../nodes/locales/pt-BR/messages.json | 3 +- .../@node-red/nodes/locales/ru/messages.json | 3 +- .../nodes/locales/zh-CN/messages.json | 3 +- .../nodes/locales/zh-TW/messages.json | 3 +- 11 files changed, 258 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html index eae52b5fb..2976342cb 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html @@ -40,6 +40,92 @@ (function() { + const headerTypes = [ + { value: "Accept", label: "Accept", hasValue: false }, + { value: "Accept-Encoding", label: "Accept-Encoding", hasValue: false }, + { value: "Accept-Language", label: "Accept-Language", hasValue: false }, + { value: "Authorization", label: "Authorization", hasValue: false }, + { value: "Content-Type", label: "Content-Type", hasValue: false }, + { value: "Cache-Control", label: "Cache-Control", hasValue: false }, + { value: "User-Agent", label: "User-Agent", hasValue: false }, + { value: "Location", label: "Location", hasValue: false }, + { value: "other", label: RED._("node-red:httpin.label.other"), + hasValue: true, icon: "red/images/typedInput/az.svg" }, + ] + + const headerOptions = {}; + const defaultOptions = [ + { value: "other", label: RED._("node-red:httpin.label.other"), + hasValue: true, icon: "red/images/typedInput/az.svg" }, + { value: "global", label: "global.", hasValue: true }, + { value: "env", label: "env", hasValue: true }, + ]; + headerOptions["accept"] = [ + { value: "text/plain", label: "text/plain", hasValue: false }, + { value: "text/html", label: "text/html", hasValue: false }, + { value: "application/json", label: "application/json", hasValue: false }, + { value: "application/xml", label: "application/xml", hasValue: false }, + ...defaultOptions, + ]; + headerOptions["accept-encoding"] = [ + { value: "gzip", label: "gzip", hasValue: false }, + { value: "deflate", label: "deflate", hasValue: false }, + { value: "compress", label: "compress", hasValue: false }, + { value: "br", label: "br", hasValue: false }, + { value: "gzip, deflate", label: "gzip, deflate", hasValue: false }, + { value: "gzip, deflate, br", label: "gzip, deflate, br", hasValue: false }, + ...defaultOptions, + ]; + headerOptions["accept-language"] = [ + { value: "*", label: "*", hasValue: false }, + { value: "en-GB, en-US, en;q=0.9", label: "en-GB, en-US, en;q=0.9", hasValue: false }, + { value: "de-AT, de-DE;q=0.9, en;q=0.5", label: "de-AT, de-DE;q=0.9, en;q=0.5", hasValue: false }, + { value: "es-mx,es,en;q=0.5", label: "es-mx,es,en;q=0.5", hasValue: false }, + { value: "fr-CH, fr;q=0.9, en;q=0.8", label: "fr-CH, fr;q=0.9, en;q=0.8", hasValue: false }, + { value: "zh-CN, zh-TW; q = 0.9, zh-HK; q = 0.8, zh; q = 0.7, en; q = 0.6", label: "zh-CN, zh-TW; q = 0.9, zh-HK; q = 0.8, zh; q = 0.7, en; q = 0.6", hasValue: false }, + { value: "ja-JP, jp", label: "ja-JP, jp", hasValue: false }, + ...defaultOptions, + ]; + headerOptions["content-type"] = [ + { value: "text/css", label: "text/css", hasValue: false }, + { value: "text/plain", label: "text/plain", hasValue: false }, + { value: "text/html", label: "text/html", hasValue: false }, + { value: "application/json", label: "application/json", hasValue: false }, + { value: "application/octet-stream", label: "application/octet-stream", hasValue: false }, + { value: "application/pdf", label: "application/pdf", hasValue: false }, + { value: "application/xml", label: "application/xml", hasValue: false }, + { value: "application/zip", label: "application/zip", hasValue: false }, + { value: "multipart/form-data", label: "multipart/form-data", hasValue: false }, + { value: "audio/aac", label: "audio/aac", hasValue: false }, + { value: "audio/ac3", label: "audio/ac3", hasValue: false }, + { value: "audio/basic", label: "audio/basic", hasValue: false }, + { value: "audio/mp4", label: "audio/mp4", hasValue: false }, + { value: "audio/ogg", label: "audio/ogg", hasValue: false }, + { value: "image/bmp", label: "image/bmp", hasValue: false }, + { value: "image/gif", label: "image/gif", hasValue: false }, + { value: "image/jpeg", label: "image/jpeg", hasValue: false }, + { value: "image/png", label: "image/png", hasValue: false }, + { value: "image/tiff", label: "image/tiff", hasValue: false }, + ...defaultOptions, + ]; + headerOptions["cache-control"] = [ + { value: "max-age=0", label: "max-age=0", hasValue: false }, + { value: "max-age=86400", label: "max-age=86400", hasValue: false }, + { value: "no-cache", label: "no-cache", hasValue: false }, + ...defaultOptions, + ]; + + headerOptions["user-agent"] = [ + { value: "Mozilla/5.0", label: "Mozilla/5.0", hasValue: false }, + ...defaultOptions, + ]; + + function getHeaderOptions(headerName) { + const lc = (headerName || "").toLowerCase(); + let opts = headerOptions[lc]; + return opts || defaultOptions; + } + function ws_oneditprepare() { $("#websocket-client-row").hide(); $("#node-input-mode").on("change", function() { @@ -192,7 +278,8 @@ value: "", label:RED._("node-red:websocket.sendheartbeat"), validate: RED.validators.number(/*blank allowed*/true) }, - subprotocol: {value:"",required: false} + subprotocol: {value:"",required: false}, + headers: { value: [] } }, inputs:0, outputs:0, @@ -200,6 +287,9 @@ return this.path; }, oneditprepare: function() { + + const node = this; + $("#node-config-input-path").on("change keyup paste",function() { $(".node-config-row-tls").toggle(/^wss:/i.test($(this).val())) }); @@ -214,14 +304,114 @@ if (!heartbeatActive) { $("#node-config-input-hb").val(""); } + + const hasMatch = function (arr, value) { + return arr.some(function (ht) { + return ht.value === value + }); + } + + const headerList = $("#node-input-headers-container").css('min-height', '150px').css('min-width', '450px').editableList({ + addItem: function (container, i, header) { + const row = $('
').css({ + overflow: 'hidden', + whiteSpace: 'nowrap', + display: 'flex' + }).appendTo(container); + const propertNameCell = $('
').css({ 'flex-grow': 1 }).appendTo(row); + const propertyName = $('', { class: "node-input-header-name", type: "text", style: "width: 100%" }) + .appendTo(propertNameCell) + .typedInput({ types: headerTypes }); + + const propertyValueCell = $('
').css({ 'flex-grow': 1, 'margin-left': '10px' }).appendTo(row); + const propertyValue = $('', { class: "node-input-header-value", type: "text", style: "width: 100%" }) + .appendTo(propertyValueCell) + .typedInput({ + types: getHeaderOptions(header.keyType) + }); + + const setup = function(_header) { + const headerTypeIsAPreset = function(h) {return hasMatch(headerTypes, h) }; + const headerValueIsAPreset = function(h, v) {return hasMatch(getHeaderOptions(h), v) }; + + const {keyType, keyValue, valueType, valueValue} = header; + + if(keyType == "other") { + propertyName.typedInput('type', keyType); + propertyName.typedInput('value', keyValue); + } else if (headerTypeIsAPreset(keyType)) { + propertyName.typedInput('type', keyType); + } else { + propertyName.typedInput('type', "other"); + propertyName.typedInput('value', keyValue); + } + + if(valueType == "other" || valueType == "flow" || valueType == "global" || valueType == "env" ) { + propertyValue.typedInput('type', valueType); + propertyValue.typedInput('value', valueValue); + } else if (headerValueIsAPreset(propertyName.typedInput('type'), valueType)) { + propertyValue.typedInput('type', valueType); + } else { + propertyValue.typedInput('type', "other"); + propertyValue.typedInput('value', valueValue); + } + } + setup(header); + + propertyName.on('change', function (event) { + propertyValue.typedInput('types', getHeaderOptions(propertyName.typedInput('type'))); + }); + + }, + sortable: true, + removable: true + }); + if (node.headers) { + for (let index = 0; index < node.headers.length; index++) { + const element = node.headers[index]; + headerList.editableList('addItem', node.headers[index]); + } + } }, oneditsave: function() { + + const node = this; + if (!/^wss:/i.test($("#node-config-input-path").val())) { $("#node-config-input-tls").val("_ADD_"); } if (!$("#node-config-input-hb-cb").prop("checked")) { $("#node-config-input-hb").val("0"); } + + const headers = $("#node-input-headers-container").editableList('items'); + + node.headers = []; + headers.each(function(i) { + const header = $(this); + const keyType = header.find(".node-input-header-name").typedInput('type'); + const keyValue = header.find(".node-input-header-name").typedInput('value'); + const valueType = header.find(".node-input-header-value").typedInput('type'); + const valueValue = header.find(".node-input-header-value").typedInput('value'); + node.headers.push({ + keyType, keyValue, valueType, valueValue + }) + + }); + }, + oneditresize: function(size) { + const dlg = $("#dialog-form"); + const expandRow = dlg.find('.node-input-headers-container-row'); + let height = dlg.height() - 5; + if(expandRow && expandRow.length){ + const siblingRows = dlg.find('> .form-row:not(.node-input-headers-container-row)'); + for (let i = 0; i < siblingRows.size(); i++) { + const cr = $(siblingRows[i]); + if(cr.is(":visible")) + height -= cr.outerHeight(true); + } + $("#node-input-headers-container").editableList('height',height); + } } }); @@ -299,8 +489,15 @@
+
+ +
+
+
    +

    - +

    +
    diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index d2a862a46..acceabda0 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -58,6 +58,7 @@ module.exports = function(RED) { node.isServer = !/^ws{1,2}:\/\//i.test(node.path); node.closing = false; node.tls = n.tls; + node.upgradeHeaders = n.headers if (n.hb) { var heartbeat = parseInt(n.hb); @@ -96,6 +97,46 @@ module.exports = function(RED) { tlsNode.addTLSOptions(options); } } + + // We need to check if undefined, to guard against previous installs, that will not have had this property set (applies to 3.1.x setups) + // Else this will be breaking potentially + if(node.upgradeHeaders !== undefined && node.upgradeHeaders.length > 0){ + options.headers = {}; + for(let i = 0;ipayload die Daten, die über einen WebSocket gesendet oder von einem WebSocket empfangen werden. Der Empfänger (Listener) kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge (string) sendet oder empfängt.", "path2": "Dieser Pfad ist relativ zu __path__.", "url1": "URL sollte ws:// oder wss:// Schema verwenden und auf einen vorhandenen WebSocket-Listener verweisen.", - "url2": "Standardmäßig enthält payload die Daten, die über einen WebSocket gesendet oder von einem WebSocket empfangen werden. Der Client kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge (string) sendet oder empfängt." + "url2": "Standardmäßig enthält payload die Daten, die über einen WebSocket gesendet oder von einem WebSocket empfangen werden. Der Client kann so konfiguriert werden, dass er das gesamte Nachrichtenobjekt als eine JSON-formatierte Zeichenfolge (string) sendet oder empfängt.", + "headers": "Header werden nur während des Protokollaktualisierungsmechanismus übermittelt, von HTTP auf das WS/WSS-Protokoll." }, "status": { "connected": "Verbunden __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index a7b583878..3df30b9c9 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -586,7 +586,8 @@ "path1": "By default, payload will contain the data to be sent over, or received from a websocket. The listener can be configured to send or receive the entire message object as a JSON formatted string.", "path2": "This path will be relative to __path__.", "url1": "URL should use ws:// or wss:// scheme and point to an existing websocket listener.", - "url2": "By default, payload will contain the data to be sent over, or received from a websocket. The client can be configured to send or receive the entire message object as a JSON formatted string." + "url2": "By default, payload will contain the data to be sent over, or received from a websocket. The client can be configured to send or receive the entire message object as a JSON formatted string.", + "headers": "Headers are only submitted during the Protocol upgrade mechanism, from HTTP to the WS/WSS Protocol." }, "status": { "connected": "connected __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/fr/messages.json b/packages/node_modules/@node-red/nodes/locales/fr/messages.json index 7890ce9a2..009c52331 100644 --- a/packages/node_modules/@node-red/nodes/locales/fr/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/fr/messages.json @@ -583,7 +583,8 @@ "path1": "Par défaut, payload contiendra les données à envoyer ou à recevoir d'un websocket. L'écouteur peut être configuré pour envoyer ou recevoir l'intégralité de l'objet message sous forme de chaîne au format JSON.", "path2": "Ce chemin sera relatif à __path__.", "url1": "L'URL doit utiliser le schéma ws:// ou wss:// et pointer vers un écouteur websocket existant.", - "url2": "Par défaut, payload contiendra les données à envoyer ou à recevoir d'un websocket. Le client peut être configuré pour envoyer ou recevoir l'intégralité de l'objet message sous forme de chaîne au format JSON." + "url2": "Par défaut, payload contiendra les données à envoyer ou à recevoir d'un websocket. Le client peut être configuré pour envoyer ou recevoir l'intégralité de l'objet message sous forme de chaîne au format JSON.", + "headers": "Les en-têtes ne sont soumis que lors du mécanisme de mise à niveau du protocole, de HTTP vers le protocole WS/WSS." }, "status": { "connected": "__count__ connecté", 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 c1a3c9262..48b95c93f 100644 --- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json @@ -586,7 +586,8 @@ "path1": "標準では payload がwebsocketから送信、受信されるデータを持ちます。クライアントはJSON形式の文字列としてメッセージ全体を送信、受信するよう設定できます。", "path2": "このパスは __path__ の相対パスになります。", "url1": "URLには ws:// または wss:// スキーマを使用して、存在するwebsocketリスナを設定してください。", - "url2": "標準では payload がwebsocketから送信、受信されるデータを持ちます。クライアントはJSON形式の文字列としてメッセージ全体を送信、受信するよう設定できます。" + "url2": "標準では payload がwebsocketから送信、受信されるデータを持ちます。クライアントはJSON形式の文字列としてメッセージ全体を送信、受信するよう設定できます。", + "headers": "ヘッダーは、HTTP から WS/WSS プロトコルへのプロトコル アップグレード メカニズム中にのみ送信されます。" }, "status": { "connected": "接続数 __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/ko/messages.json b/packages/node_modules/@node-red/nodes/locales/ko/messages.json index c0f57591f..c82e0f51b 100644 --- a/packages/node_modules/@node-red/nodes/locales/ko/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ko/messages.json @@ -451,7 +451,8 @@ "path1": "표준으로는 payload 가 websocket에서 송신, 수신된 데이터를 기다립니다. 클라이언트는 JSON형식의 문자열로 메세지전체를 송신, 수신하도록 설정할 수 있습니다.", "path2": "This path will be relative to __path__.", "url1": "URL에는 ws:// 또는 wss:// 스키마를 사용하여, 존재하는 websocket리스너를 설정해 주세요.", - "url2": "표준으로는 payload 가 websocket에서 송신,수신될 데이터를 기다립니다.클라이언트는 JSON형식의 문자열로 메세지전체를 송신, 수신하도록 설정할 수 있습니다." + "url2": "표준으로는 payload 가 websocket에서 송신,수신될 데이터를 기다립니다.클라이언트는 JSON형식의 문자열로 메세지전체를 송신, 수신하도록 설정할 수 있습니다.", + "headers": "헤더는 HTTP에서 WS/WSS 프로토콜로 프로토콜 업그레이드 메커니즘 중에만 제출됩니다." }, "status": { "connected": "접속 수 __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json index 00058ddf3..274053bc6 100644 --- a/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/pt-BR/messages.json @@ -573,7 +573,8 @@ "path1": "Por padrão, a carga útil conterá os dados a serem enviados ou recebidos de um websocket. O ouvinte pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON.", "path2": "Este caminho será relativo a __path__.", "url1": "A URL deve usar o esquema ws:// ou wss:// e apontar para um ouvinte de websocket existente.", - "url2": "Por padrão, carga útil conterá os dados a serem enviados ou recebidos de um websocket. O cliente pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON." + "url2": "Por padrão, carga útil conterá os dados a serem enviados ou recebidos de um websocket. O cliente pode ser configurado para enviar ou receber todo o objeto de mensagem como uma cadeia de caracteres formatada em JSON.", + "headers": "Os cabeçalhos são enviados apenas durante o mecanismo de atualização do protocolo, do HTTP para o protocolo WS/WSS." }, "status": { "connected": "conectado __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/ru/messages.json b/packages/node_modules/@node-red/nodes/locales/ru/messages.json index 58ccf90fe..d2bb5777e 100644 --- a/packages/node_modules/@node-red/nodes/locales/ru/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/ru/messages.json @@ -475,7 +475,8 @@ "path1": "По умолчанию payload будет содержать данные, которые будут отправлены или получены из websocket. Слушатель может быть настроен на отправку или получение всего объекта сообщения в виде строки в формате JSON.", "path2": "Путь будет относительно __path__.", "url1": "URL должен использовать схему ws:// или wss:// и указывать на существующего слушателя websocket.", - "url2": "По умолчанию payload будет содержать данные, которые будут отправлены или получены из websocket. Клиент может быть настроен на отправку или получение всего объекта сообщения в виде строки в формате JSON." + "url2": "По умолчанию payload будет содержать данные, которые будут отправлены или получены из websocket. Клиент может быть настроен на отправку или получение всего объекта сообщения в виде строки в формате JSON.", + "headers": "Заголовки передаются только во время механизма обновления протокола с HTTP на протокол WS/WSS." }, "status": { "connected": "подключен __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json index 3d0cf8007..7a0ea4ae4 100644 --- a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json @@ -576,7 +576,8 @@ "path1": "默认情况下,payload将包含要发送或从Websocket接收的数据。侦听器可以配置为以JSON格式的字符串发送或接收整个消息对象.", "path2": "这条路径将相对于 __path__.", "url1": "URL 应该使用ws://或者wss://方案并指向现有的websocket侦听器.", - "url2": "默认情况下,payload 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象." + "url2": "默认情况下,payload 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象.", + "headers": "标头仅在协议升级机制期间提交,从 HTTP 到 WS/WSS 协议." }, "status": { "connected": "已连接数量 __count__", diff --git a/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json index d63c47865..f43531fb1 100644 --- a/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json @@ -471,7 +471,8 @@ "path1": "預設情況下,payload將包含要發送或從Websocket接收的資料。偵聽器可以配置為以JSON格式的字串發送或接收整個消息物件.", "path2": "這條路徑將相對於 __path__.", "url1": "URL 應該使用ws://或者wss://方案並指向現有的websocket監聽器.", - "url2": "預設情況下,payload 將包含要發送或從Websocket接收的資料。可以將使用者端配置為以JSON格式的字串發送或接收整個消息物件." + "url2": "預設情況下,payload 將包含要發送或從Websocket接收的資料。可以將使用者端配置為以JSON格式的字串發送或接收整個消息物件.", + "headers": "標頭僅在協定升級機制期間提交,從 HTTP 到 WS/WSS 協定." }, "status": { "connected": "連接數 __count__", From 7916dc9c052aeba67a27f3053ca1b02fcfb25300 Mon Sep 17 00:00:00 2001 From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:31:25 +0000 Subject: [PATCH 02/18] Slightly cleaner fasly checks --- .../@node-red/nodes/core/network/22-websocket.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index acceabda0..3c2509a8e 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -108,11 +108,10 @@ module.exports = function(RED) { const keyValue = header.keyValue; const valueType = header.valueType; const valueValue = header.valueValue; - + const headerName = keyType === 'other' ? keyValue : keyType; let headerValue; - let result; - + switch(valueType){ case 'other': headerValue = valueValue; @@ -120,11 +119,7 @@ module.exports = function(RED) { case 'env': case 'global': - result = RED.util.evaluateNodeProperty(valueValue,valueType,node); - if(!result){ - continue; - } - headerValue = result + headerValue = RED.util.evaluateNodeProperty(valueValue,valueType,node); break; default: @@ -132,7 +127,9 @@ module.exports = function(RED) { break; } - options.headers[headerName] = headerValue + if(headerName && headerValue){ + options.headers[headerName] = headerValue + } } } From 56e58521bdc3ecb3bb73c8072b68fead38fac285 Mon Sep 17 00:00:00 2001 From: Jayson Hurst Date: Sat, 17 Feb 2024 00:35:03 +0000 Subject: [PATCH 03/18] Removed offending MD5 crypto hash and replaced with SHA1 and SHA256 crypto hashes to work with the FIPS crypto policy. --- packages/node_modules/@node-red/editor-api/lib/editor/ui.js | 2 +- packages/node_modules/@node-red/runtime/lib/storage/index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js index e7bf15069..37c79d415 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/ui.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/ui.js @@ -99,7 +99,7 @@ module.exports = { // settings.instanceId is set asynchronously to the editor-api // being initiaised. So we defer calculating the cacheBuster hash // until the first load of the editor - cacheBuster = crypto.createHash('md5').update(`${settings.version || 'version'}-${settings.instanceId || 'instanceId'}`).digest("hex").substring(0,12) + cacheBuster = crypto.createHash('sha1').update(`${settings.version || 'version'}-${settings.instanceId || 'instanceId'}`).digest("hex").substring(0,12) } let sessionMessages; diff --git a/packages/node_modules/@node-red/runtime/lib/storage/index.js b/packages/node_modules/@node-red/runtime/lib/storage/index.js index f5e07e254..989989e1d 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/index.js @@ -77,7 +77,7 @@ var storageModuleInterface = { flows: flows, credentials: creds }; - result.rev = crypto.createHash('md5').update(JSON.stringify(result.flows)).digest("hex"); + result.rev = crypto.createHash('sha256').update(JSON.stringify(result.flows)).digest("hex"); return result; }) }); @@ -95,7 +95,7 @@ var storageModuleInterface = { return credentialSavePromise.then(function() { return storageModule.saveFlows(flows, user).then(function() { - return crypto.createHash('md5').update(JSON.stringify(config.flows)).digest("hex"); + return crypto.createHash('sha256').update(JSON.stringify(config.flows)).digest("hex"); }) }); }, From aeb79bce2ac12ecf60f076425cea40cb9cffad79 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 19 Feb 2024 16:07:22 +0000 Subject: [PATCH 04/18] Fix missing node icons in workspace --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fa20f3f61..a71daaea1 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 @@ -4156,7 +4156,7 @@ RED.view = (function() { } var width = img.width * scaleFactor; if (width > 20) { - scalefactor *= 20/width; + scaleFactor *= 20/width; width = 20; } var height = img.height * scaleFactor; From 43b3589451636d79245faa52943c599bf229d510 Mon Sep 17 00:00:00 2001 From: giscafer Date: Thu, 22 Feb 2024 13:02:06 +0800 Subject: [PATCH 05/18] fix: template node zh-CN translation --- .../@node-red/nodes/locales/zh-CN/function/80-template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html index 938a77818..31b43c764 100644 --- a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html @@ -23,7 +23,7 @@
    template string
    msg.payload填充的模板。如果未在编辑面板中配置,则可以将设为msg的属性。
    -

    Outputs

    +

    输出

    msg object
    由来自传入msg的属性来填充已配置的模板后输出的带有属性的msg。
    @@ -32,7 +32,7 @@

    默认情况下使用mustache格式。如有需要也可以切换其他格式。

    例如:

    Hello {{payload.name}}. Today is {{date}}
    -

    receives a message containing: +

    接收一条消息,其中包含:

    {
       date: "Monday",
       payload: {
    
    From 635334f0966d7089cbd01656f8fb1cb7f645ce04 Mon Sep 17 00:00:00 2001
    From: Kazuhito Yokoi 
    Date: Sun, 25 Feb 2024 17:04:42 +0900
    Subject: [PATCH 06/18] Fix example flow name in import dialog
    
    ---
     packages/node_modules/@node-red/registry/lib/library.js | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/packages/node_modules/@node-red/registry/lib/library.js b/packages/node_modules/@node-red/registry/lib/library.js
    index 0b242b270..07cb54318 100644
    --- a/packages/node_modules/@node-red/registry/lib/library.js
    +++ b/packages/node_modules/@node-red/registry/lib/library.js
    @@ -36,7 +36,7 @@ async function getFlowsFromPath(path) {
                         promises.push(getFlowsFromPath(fullPath));
                     } else if (/\.json$/.test(file)){
                         validFiles.push(file);
    -                    promises.push(Promise.resolve(file.split(".")[0]))
    +                    promises.push(Promise.resolve(file.replace(/\.json$/, '')))
                     }
                 })
             }
    
    From 7de0984d6d31f0b12a733c6da029ded96902808e Mon Sep 17 00:00:00 2001
    From: Kazuhito Yokoi 
    Date: Sun, 25 Feb 2024 17:38:46 +0900
    Subject: [PATCH 07/18] Update test case for example flow name
    
    ---
     test/unit/@node-red/registry/lib/library_spec.js       | 10 ++++------
     .../registry/lib/resources/examples/1.2.3.json         |  0
     2 files changed, 4 insertions(+), 6 deletions(-)
     create mode 100644 test/unit/@node-red/registry/lib/resources/examples/1.2.3.json
    
    diff --git a/test/unit/@node-red/registry/lib/library_spec.js b/test/unit/@node-red/registry/lib/library_spec.js
    index 2e0e7e99a..75c444f67 100644
    --- a/test/unit/@node-red/registry/lib/library_spec.js
    +++ b/test/unit/@node-red/registry/lib/library_spec.js
    @@ -33,16 +33,15 @@ describe("library api", function() {
             should.not.exist(library.getExampleFlowPath('foo','bar'));
         });
     
    -    it('returns a valid example path', function(done) {
    +    it('returns valid example paths', function(done) {
             library.init();
             library.addExamplesDir("test-module",path.resolve(__dirname+'/resources/examples')).then(function() {
                 try {
                     var flows = library.getExampleFlows();
    -                flows.should.deepEqual({"test-module":{"f":["one"]}});
    +                flows.should.deepEqual({"test-module":{"f":["1.2.3","one"]}});
     
                     var examplePath = library.getExampleFlowPath('test-module','one');
    -                examplePath.should.eql(path.resolve(__dirname+'/resources/examples/one.json'))
    -
    +                examplePath.should.eql(path.resolve(__dirname+'/resources/examples/one.json'));
     
                     library.removeExamplesDir('test-module');
     
    @@ -57,6 +56,5 @@ describe("library api", function() {
                     done(err);
                 }
             });
    -
    -    })
    +    });
     });
    diff --git a/test/unit/@node-red/registry/lib/resources/examples/1.2.3.json b/test/unit/@node-red/registry/lib/resources/examples/1.2.3.json
    new file mode 100644
    index 000000000..e69de29bb
    
    From 4643f5e8cca9245625f389a73a45674d7838fa26 Mon Sep 17 00:00:00 2001
    From: giscafer 
    Date: Sun, 25 Feb 2024 22:44:01 +0800
    Subject: [PATCH 08/18] chore: remove never use import code
    
    ---
     .../node_modules/@node-red/editor-api/lib/admin/settings.js    | 1 -
     .../node_modules/@node-red/editor-api/lib/auth/strategies.js   | 1 -
     packages/node_modules/@node-red/editor-api/lib/editor/index.js | 2 --
     .../node_modules/@node-red/editor-api/lib/editor/library.js    | 2 --
     .../node_modules/@node-red/editor-api/lib/editor/locales.js    | 3 ---
     .../node_modules/@node-red/editor-api/lib/editor/sshkeys.js    | 1 -
     packages/node_modules/@node-red/editor-api/lib/editor/theme.js | 1 -
     packages/node_modules/@node-red/editor-api/lib/index.js        | 3 ---
     8 files changed, 14 deletions(-)
    
    diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/settings.js b/packages/node_modules/@node-red/editor-api/lib/admin/settings.js
    index d72f9e094..425d42415 100644
    --- a/packages/node_modules/@node-red/editor-api/lib/admin/settings.js
    +++ b/packages/node_modules/@node-red/editor-api/lib/admin/settings.js
    @@ -13,7 +13,6 @@
      * See the License for the specific language governing permissions and
      * limitations under the License.
      **/
    -var apiUtils = require("../util");
     var runtimeAPI;
     var settings;
     var theme = require("../editor/theme");
    diff --git a/packages/node_modules/@node-red/editor-api/lib/auth/strategies.js b/packages/node_modules/@node-red/editor-api/lib/auth/strategies.js
    index e18925c19..b071a9caf 100644
    --- a/packages/node_modules/@node-red/editor-api/lib/auth/strategies.js
    +++ b/packages/node_modules/@node-red/editor-api/lib/auth/strategies.js
    @@ -18,7 +18,6 @@ var BearerStrategy = require('passport-http-bearer').Strategy;
     var ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy;
     
     var passport = require("passport");
    -var crypto = require("crypto");
     var util = require("util");
     
     var Tokens = require("./tokens");
    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 648daa09b..54cf17f12 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
    @@ -14,11 +14,9 @@
      * limitations under the License.
      **/
     
    -var express = require("express");
     var path = require('path');
     
     var comms = require("./comms");
    -var library = require("./library");
     var info = require("./settings");
     
     var auth = require("../auth");
    diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/library.js b/packages/node_modules/@node-red/editor-api/lib/editor/library.js
    index cd564b3f8..7853227ea 100644
    --- a/packages/node_modules/@node-red/editor-api/lib/editor/library.js
    +++ b/packages/node_modules/@node-red/editor-api/lib/editor/library.js
    @@ -15,8 +15,6 @@
      **/
     
     var apiUtils = require("../util");
    -var fs = require('fs');
    -var fspath = require('path');
     
     var runtimeAPI;
     
    diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/locales.js b/packages/node_modules/@node-red/editor-api/lib/editor/locales.js
    index 568f5837b..6109d8741 100644
    --- a/packages/node_modules/@node-red/editor-api/lib/editor/locales.js
    +++ b/packages/node_modules/@node-red/editor-api/lib/editor/locales.js
    @@ -13,9 +13,6 @@
      * See the License for the specific language governing permissions and
      * limitations under the License.
      **/
    -var fs = require('fs');
    -var path = require('path');
    -// var apiUtil = require('../util');
     
     var i18n = require("@node-red/util").i18n; // TODO: separate module
     
    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 08097571f..885967b91 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
    @@ -15,7 +15,6 @@
      **/
     
     var apiUtils = require("../util");
    -var express = require("express");
     var runtimeAPI;
     var settings;
     
    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 e5c3904c7..c3808a751 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
    @@ -14,7 +14,6 @@
      * limitations under the License.
      **/
     
    -var express = require("express");
     var util = require("util");
     var path = require("path");
     var fs = require("fs");
    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 d9f34eafd..9264550b3 100644
    --- a/packages/node_modules/@node-red/editor-api/lib/index.js
    +++ b/packages/node_modules/@node-red/editor-api/lib/index.js
    @@ -24,11 +24,8 @@
       * @namespace @node-red/editor-api
       */
     
    -var express = require("express");
     var bodyParser = require("body-parser");
    -var util = require('util');
     var passport = require('passport');
    -var cors = require('cors');
     
     var auth = require("./auth");
     var apiUtil = require("./util");
    
    From fa78bb3d78418fad126dddc02d497c0e35529f66 Mon Sep 17 00:00:00 2001
    From: Nick O'Leary 
    Date: Mon, 26 Feb 2024 16:17:09 +0000
    Subject: [PATCH 09/18] Handle undefined env vars Fixes #4579
    
    ---
     packages/node_modules/@node-red/runtime/lib/flows/Flow.js    | 2 +-
     packages/node_modules/@node-red/runtime/lib/flows/Group.js   | 2 +-
     packages/node_modules/@node-red/runtime/lib/flows/Subflow.js | 2 +-
     3 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js
    index b541a9d95..dd3d335a2 100644
    --- a/packages/node_modules/@node-red/runtime/lib/flows/Flow.js
    +++ b/packages/node_modules/@node-red/runtime/lib/flows/Flow.js
    @@ -485,7 +485,7 @@ class Flow {
             }
             if (!key.startsWith("$parent.")) {
                 if (this._env.hasOwnProperty(key)) {
    -                return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
    +                return (this._env[key] && Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
                 }
             } else {
                     key = key.substring(8);
    diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Group.js b/packages/node_modules/@node-red/runtime/lib/flows/Group.js
    index 521b6ceda..90d93cf45 100644
    --- a/packages/node_modules/@node-red/runtime/lib/flows/Group.js
    +++ b/packages/node_modules/@node-red/runtime/lib/flows/Group.js
    @@ -41,7 +41,7 @@ class Group {
             }
             if (!key.startsWith("$parent.")) {
                 if (this._env.hasOwnProperty(key)) {
    -                return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
    +                return (this._env[key] && Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
                 }
             } else {
                 key = key.substring(8);
    diff --git a/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js b/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js
    index 62948d203..c3a47e1f7 100644
    --- a/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js
    +++ b/packages/node_modules/@node-red/runtime/lib/flows/Subflow.js
    @@ -376,7 +376,7 @@ class Subflow extends Flow {
             }
             if (!key.startsWith("$parent.")) {
                 if (this._env.hasOwnProperty(key)) {
    -                return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
    +                return (this._env[key] && Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
                 }
             } else {
                 key = key.substring(8);
    
    From 220786be60564381428347d9f7a3298413ca85ef Mon Sep 17 00:00:00 2001
    From: Nick O'Leary 
    Date: Mon, 26 Feb 2024 16:55:01 +0000
    Subject: [PATCH 10/18] Do not flag env var in num typedInput as error
    
    ---
     .../editor-client/src/js/ui/utils.js          |  5 ++++-
     .../editor-client/src/js/validators.js        | 16 +++++++++++++--
     .../nodes/core/common/20-inject.html          | 20 +++++++++++++------
     3 files changed, 32 insertions(+), 9 deletions(-)
    
    diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js
    index 6475b19f5..bdc6a06d2 100644
    --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js
    +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js
    @@ -906,7 +906,10 @@ RED.utils = (function() {
          * @returns true if valid, String if invalid
          */
         function validateTypedProperty(propertyValue, propertyType, opt) {
    -
    +        if (propertyValue && /^\${[^}]+}$/.test(propertyValue)) {
    +            // Allow ${ENV_VAR} value
    +            return true
    +        }
             let error
             if (propertyType === 'json') {
                 try {
    diff --git a/packages/node_modules/@node-red/editor-client/src/js/validators.js b/packages/node_modules/@node-red/editor-client/src/js/validators.js
    index 1673495aa..c17955ce1 100644
    --- a/packages/node_modules/@node-red/editor-client/src/js/validators.js
    +++ b/packages/node_modules/@node-red/editor-client/src/js/validators.js
    @@ -16,8 +16,20 @@
     RED.validators = {
         number: function(blankAllowed,mopt){
             return function(v, opt) {
    -            if ((blankAllowed&&(v===''||v===undefined)) || (v!=='' && !isNaN(v))) {
    -                return true;
    +            if (blankAllowed && (v === '' || v === undefined)) {
    +                return true
    +            }
    +            if (v !== '') {
    +                if (/^NaN$|^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$|^[+-]?(0b|0B)[01]+$|^[+-]?(0o|0O)[0-7]+$|^[+-]?(0x|0X)[0-9a-fA-F]+$/.test(v)) {
    +                    return true
    +                }
    +                if (/^\${[^}]+}$/.test(v)) {
    +                    // Allow ${ENV_VAR} value
    +                    return true
    +                }
    +            }
    +            if (!isNaN(v)) {
    +                return true
                 }
                 if (opt && opt.label) {
                     return RED._("validator.errors.invalid-num-prop", {
    diff --git a/packages/node_modules/@node-red/nodes/core/common/20-inject.html b/packages/node_modules/@node-red/nodes/core/common/20-inject.html
    index d50725d51..5895220d3 100644
    --- a/packages/node_modules/@node-red/nodes/core/common/20-inject.html
    +++ b/packages/node_modules/@node-red/nodes/core/common/20-inject.html
    @@ -227,34 +227,42 @@
                 name: {value:""},
                 props:{value:[{p:"payload"},{p:"topic",vt:"str"}], validate:function(v, opt) {
                         if (!v || v.length === 0) { return true }
    +                    const errors = []
                         for (var i=0;i 0) {
    +                        return errors
    +                    }
                         return true;
                     }
                 },
                 repeat: {
                     value:"", validate: function(v, opt) {
                         if ((v === "") ||
    -                        (RED.validators.number(v) &&
    +                        (RED.validators.number()(v) &&
                              (v >= 0) && (v <= 2147483))) {
                             return true;
                         }
    @@ -263,7 +271,7 @@
                 },
                 crontab: {value:""},
                 once: {value:false},
    -            onceDelay: {value:0.1},
    +            onceDelay: {value:0.1, validate: RED.validators.number(true)},
                 topic: {value:""},
                 payload: {value:"", validate: RED.validators.typedInput("payloadType", false) },
                 payloadType: {value:"date"},
    
    From fb50e2772a99f08ff8c241c6f94f541f898fcfa0 Mon Sep 17 00:00:00 2001
    From: Nick O'Leary 
    Date: Fri, 1 Mar 2024 10:50:06 +0000
    Subject: [PATCH 11/18] Bump for 3.1.6 release
    
    ---
     CHANGELOG.md                                   | 18 ++++++++++++++++++
     package.json                                   |  2 +-
     .../@node-red/editor-api/package.json          |  6 +++---
     .../@node-red/editor-client/package.json       |  2 +-
     .../node_modules/@node-red/nodes/package.json  |  2 +-
     .../@node-red/registry/package.json            |  4 ++--
     .../@node-red/runtime/package.json             |  6 +++---
     .../node_modules/@node-red/util/package.json   |  2 +-
     packages/node_modules/node-red/package.json    | 10 +++++-----
     9 files changed, 35 insertions(+), 17 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index 618c3d8b5..bbf45998a 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,3 +1,21 @@
    +#### 3.1.6: Maintenance Release
    +
    +Editor
    +
    + - Do not flag env var in num typedInput as error (#4582) @knolleary
    + - Fix example flow name in import dialog (#4578) @kazuhitoyokoi
    + - Fix missing node icons in workspace (#4570) @knolleary
    +
    +Runtime
    +
    + - Handle undefined env vars (#4581) @knolleary
    + - fix: Removed offending MD5 crypto hash and replaced with SHA1 and SHA256 … (#4568) @JaysonHurst
    + - chore: remove never use import code (#4580) @giscafer
    +
    +Nodes
    +
    + - fix: template node zh-CN translation (#4575) @giscafer
    +
     #### 3.1.5: Maintenance Release
     
     Runtime
    diff --git a/package.json b/package.json
    index d9db20077..b490ddd75 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "node-red",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "description": "Low-code programming for event-driven applications",
         "homepage": "https://nodered.org",
         "license": "Apache-2.0",
    diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json
    index 978e84b9e..473e69f54 100644
    --- a/packages/node_modules/@node-red/editor-api/package.json
    +++ b/packages/node_modules/@node-red/editor-api/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/editor-api",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,8 +16,8 @@
             }
         ],
         "dependencies": {
    -        "@node-red/util": "3.1.5",
    -        "@node-red/editor-client": "3.1.5",
    +        "@node-red/util": "3.1.6",
    +        "@node-red/editor-client": "3.1.6",
             "bcryptjs": "2.4.3",
             "body-parser": "1.20.2",
             "clone": "2.1.2",
    diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json
    index 5f46e476c..77761bd82 100644
    --- a/packages/node_modules/@node-red/editor-client/package.json
    +++ b/packages/node_modules/@node-red/editor-client/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/editor-client",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json
    index b003e4f07..f9e2dd0c6 100644
    --- a/packages/node_modules/@node-red/nodes/package.json
    +++ b/packages/node_modules/@node-red/nodes/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/nodes",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json
    index 187ebaf3b..0eee0c9dc 100644
    --- a/packages/node_modules/@node-red/registry/package.json
    +++ b/packages/node_modules/@node-red/registry/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/registry",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,7 +16,7 @@
             }
         ],
         "dependencies": {
    -        "@node-red/util": "3.1.5",
    +        "@node-red/util": "3.1.6",
             "clone": "2.1.2",
             "fs-extra": "11.1.1",
             "semver": "7.5.4",
    diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json
    index f1aa5b101..755d03bf2 100644
    --- a/packages/node_modules/@node-red/runtime/package.json
    +++ b/packages/node_modules/@node-red/runtime/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/runtime",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,8 +16,8 @@
             }
         ],
         "dependencies": {
    -        "@node-red/registry": "3.1.5",
    -        "@node-red/util": "3.1.5",
    +        "@node-red/registry": "3.1.6",
    +        "@node-red/util": "3.1.6",
             "async-mutex": "0.4.0",
             "clone": "2.1.2",
             "express": "4.18.2",
    diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json
    index eea46d2c4..160eddabb 100644
    --- a/packages/node_modules/@node-red/util/package.json
    +++ b/packages/node_modules/@node-red/util/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/util",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json
    index 9159c704e..b2d73055d 100644
    --- a/packages/node_modules/node-red/package.json
    +++ b/packages/node_modules/node-red/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "node-red",
    -    "version": "3.1.5",
    +    "version": "3.1.6",
         "description": "Low-code programming for event-driven applications",
         "homepage": "https://nodered.org",
         "license": "Apache-2.0",
    @@ -31,10 +31,10 @@
             "flow"
         ],
         "dependencies": {
    -        "@node-red/editor-api": "3.1.5",
    -        "@node-red/runtime": "3.1.5",
    -        "@node-red/util": "3.1.5",
    -        "@node-red/nodes": "3.1.5",
    +        "@node-red/editor-api": "3.1.6",
    +        "@node-red/runtime": "3.1.6",
    +        "@node-red/util": "3.1.6",
    +        "@node-red/nodes": "3.1.6",
             "basic-auth": "2.0.1",
             "bcryptjs": "2.4.3",
             "express": "4.18.2",
    
    From da380f74640c4ad86492aa691d72b1cfe78c142c Mon Sep 17 00:00:00 2001
    From: Ben Hardill 
    Date: Tue, 5 Mar 2024 10:22:49 +0000
    Subject: [PATCH 12/18] Update jsonata version
    
    Pulls in fix for CVE-2024-27307
    ---
     packages/node_modules/@node-red/util/package.json | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json
    index 160eddabb..50b760bff 100644
    --- a/packages/node_modules/@node-red/util/package.json
    +++ b/packages/node_modules/@node-red/util/package.json
    @@ -18,7 +18,7 @@
             "fs-extra": "11.1.1",
             "i18next": "21.10.0",
             "json-stringify-safe": "5.0.1",
    -        "jsonata": "1.8.6",
    +        "jsonata": "1.8.7",
             "lodash.clonedeep": "^4.5.0",
             "moment": "2.29.4",
             "moment-timezone": "0.5.43"
    
    From a193b79d3dc7a28397ba810938483b18819a5c49 Mon Sep 17 00:00:00 2001
    From: Ben Hardill 
    Date: Tue, 5 Mar 2024 10:31:03 +0000
    Subject: [PATCH 13/18] Bump jsonata to match utils
    
    ---
     package.json | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/package.json b/package.json
    index b490ddd75..56b7f7025 100644
    --- a/package.json
    +++ b/package.json
    @@ -54,7 +54,7 @@
             "is-utf8": "0.2.1",
             "js-yaml": "4.1.0",
             "json-stringify-safe": "5.0.1",
    -        "jsonata": "1.8.6",
    +        "jsonata": "1.8.7",
             "lodash.clonedeep": "^4.5.0",
             "media-typer": "1.1.0",
             "memorystore": "1.6.7",
    
    From 84a76909e2a055e69d3f05393e04d5261f264fc0 Mon Sep 17 00:00:00 2001
    From: Joe Pavitt 
    Date: Fri, 8 Mar 2024 10:51:25 +0000
    Subject: [PATCH 14/18] Improve the appearance of the Node-RED primary header
    
    ---
     .../@node-red/editor-client/src/sass/base.scss  |  2 +-
     .../editor-client/src/sass/colors.scss          |  3 ++-
     .../editor-client/src/sass/header.scss          | 10 +++++++---
     .../@node-red/editor-client/src/sass/sizes.scss | 17 +++++++++++++++++
     .../src/sass/style-custom-theme.scss            |  1 +
     .../@node-red/editor-client/src/sass/style.scss |  1 +
     .../editor-client/src/sass/variables.scss       |  4 ++++
     7 files changed, 33 insertions(+), 5 deletions(-)
     create mode 100644 packages/node_modules/@node-red/editor-client/src/sass/sizes.scss
    
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss
    index 92a98913f..58e77863d 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss
    @@ -38,7 +38,7 @@ body {
     }
     #red-ui-main-container {
         position: absolute;
    -    top:40px; left:0; bottom: 0; right:0;
    +    top: var(--red-ui-header-height); left:0; bottom: 0; right:0;
         overflow:hidden;
     }
     
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss
    index ce71bcdba..b561fde16 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss
    @@ -259,7 +259,8 @@ $deploy-button-background-disabled-hover: #555;
     
     $header-background: #000;
     $header-button-background-active: #121212;
    -$header-menu-color: #C7C7C7;
    +$header-accent: #d41313;
    +$header-menu-color: #eee;
     $header-menu-color-disabled: #666;
     $header-menu-heading-color: #fff;
     $header-menu-sublabel-color: #aeaeae;
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss
    index 723c1e9bd..a80ad3a17 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss
    @@ -23,16 +23,20 @@
         top: 0;
         left: 0;
         width: 100%;
    -    height: 40px;
    +    height: var(--red-ui-header-height);
         background: var(--red-ui-header-background);
         box-sizing: border-box;
         padding: 0px 0px 0px 20px;
         color: var(--red-ui-header-menu-color);
         font-size: 14px;
    +    display: flex;
    +    justify-content: space-between;
    +    align-items: center;
    +    border-bottom: 2px solid var(--red-ui-header-accent);
    +    padding-top: 2px;
     
         span.red-ui-header-logo {
             float: left;
    -        margin-top: 5px;
             font-size: 30px;
             line-height: 30px;
             text-decoration: none;
    @@ -42,7 +46,7 @@
                 vertical-align: middle;
                 font-size: 16px !important;
                 &:not(:first-child) {
    -                margin-left: 5px;
    +                margin-left: 8px;
                 }
             }
             img {
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss
    new file mode 100644
    index 000000000..a3d48e76d
    --- /dev/null
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss
    @@ -0,0 +1,17 @@
    +/**
    + * Copyright JS Foundation and other contributors, http://js.foundation
    + *
    + * 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.
    + **/
    +
    + $header-height: 48px;
    \ No newline at end of file
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/style-custom-theme.scss b/packages/node_modules/@node-red/editor-client/src/sass/style-custom-theme.scss
    index 1202d9fb7..312081503 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/style-custom-theme.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/style-custom-theme.scss
    @@ -15,4 +15,5 @@
     **/
     
     @import "colors";
    +@import "sizes";
     @import "variables";
    \ No newline at end of file
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/style.scss b/packages/node_modules/@node-red/editor-client/src/sass/style.scss
    index 7910832ad..412290f78 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/style.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/style.scss
    @@ -15,6 +15,7 @@
     **/
     
     @import "colors";
    +@import "sizes";
     @import "variables";
     @import "mixins";
     
    diff --git a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss
    index 50e1c9310..c04c26ff9 100644
    --- a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss
    +++ b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss
    @@ -16,6 +16,9 @@
     
         --red-ui-shadow: #{$shadow};
     
    +    // Header Height
    +    --red-ui-header-height: #{$header-height};
    +
     // Main body text
         --red-ui-primary-text-color: #{$primary-text-color};
     // UI control label text
    @@ -240,6 +243,7 @@
     
     
         --red-ui-header-background: #{$header-background};
    +    --red-ui-header-accent: #{$header-accent};
         --red-ui-header-button-background-active: #{$header-button-background-active};
         --red-ui-header-menu-color: #{$header-menu-color};
         --red-ui-header-menu-color-disabled: #{$header-menu-color-disabled};
    
    From a0d3ea62b29c5df5482a901f2b0af30970881133 Mon Sep 17 00:00:00 2001
    From: Kazuhito Yokoi 
    Date: Sun, 10 Mar 2024 23:36:20 +0900
    Subject: [PATCH 15/18] Add Japanese translation for v3.1.6
    
    ---
     .../@node-red/editor-client/locales/ja/editor.json             | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    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 5d988c68a..53c8616fd 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
    @@ -303,7 +303,8 @@
                     "missingType": "不正なフロー - __index__ 番目の要素に'type'プロパティがありません"
                 },
                 "conflictNotification1": "読み込もうとしているノードのいくつかは、既にワークスペース内に存在しています。",
    -            "conflictNotification2": "読み込むノードを選択し、また既存のノードを置き換えるか、もしくはそれらのコピーを読み込むかも選択してください。"
    +            "conflictNotification2": "読み込むノードを選択し、また既存のノードを置き換えるか、もしくはそれらのコピーを読み込むかも選択してください。",
    +            "alreadyExists": "本ノードは既に存在"
             },
             "copyMessagePath": "パスをコピーしました",
             "copyMessageValue": "値をコピーしました",
    
    From 6a6f0d04d6723866c39588efb7d391d9de7bbde0 Mon Sep 17 00:00:00 2001
    From: Nick O'Leary 
    Date: Tue, 12 Mar 2024 14:25:41 +0000
    Subject: [PATCH 16/18] Bump for 3.1.7 release
    
    ---
     CHANGELOG.md                                           |  5 +++++
     package.json                                           |  2 +-
     .../node_modules/@node-red/editor-api/package.json     |  6 +++---
     .../node_modules/@node-red/editor-client/package.json  |  2 +-
     packages/node_modules/@node-red/nodes/package.json     |  2 +-
     packages/node_modules/@node-red/registry/package.json  |  4 ++--
     packages/node_modules/@node-red/runtime/package.json   |  6 +++---
     packages/node_modules/@node-red/util/package.json      |  2 +-
     packages/node_modules/node-red/package.json            | 10 +++++-----
     9 files changed, 22 insertions(+), 17 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index bbf45998a..68ea56f85 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,3 +1,8 @@
    +#### 3.1.7: Maintenance Release
    +
    + - Add Japanese translation for v3.1.6 (#4603) @kazuhitoyokoi
    + - Update jsonata version (#4593) @hardillb
    +
     #### 3.1.6: Maintenance Release
     
     Editor
    diff --git a/package.json b/package.json
    index 56b7f7025..aa61af324 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "node-red",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "description": "Low-code programming for event-driven applications",
         "homepage": "https://nodered.org",
         "license": "Apache-2.0",
    diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json
    index 473e69f54..39fbc748f 100644
    --- a/packages/node_modules/@node-red/editor-api/package.json
    +++ b/packages/node_modules/@node-red/editor-api/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/editor-api",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,8 +16,8 @@
             }
         ],
         "dependencies": {
    -        "@node-red/util": "3.1.6",
    -        "@node-red/editor-client": "3.1.6",
    +        "@node-red/util": "3.1.7",
    +        "@node-red/editor-client": "3.1.7",
             "bcryptjs": "2.4.3",
             "body-parser": "1.20.2",
             "clone": "2.1.2",
    diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json
    index 77761bd82..4012a1148 100644
    --- a/packages/node_modules/@node-red/editor-client/package.json
    +++ b/packages/node_modules/@node-red/editor-client/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/editor-client",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json
    index f9e2dd0c6..b91d21385 100644
    --- a/packages/node_modules/@node-red/nodes/package.json
    +++ b/packages/node_modules/@node-red/nodes/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/nodes",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json
    index 0eee0c9dc..60f0e5863 100644
    --- a/packages/node_modules/@node-red/registry/package.json
    +++ b/packages/node_modules/@node-red/registry/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/registry",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,7 +16,7 @@
             }
         ],
         "dependencies": {
    -        "@node-red/util": "3.1.6",
    +        "@node-red/util": "3.1.7",
             "clone": "2.1.2",
             "fs-extra": "11.1.1",
             "semver": "7.5.4",
    diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json
    index 755d03bf2..d27ef3d8d 100644
    --- a/packages/node_modules/@node-red/runtime/package.json
    +++ b/packages/node_modules/@node-red/runtime/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/runtime",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "main": "./lib/index.js",
         "repository": {
    @@ -16,8 +16,8 @@
             }
         ],
         "dependencies": {
    -        "@node-red/registry": "3.1.6",
    -        "@node-red/util": "3.1.6",
    +        "@node-red/registry": "3.1.7",
    +        "@node-red/util": "3.1.7",
             "async-mutex": "0.4.0",
             "clone": "2.1.2",
             "express": "4.18.2",
    diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json
    index 50b760bff..eadb42586 100644
    --- a/packages/node_modules/@node-red/util/package.json
    +++ b/packages/node_modules/@node-red/util/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "@node-red/util",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "license": "Apache-2.0",
         "repository": {
             "type": "git",
    diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json
    index b2d73055d..6c9043fda 100644
    --- a/packages/node_modules/node-red/package.json
    +++ b/packages/node_modules/node-red/package.json
    @@ -1,6 +1,6 @@
     {
         "name": "node-red",
    -    "version": "3.1.6",
    +    "version": "3.1.7",
         "description": "Low-code programming for event-driven applications",
         "homepage": "https://nodered.org",
         "license": "Apache-2.0",
    @@ -31,10 +31,10 @@
             "flow"
         ],
         "dependencies": {
    -        "@node-red/editor-api": "3.1.6",
    -        "@node-red/runtime": "3.1.6",
    -        "@node-red/util": "3.1.6",
    -        "@node-red/nodes": "3.1.6",
    +        "@node-red/editor-api": "3.1.7",
    +        "@node-red/runtime": "3.1.7",
    +        "@node-red/util": "3.1.7",
    +        "@node-red/nodes": "3.1.7",
             "basic-auth": "2.0.1",
             "bcryptjs": "2.4.3",
             "express": "4.18.2",
    
    From 7e10093bb88026a7e73fa9ef9ee11fbfccf5188a Mon Sep 17 00:00:00 2001
    From: Marcus Davies <55892693+marcus-j-davies@users.noreply.github.com>
    Date: Tue, 12 Mar 2024 19:26:27 +0000
    Subject: [PATCH 17/18] Remove global access + reduce header  list
    
    ---
     .../@node-red/nodes/core/network/22-websocket.html  | 13 ++++++++++---
     .../@node-red/nodes/core/network/22-websocket.js    |  1 -
     2 files changed, 10 insertions(+), 4 deletions(-)
    
    diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    index 2976342cb..7a0c7c1da 100644
    --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    @@ -41,14 +41,20 @@
     (function() {
     
         const headerTypes = [
    +        /*
             { value: "Accept", label: "Accept", hasValue: false },
             { value: "Accept-Encoding", label: "Accept-Encoding", hasValue: false },
             { value: "Accept-Language", label: "Accept-Language", hasValue: false },
    +        */
             { value: "Authorization", label: "Authorization", hasValue: false },
    +        /*
             { value: "Content-Type", label: "Content-Type", hasValue: false },
             { value: "Cache-Control", label: "Cache-Control", hasValue: false },
    +        */
             { value: "User-Agent", label: "User-Agent", hasValue: false },
    +        /*
             { value: "Location", label: "Location", hasValue: false },
    +        */
             { value: "other", label: RED._("node-red:httpin.label.other"),
               hasValue: true, icon: "red/images/typedInput/az.svg" },
         ]
    @@ -57,9 +63,9 @@
         const defaultOptions = [
             { value: "other", label: RED._("node-red:httpin.label.other"),
               hasValue: true, icon: "red/images/typedInput/az.svg" },
    -        { value: "global", label: "global.", hasValue: true },
             { value: "env", label: "env", hasValue: true },
         ];
    +    /*
         headerOptions["accept"] = [
             { value: "text/plain", label: "text/plain", hasValue: false },
             { value: "text/html", label: "text/html", hasValue: false },
    @@ -67,6 +73,7 @@
             { value: "application/xml", label: "application/xml", hasValue: false },
             ...defaultOptions,
         ];
    +    
         headerOptions["accept-encoding"] = [
             { value: "gzip", label: "gzip", hasValue: false },
             { value: "deflate", label: "deflate", hasValue: false },
    @@ -114,7 +121,7 @@
             { value: "no-cache", label: "no-cache", hasValue: false },
             ...defaultOptions,
         ];
    -
    +    */
         headerOptions["user-agent"] = [
             { value: "Mozilla/5.0", label: "Mozilla/5.0", hasValue: false },
             ...defaultOptions,
    @@ -346,7 +353,7 @@
                                 propertyName.typedInput('value', keyValue);
                             }
     
    -                        if(valueType == "other" || valueType == "flow" || valueType == "global" || valueType == "env" ) {
    +                        if(valueType == "other" || valueType == "env" ) {
                                 propertyValue.typedInput('type', valueType);
                                 propertyValue.typedInput('value', valueValue);
                             } else if (headerValueIsAPreset(propertyName.typedInput('type'), valueType)) {
    diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js
    index 3c2509a8e..fd52e899e 100644
    --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js
    +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js
    @@ -118,7 +118,6 @@ module.exports = function(RED) {
                                 break;
                                 
                             case 'env':
    -                        case 'global':
                                 headerValue = RED.util.evaluateNodeProperty(valueValue,valueType,node);
                                 break;
     
    
    From e34ee44b211ba0b16bb37cac60238b010b528a1f Mon Sep 17 00:00:00 2001
    From: Nick O'Leary 
    Date: Wed, 13 Mar 2024 17:19:20 +0000
    Subject: [PATCH 18/18] Update
     packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    
    ---
     .../node_modules/@node-red/nodes/core/network/22-websocket.html | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    index 7a0c7c1da..d1fad2d1c 100644
    --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html
    @@ -63,7 +63,7 @@
         const defaultOptions = [
             { value: "other", label: RED._("node-red:httpin.label.other"),
               hasValue: true, icon: "red/images/typedInput/az.svg" },
    -        { value: "env", label: "env", hasValue: true },
    +        "env",
         ];
         /*
         headerOptions["accept"] = [