mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	Refactor meshuser: initial command handlers
This commit is contained in:
		
							parent
							
								
									9f986a7229
								
							
						
					
					
						commit
						ff4c67da7c
					
				
					 1 changed files with 63 additions and 45 deletions
				
			
		
							
								
								
									
										108
									
								
								meshuser.js
									
										
									
									
									
								
							
							
						
						
									
										108
									
								
								meshuser.js
									
										
									
									
									
								
							|  | @ -551,7 +551,21 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use | |||
|         try { command = JSON.parse(msg.toString('utf8')); } catch (e) { return; } | ||||
|         if (common.validateString(command.action, 3, 32) == false) return; // Action must be a string between 3 and 32 chars
 | ||||
| 
 | ||||
|         var commandHandler = serverCommands[command.action]; | ||||
|         if (commandHandler != null) {  | ||||
|             try { commandHandler(command); return; | ||||
|             } catch (e) { | ||||
|                 console.log('Unhandled error while processing ' + command.action + ' for user ' +  + user.name + ':\n' + e); | ||||
|             } | ||||
|         } else { | ||||
|             // console.log('Unknown action from user ' + user.name + ': ' + command.action + '.');
 | ||||
|             // pass through to switch statement
 | ||||
|         } | ||||
| 
 | ||||
|         switch (command.action) { | ||||
|             // Avoid logging 'Unknown action...' for refactored commands
 | ||||
|             case 'lastconnect': | ||||
|             case 'serverconsole': | ||||
|             case 'pong': { break; } // NOP
 | ||||
|             case 'ping': { try { ws.send('{action:"pong"}'); } catch (ex) { } break; } | ||||
|             case 'intersession': | ||||
|  | @ -805,27 +819,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use | |||
|                     }); | ||||
|                     break; | ||||
|                 } | ||||
|             case 'lastconnect': | ||||
|                 { | ||||
|                     if (common.validateString(command.nodeid, 1, 1024) == false) break; // Check the nodeid
 | ||||
|                     if (command.nodeid.indexOf('/') == -1) { command.nodeid = 'node/' + domain.id + '/' + command.nodeid; } | ||||
|                     if ((command.nodeid.split('/').length != 3) || (command.nodeid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain
 | ||||
| 
 | ||||
|                     // Get the node and the rights for this node
 | ||||
|                     parent.GetNodeWithRights(domain, user, command.nodeid, function (node, rights, visible) { | ||||
|                         if (visible == false) { try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, tag: command.tag, noinfo: true, result: 'Invalid device id' })); } catch (ex) { } return; } | ||||
| 
 | ||||
|                         // Query the database for the last time this node connected
 | ||||
|                         db.Get('lc' + command.nodeid, function (err, docs) { | ||||
|                             if ((docs != null) && (docs.length > 0)) { | ||||
|                                 try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, time: docs[0].time, addr: docs[0].addr })); } catch (ex) { } | ||||
|                             } else { | ||||
|                                 try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, tag: command.tag, noinfo: true, result: 'No data' })); } catch (ex) { } | ||||
|                             } | ||||
|                         }); | ||||
|                     }); | ||||
|                     break; | ||||
|                 } | ||||
|             case 'files': | ||||
|                 { | ||||
|                     // Send the full list of server files to the browser app
 | ||||
|  | @ -895,30 +888,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use | |||
|                     } | ||||
|                     break; | ||||
|                 } | ||||
|             case 'serverconsole': | ||||
|                 { | ||||
|                     // Do not allow this command when logged in using a login token
 | ||||
|                     if (req.session.loginToken != null) break; | ||||
|                     // This is a server console message, only process this if full administrator
 | ||||
|                     if (user.siteadmin != SITERIGHT_ADMIN) break; | ||||
|                     // Only accept if the console is allowed for this domain
 | ||||
|                     if ((domain.myserver === false) || ((domain.myserver != null) && (domain.myserver !== true) && (domain.myserver.console !== true))) break; | ||||
| 
 | ||||
|                     var cmdargs = splitArgs(command.value); | ||||
|                     if (cmdargs.length == 0) break; | ||||
|                     const cmd = cmdargs[0].toLowerCase(); | ||||
|                     cmdargs = parseArgs(cmdargs); | ||||
|                     var cmdData = { result: '', command: command, cmdargs: cmdargs }; | ||||
| 
 | ||||
|                     // Find the command in the lookup table and run it.
 | ||||
|                     var cmdTableEntry = serverUserCommands[cmd]; | ||||
|                     if (cmdTableEntry != null) { try { cmdTableEntry[0](cmdData); } catch (ex) { cmdData.result = '' + ex; } | ||||
|                     } else { cmdData.result = 'Unknown command \"' + cmd + '\", type \"help\" for list of available commands.'; } | ||||
| 
 | ||||
|                     // Send back the command result
 | ||||
|                     if (cmdData.result != '') { try { ws.send(JSON.stringify({ action: 'serverconsole', value: cmdData.result, tag: command.tag })); } catch (ex) { } } | ||||
|                     break; | ||||
|                 } | ||||
|             case 'msg': | ||||
|                 { | ||||
|                     // Check the nodeid
 | ||||
|  | @ -5536,6 +5505,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     const serverCommands = { | ||||
|         'lastconnect': serverCommandLastConnect, | ||||
|         'serverconsole': serverCommandServerConsole | ||||
|     }; | ||||
| 
 | ||||
|     const serverUserCommands = { | ||||
|         'acceleratorsstats': [serverUserCommandAcceleratorsStats, "Show data on work being offloaded to other CPU's"], | ||||
|         'agentissues': [serverUserCommandAgentIssues, ""], | ||||
|  | @ -5586,6 +5560,50 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use | |||
|         'watchdog': [serverUserCommandWatchdog, ""], | ||||
|         'webpush': [serverUserCommandWebPush, ""], | ||||
|         'webstats': [serverUserCommandWebStats, ""] | ||||
|     }; | ||||
| 
 | ||||
|      | ||||
|     function serverCommandLastConnect(command) { | ||||
|         if (common.validateString(command.nodeid, 1, 1024) == false) return; // Check the nodeid
 | ||||
|         if (command.nodeid.indexOf('/') == -1) { command.nodeid = 'node/' + domain.id + '/' + command.nodeid; } | ||||
|         if ((command.nodeid.split('/').length != 3) || (command.nodeid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain
 | ||||
| 
 | ||||
|         // Get the node and the rights for this node
 | ||||
|         parent.GetNodeWithRights(domain, user, command.nodeid, function (node, rights, visible) { | ||||
|             if (visible == false) { try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, tag: command.tag, noinfo: true, result: 'Invalid device id' })); } catch (ex) { } return; } | ||||
| 
 | ||||
|             // Query the database for the last time this node connected
 | ||||
|             db.Get('lc' + command.nodeid, function (err, docs) { | ||||
|                 if ((docs != null) && (docs.length > 0)) { | ||||
|                     try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, time: docs[0].time, addr: docs[0].addr })); } catch (ex) { } | ||||
|                 } else { | ||||
|                     try { ws.send(JSON.stringify({ action: 'lastconnect', nodeid: command.nodeid, tag: command.tag, noinfo: true, result: 'No data' })); } catch (ex) { } | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     function serverCommandServerConsole(command) { | ||||
|         // Do not allow this command when logged in using a login token
 | ||||
|         if (req.session.loginToken != null) return; | ||||
|         // This is a server console message, only process this if full administrator
 | ||||
|         if (user.siteadmin != SITERIGHT_ADMIN) return; | ||||
|         // Only accept if the console is allowed for this domain
 | ||||
|         if ((domain.myserver === false) || ((domain.myserver != null) && (domain.myserver !== true) && (domain.myserver.console !== true))) return; | ||||
| 
 | ||||
|         var cmdargs = splitArgs(command.value); | ||||
|         if (cmdargs.length == 0) return; | ||||
|         const cmd = cmdargs[0].toLowerCase(); | ||||
|         cmdargs = parseArgs(cmdargs); | ||||
|         var cmdData = { result: '', command: command, cmdargs: cmdargs }; | ||||
| 
 | ||||
|         // Find the command in the lookup table and run it.
 | ||||
|         var cmdTableEntry = serverUserCommands[cmd]; | ||||
|         if (cmdTableEntry != null) { try { cmdTableEntry[0](cmdData); } catch (ex) { cmdData.result = '' + ex; } | ||||
|         } else { cmdData.result = 'Unknown command \"' + cmd + '\", type \"help\" for list of available commands.'; } | ||||
| 
 | ||||
|         // Send back the command result
 | ||||
|         if (cmdData.result != '') { try { ws.send(JSON.stringify({ action: 'serverconsole', value: cmdData.result, tag: command.tag })); } catch (ex) { } } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue