mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	update from upstream
This commit is contained in:
		
							
								
								
									
										23
									
								
								packages/node_modules/@node-red/editor-api/lib/admin/diagnostics.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								packages/node_modules/@node-red/editor-api/lib/admin/diagnostics.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| let runtimeAPI; | ||||
| let settings; | ||||
| const apiUtil = require("../util"); | ||||
| module.exports = { | ||||
|     init: function(_settings, _runtimeAPI) { | ||||
|         settings = _settings; | ||||
|         runtimeAPI = _runtimeAPI; | ||||
|     }, | ||||
|     getReport: function(req, res) { | ||||
|         const diagnosticsOpts = settings.diagnostics || {}; | ||||
|         const opts = { | ||||
|             user: req.user, | ||||
|             scope: diagnosticsOpts.level || "basic" | ||||
|         } | ||||
|         if(diagnosticsOpts.enabled === false || diagnosticsOpts.enabled === "false") { | ||||
|             apiUtil.rejectHandler(req, res, {message: "diagnostics are disabled", status: 403, code: "diagnostics.disabled" }) | ||||
|         } else { | ||||
|             runtimeAPI.diagnostics.get(opts) | ||||
|             .then(function(result) { res.json(result); }) | ||||
|             .catch(err => apiUtil.rejectHandler(req, res, err)) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -68,5 +68,28 @@ module.exports = { | ||||
|         }).catch(function(err) { | ||||
|             apiUtils.rejectHandler(req,res,err); | ||||
|         }) | ||||
|     }, | ||||
|     getState: function(req,res) { | ||||
|         const opts = { | ||||
|             user: req.user, | ||||
|             req: apiUtils.getRequestLogObject(req) | ||||
|         } | ||||
|         runtimeAPI.flows.getState(opts).then(function(result) { | ||||
|             res.json(result); | ||||
|         }).catch(function(err) { | ||||
|             apiUtils.rejectHandler(req,res,err); | ||||
|         }) | ||||
|     }, | ||||
|     postState: function(req,res) { | ||||
|         const opts = { | ||||
|             user: req.user, | ||||
|             state: req.body.state || "", | ||||
|             req: apiUtils.getRequestLogObject(req) | ||||
|         } | ||||
|         runtimeAPI.flows.setState(opts).then(function(result) { | ||||
|             res.json(result); | ||||
|         }).catch(function(err) { | ||||
|             apiUtils.rejectHandler(req,res,err); | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -23,6 +23,7 @@ var context = require("./context"); | ||||
| var auth = require("../auth"); | ||||
| var info = require("./settings"); | ||||
| var plugins = require("./plugins"); | ||||
| var diagnostics = require("./diagnostics"); | ||||
|  | ||||
| var apiUtil = require("../util"); | ||||
|  | ||||
| @@ -34,6 +35,7 @@ module.exports = { | ||||
|         context.init(runtimeAPI); | ||||
|         info.init(settings,runtimeAPI); | ||||
|         plugins.init(runtimeAPI); | ||||
|         diagnostics.init(settings, runtimeAPI); | ||||
|  | ||||
|         var needsPermission = auth.needsPermission; | ||||
|  | ||||
| @@ -52,6 +54,12 @@ module.exports = { | ||||
|         adminApp.get("/flows",needsPermission("flows.read"),flows.get,apiUtil.errorHandler); | ||||
|         adminApp.post("/flows",needsPermission("flows.write"),flows.post,apiUtil.errorHandler); | ||||
|  | ||||
|         // Flows/state | ||||
|         adminApp.get("/flows/state", needsPermission("flows.read"), flows.getState, apiUtil.errorHandler); | ||||
|         if (settings.runtimeState && settings.runtimeState.enabled === true) { | ||||
|             adminApp.post("/flows/state", needsPermission("flows.write"), flows.postState, apiUtil.errorHandler); | ||||
|         } | ||||
|  | ||||
|         // Flow | ||||
|         adminApp.get("/flow/:id",needsPermission("flows.read"),flow.get,apiUtil.errorHandler); | ||||
|         adminApp.post("/flow",needsPermission("flows.write"),flow.post,apiUtil.errorHandler); | ||||
| @@ -95,6 +103,8 @@ module.exports = { | ||||
|         adminApp.get("/plugins", needsPermission("plugins.read"), plugins.getAll, apiUtil.errorHandler); | ||||
|         adminApp.get("/plugins/messages", needsPermission("plugins.read"), plugins.getCatalogs, apiUtil.errorHandler); | ||||
|  | ||||
|         adminApp.get("/diagnostics", needsPermission("diagnostics.read"), diagnostics.getReport, apiUtil.errorHandler); | ||||
|  | ||||
|         return adminApp; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -106,9 +106,15 @@ async function login(req,res) { | ||||
|                 urlPrefix += "/"; | ||||
|             } | ||||
|             response = { | ||||
|                 "type":"strategy", | ||||
|                 "prompts":[{type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"}] | ||||
|                 "type":"strategy" | ||||
|             } | ||||
|             if (mergedAdminAuth.strategy.autoLogin) { | ||||
|                 response.autoLogin = true | ||||
|                 response.loginRedirect = urlPrefix + "auth/strategy" | ||||
|             } | ||||
|             response.prompts = [ | ||||
|                 {type:"button",label:mergedAdminAuth.strategy.label, url: urlPrefix + "auth/strategy"} | ||||
|             ] | ||||
|             if (mergedAdminAuth.strategy.icon) { | ||||
|                 response.prompts[0].icon = mergedAdminAuth.strategy.icon; | ||||
|             } | ||||
| @@ -185,7 +191,7 @@ function genericStrategy(adminApp,strategy) { | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             options.verify.apply(null,args); | ||||
|             options.verify.apply(this,args); | ||||
|         } else { | ||||
|             var profile = arguments[arguments.length - 2]; | ||||
|             return completeVerify(profile,originalDone); | ||||
|   | ||||
| @@ -92,10 +92,16 @@ var passwordTokenExchange = function(client, username, password, scope, done) { | ||||
|                 loginAttempts = loginAttempts.filter(function(logEntry) { | ||||
|                     return logEntry.user !== username; | ||||
|                 }); | ||||
|                 Tokens.create(username,client.id,scope).then(function(tokens) { | ||||
|                     log.audit({event: "auth.login",user,username:username,client:client.id,scope:scope}); | ||||
|                     done(null,tokens.accessToken,null,{expires_in:tokens.expires_in}); | ||||
|                 }); | ||||
|                 // Check if the user contains a user defined token and use it | ||||
|                 // instead of generating a new token | ||||
|                 if(user.token){ | ||||
|                     done(null,user.token,null,null); | ||||
|                 } else { | ||||
|                     Tokens.create(username,client.id,scope).then(function(tokens) { | ||||
|                         log.audit({event: "auth.login",user,username:username,client:client.id,scope:scope}); | ||||
|                         done(null,tokens.accessToken,null,{expires_in:tokens.expires_in}); | ||||
|                     }); | ||||
|                 } | ||||
|             } else { | ||||
|                 log.audit({event: "auth.login.fail.permissions",username:username,client:client.id,scope:scope}); | ||||
|                 done(null,false); | ||||
|   | ||||
| @@ -102,7 +102,10 @@ module.exports = { | ||||
|         } | ||||
|         themeSettings = null; | ||||
|         theme = settings.editorTheme || {}; | ||||
|         themeContext.asset.vendorMonaco = ((theme.codeEditor || {}).lib === "monaco") ? "vendor/monaco/monaco-bootstrap.js" : ""; | ||||
|         themeContext.asset.vendorMonaco = "vendor/monaco/monaco-bootstrap.js" | ||||
|         if (theme.codeEditor && theme.codeEditor.lib === 'ace') { | ||||
|             themeContext.asset.vendorMonaco = '' | ||||
|         } | ||||
|         activeTheme = theme.theme; | ||||
|     }, | ||||
|  | ||||
| @@ -264,9 +267,69 @@ module.exports = { | ||||
|                     theme.page = theme.page || {_:{}} | ||||
|                     theme.page._.scripts = scriptFiles.concat(theme.page._.scripts || []) | ||||
|                 } | ||||
|                 if(theme.codeEditor) { | ||||
|                     theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); | ||||
|                 // check and load page settings from theme | ||||
|                 if (themePlugin.page) { | ||||
|                     if (themePlugin.page.favicon  && !theme.page.favicon) { | ||||
|                         const result = serveFilesFromTheme( | ||||
|                             [themePlugin.page.favicon], | ||||
|                             themeApp, | ||||
|                             "/", | ||||
|                             themePlugin.path | ||||
|                         ) | ||||
|                         if(result && result.length > 0) { | ||||
|                             // update themeContext page favicon | ||||
|                             themeContext.page.favicon = result[0] | ||||
|                             theme.page = theme.page || {_:{}} | ||||
|                             theme.page._.favicon = result[0] | ||||
|                         } | ||||
|                     } | ||||
|                     if (themePlugin.page.tabicon && themePlugin.page.tabicon.icon && !theme.page.tabicon) { | ||||
|                         const result = serveFilesFromTheme( | ||||
|                             [themePlugin.page.tabicon.icon], | ||||
|                             themeApp, | ||||
|                             "/page/", | ||||
|                             themePlugin.path | ||||
|                         ) | ||||
|                         if(result && result.length > 0) { | ||||
|                             // update themeContext page tabicon | ||||
|                             themeContext.page.tabicon.icon = result[0] | ||||
|                             themeContext.page.tabicon.colour = themeContext.page.tabicon.colour || themeContext.page.tabicon.colour | ||||
|                             theme.page = theme.page || {_:{}} | ||||
|                             theme.page._.tabicon = theme.page._.tabicon || {} | ||||
|                             theme.page._.tabicon.icon = themeContext.page.tabicon.icon  | ||||
|                             theme.page._.tabicon.colour = themeContext.page.tabicon.colour | ||||
|                         } | ||||
|                     } | ||||
|                     // if the plugin has a title AND the users settings.js does NOT | ||||
|                     if (themePlugin.page.title && !theme.page.title) { | ||||
|                         themeContext.page.title = themePlugin.page.title || themeContext.page.title | ||||
|                     } | ||||
|                 } | ||||
|                 // check and load header settings from theme | ||||
|                 if (themePlugin.header) { | ||||
|                     if (themePlugin.header.image && !theme.header.image) { | ||||
|                         const result = serveFilesFromTheme( | ||||
|                             [themePlugin.header.image], | ||||
|                             themeApp, | ||||
|                             "/header/", | ||||
|                             themePlugin.path | ||||
|                         ) | ||||
|                         if(result && result.length > 0) { | ||||
|                             // update themeContext header image | ||||
|                             themeContext.header.image = result[0] | ||||
|                         } | ||||
|                     } | ||||
|                     // if the plugin has a title AND the users settings.js does NOT have a title | ||||
|                     if (themePlugin.header.title && !theme.header.title) { | ||||
|                         themeContext.header.title = themePlugin.header.title || themeContext.header.title | ||||
|                     } | ||||
|                     // if the plugin has a header url AND the users settings.js does NOT | ||||
|                     if (themePlugin.header.url && !theme.header.url) { | ||||
|                         themeContext.header.url = themePlugin.header.url || themeContext.header.url | ||||
|                     } | ||||
|                 } | ||||
|                 theme.codeEditor = theme.codeEditor || {} | ||||
|                 theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); | ||||
|             } | ||||
|             activeThemeInitialised = true; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user