Added user group management commands to MeshCtrl.js

Ylian Saint-Hilaire committed Oct 2, 2020 at 16:17 UTC 5b1a7045f5f8f83b9a9c689c67d4a61976f7accc
2 files changed +168 -47
meshctrl.js
+165 -47
@@ -7,7 +7,7 @@ try { require('ws'); } catch (ex) { console.log('Missing module "ws", type "npm
7 var settings = {};
8 const crypto = require('crypto');
9 const args = require('minimist')(process.argv.slice(2));
10 -const possibleCommands = ['listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', 'listusersofusergroup', 'serverinfo', 'userinfo', 'adduser', 'removeuser', 'adddevicegroup', 'removedevicegroup', 'editdevicegroup', 'broadcast', 'showevents', 'addusertodevicegroup', 'removeuserfromdevicegroup', 'addusertodevice', 'removeuserfromdevice', 'sendinviteemail', 'generateinvitelink', 'config', 'movetodevicegroup', 'deviceinfo', 'addusergroup', 'listusergroups', 'removeusergroup', 'runcommand', 'shell', 'upload', 'download', 'deviceopenurl', 'devicemessage', 'devicetoast'];
10 +const possibleCommands = ['listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', 'listusersofusergroup', 'serverinfo', 'userinfo', 'adduser', 'removeuser', 'adddevicegroup', 'removedevicegroup', 'editdevicegroup', 'broadcast', 'showevents', 'addusertodevicegroup', 'removeuserfromdevicegroup', 'addusertodevice', 'removeuserfromdevice', 'sendinviteemail', 'generateinvitelink', 'config', 'movetodevicegroup', 'deviceinfo', 'addusergroup', 'listusergroups', 'removeusergroup', 'runcommand', 'shell', 'upload', 'download', 'deviceopenurl', 'devicemessage', 'devicetoast', 'addusertousergroup', 'removeuserfromusergroup', 'removeallusersfromusergroup'];
11 if (args.proxy != null) { try { require('https-proxy-agent'); } catch (ex) { console.log('Missing module "https-proxy-agent", type "npm install https-proxy-agent" to install it.'); return; } }
12
13 if (args['_'].length == 0) {
@@ -15,51 +15,56 @@ if (args['_'].length == 0) {
15 console.log("Information at: https://meshcommander.com/meshcentral");
16 console.log("No action specified, use MeshCtrl like this:\r\n\r\n meshctrl [action] [arguments]\r\n");
17 console.log("Supported actions:");
18 - console.log(" Help [action] - Get help on an action.");
19 - console.log(" ServerInfo - Show server information.");
20 - console.log(" UserInfo - Show user information.");
21 - console.log(" ListUsers - List user accounts.");
22 - console.log(" ListUserSessions - List online users.");
23 - console.log(" ListUserGroups - List user groups.");
24 - console.log(" ListDevices - List devices.");
25 - console.log(" ListDeviceGroups - List device groups.");
26 - console.log(" ListUsersOfDeviceGroup - List the users in a device group.");
27 - console.log(" ListUsersOfUserGroup - List the users in a user group.");
28 - console.log(" DeviceInfo - Show information about a device.");
29 - console.log(" Config - Perform operation on config.json file.");
30 - console.log(" AddUser - Create a new user account.");
31 - console.log(" RemoveUser - Delete a user account.");
32 - console.log(" AddUserGroup - Create a new user group.");
33 - console.log(" RemoveUserGroup - Delete a user group.");
34 - console.log(" AddDeviceGroup - Create a new device group.");
35 - console.log(" RemoveDeviceGroup - Delete a device group.");
36 - console.log(" EditDeviceGroup - Change a device group values.");
37 - console.log(" MoveToDeviceGroup - Move a device to a different device group.");
38 - console.log(" AddUserToDeviceGroup - Add a user to a device group.");
39 - console.log(" RemoveUserFromDeviceGroup - Remove a user from a device group.");
40 - console.log(" AddUserToDevice - Add a user to a device.");
41 - console.log(" RemoveUserFromDevice - Remove a user from a device.");
42 - console.log(" SendInviteEmail - Send an agent install invitation email.");
43 - console.log(" GenerateInviteLink - Create an invitation link.");
44 - console.log(" Broadcast - Display a message to all online users.");
45 - console.log(" ShowEvents - Display real-time server events in JSON format.");
46 - console.log(" RunCommand - Run a shell command on a remote device.");
47 - console.log(" Shell - Access command shell of a remote device.");
48 - console.log(" Upload - Upload a file to a remote device.");
49 - console.log(" Download - Download a file from a remote device.");
50 - console.log(" DeviceOpenUrl - Open a URL on a remote device.");
51 - console.log(" DeviceMessage - Open a message box on a remote device.");
52 - console.log(" DeviceToast - Display a toast notification on a remote device.");
18 + console.log(" Help [action] - Get help on an action.");
19 + console.log(" ServerInfo - Show server information.");
20 + console.log(" UserInfo - Show user information.");
21 + console.log(" ListUsers - List user accounts.");
22 + console.log(" ListUserSessions - List online users.");
23 + console.log(" ListUserGroups - List user groups.");
24 + console.log(" ListDevices - List devices.");
25 + console.log(" ListDeviceGroups - List device groups.");
26 + console.log(" ListUsersOfDeviceGroup - List the users in a device group.");
27 + console.log(" ListUsersOfUserGroup - List the users in a user group.");
28 + console.log(" DeviceInfo - Show information about a device.");
29 + console.log(" Config - Perform operation on config.json file.");
30 + console.log(" AddUser - Create a new user account.");
31 + console.log(" RemoveUser - Delete a user account.");
32 + console.log(" AddUserGroup - Create a new user group.");
33 + console.log(" RemoveUserGroup - Delete a user group.");
34 +
35 + console.log(" AddUserToUserGroup - Add a user to an existing user group.");
36 + console.log(" RemoveUserFromUserGroup - Remove a user from a user group.");
37 + console.log(" RemoveAllUsersFromUserGroup - Remove all users from a user group.");
38 +
39 + console.log(" AddDeviceGroup - Create a new device group.");
40 + console.log(" RemoveDeviceGroup - Delete a device group.");
41 + console.log(" EditDeviceGroup - Change a device group values.");
42 + console.log(" MoveToDeviceGroup - Move a device to a different device group.");
43 + console.log(" AddUserToDeviceGroup - Add a user to a device group.");
44 + console.log(" RemoveUserFromDeviceGroup - Remove a user from a device group.");
45 + console.log(" AddUserToDevice - Add a user to a device.");
46 + console.log(" RemoveUserFromDevice - Remove a user from a device.");
47 + console.log(" SendInviteEmail - Send an agent install invitation email.");
48 + console.log(" GenerateInviteLink - Create an invitation link.");
49 + console.log(" Broadcast - Display a message to all online users.");
50 + console.log(" ShowEvents - Display real-time server events in JSON format.");
51 + console.log(" RunCommand - Run a shell command on a remote device.");
52 + console.log(" Shell - Access command shell of a remote device.");
53 + console.log(" Upload - Upload a file to a remote device.");
54 + console.log(" Download - Download a file from a remote device.");
55 + console.log(" DeviceOpenUrl - Open a URL on a remote device.");
56 + console.log(" DeviceMessage - Open a message box on a remote device.");
57 + console.log(" DeviceToast - Display a toast notification on a remote device.");
58 console.log("\r\nSupported login arguments:");
54 - console.log(" --url [wss://server] - Server url, wss://localhost:443 is default.");
55 - console.log(" - Use wss://localhost:443?key=xxx if login key is required.");
56 - console.log(" --loginuser [username] - Login username, admin is default.");
57 - console.log(" --loginpass [password] - Login password.");
58 - console.log(" --token [number] - 2nd factor authentication token.");
59 - console.log(" --loginkey [hex] - Server login key in hex.");
60 - console.log(" --loginkeyfile [file] - File containing server login key in hex.");
61 - console.log(" --logindomain [domainid] - Domain id, default is empty, only used with loginkey.");
62 - console.log(" --proxy [http://proxy:1] - Specify an HTTP proxy.");
59 + console.log(" --url [wss://server] - Server url, wss://localhost:443 is default.");
60 + console.log(" - Use wss://localhost:443?key=xxx if login key is required.");
61 + console.log(" --loginuser [username] - Login username, admin is default.");
62 + console.log(" --loginpass [password] - Login password.");
63 + console.log(" --token [number] - 2nd factor authentication token.");
64 + console.log(" --loginkey [hex] - Server login key in hex.");
65 + console.log(" --loginkeyfile [file] - File containing server login key in hex.");
66 + console.log(" --logindomain [domainid] - Domain id, default is empty, only used with loginkey.");
67 + console.log(" --proxy [http://proxy:1] - Specify an HTTP proxy.");
68 return;
69 } else {
70 settings.cmd = args['_'][0].toLowerCase();
@@ -163,6 +168,23 @@ if (args['_'].length == 0) {
168 else { ok = true; }
169 break;
170 }
171 + case 'addusertousergroup': {
172 + if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); }
173 + if (args.userid == null) { console.log(winRemoveSingleQuotes("User id missing, use --userid '[id]'")); }
174 + else { ok = true; }
175 + break;
176 + }
177 + case 'removeuserfromusergroup': {
178 + if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); }
179 + if (args.userid == null) { console.log(winRemoveSingleQuotes("User id missing, use --userid '[id]'")); }
180 + else { ok = true; }
181 + break;
182 + }
183 + case 'removeallusersfromusergroup': {
184 + if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); }
185 + else { ok = true; }
186 + break;
187 + }
188 case 'sendinviteemail': {
189 if ((args.id == null) && (args.group == null)) { console.log("Device group identifier missing, use --id '[groupid]' or --group [groupname]"); }
190 else if (args.email == null) { console.log("Device email is missing, use --email [email]"); }
@@ -379,6 +401,61 @@ if (args['_'].length == 0) {
401 console.log(" --userid [id] - Account identifier.");
402 break;
403 }
404 + case 'addusergroup': {
405 + console.log("Create a new user group, Example usages:\r\n");
406 + console.log(" MeshCtrl AddUserGroup --name \"Test Group\"");
407 + console.log("\r\nRequired arguments:\r\n");
408 + console.log(" --name [name] - Name of the user group.");
409 + break;
410 + }
411 + case 'removeusergroup': {
412 + console.log("Remove a user group, Example usages:\r\n");
413 + console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserGroup --groupid 'ugrp//abcdf'"));
414 + console.log("\r\nRequired arguments:\r\n");
415 + if (process.platform == 'win32') {
416 + console.log(" --groupid [groupid] - User group identifier.");
417 + } else {
418 + console.log(" --groupid '[groupid]' - User group identifier.");
419 + }
420 + break;
421 + }
422 + case 'addusertousergroup': {
423 + console.log("Add a user to a user group, Example usages:\r\n");
424 + console.log(winRemoveSingleQuotes(" MeshCtrl AddUserToUserGroup --userid 'user//abcdef' --groupid 'ugrp//abcdf'"));
425 + console.log("\r\nRequired arguments:\r\n");
426 + if (process.platform == 'win32') {
427 + console.log(" --userid [userid] - User identifier.");
428 + console.log(" --groupid [groupid] - User group identifier.");
429 + } else {
430 + console.log(" --userid '[userid]' - User identifier.");
431 + console.log(" --groupid '[groupid]' - User group identifier.");
432 + }
433 + break;
434 + }
435 + case 'removeuserfromusergroup': {
436 + console.log("Remove a user from a user group, Example usages:\r\n");
437 + console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'user//abcdef' --groupid 'ugrp//abcdf'"));
438 + console.log("\r\nRequired arguments:\r\n");
439 + if (process.platform == 'win32') {
440 + console.log(" --userid [userid] - User identifier.");
441 + console.log(" --groupid [groupid] - User group identifier.");
442 + } else {
443 + console.log(" --userid '[userid]' - User identifier.");
444 + console.log(" --groupid '[groupid]' - User group identifier.");
445 + }
446 + break;
447 + }
448 + case 'removeallusersfromusergroup': {
449 + console.log("Remove all users from a user group, Example usages:\r\n");
450 + console.log(winRemoveSingleQuotes(" MeshCtrl RemoveAllUsersFromUserGroup --groupid 'ugrp//abcdf'"));
451 + console.log("\r\nRequired arguments:\r\n");
452 + if (process.platform == 'win32') {
453 + console.log(" --groupid [groupid] - User group identifier.");
454 + } else {
455 + console.log(" --groupid '[groupid]' - User group identifier.");
456 + }
457 + break;
458 + }
459 case 'adddevicegroup': {
460 console.log("Add a device group, Example usages:\r\n");
461 console.log(" MeshCtrl AddDeviceGroup --name newgroupname");
@@ -870,9 +947,10 @@ function serverConnect() {
947 case 'serverinfo': { break; }
948 case 'userinfo': { break; }
949 case 'listusers': { ws.send(JSON.stringify({ action: 'users', responseid: 'meshctrl' })); break; }
873 - case 'listusersessions': { ws.send(JSON.stringify({ action: 'wssessioncount', responseid: 'meshctrl' })); }
950 + case 'listusersessions': { ws.send(JSON.stringify({ action: 'wssessioncount', responseid: 'meshctrl' })); break; }
951 case 'listusersofusergroup':
875 - case 'listusergroups': { ws.send(JSON.stringify({ action: 'usergroups', responseid: 'meshctrl' })); }
952 + case 'removeallusersfromusergroup':
953 + case 'listusergroups': { ws.send(JSON.stringify({ action: 'usergroups', responseid: 'meshctrl' })); break; }
954 case 'listdevicegroups': { ws.send(JSON.stringify({ action: 'meshes', responseid: 'meshctrl' })); break; }
955 case 'listusersofdevicegroup': { ws.send(JSON.stringify({ action: 'meshes', responseid: 'meshctrl' })); break; }
956 case 'listdevices': {
@@ -922,6 +1000,22 @@ function serverConnect() {
1000 ws.send(JSON.stringify({ action: 'deleteusergroup', ugrpid: ugrpid, responseid: 'meshctrl' }));
1001 break;
1002 }
1003 + case 'addusertousergroup': {
1004 + var ugrpid = args.groupid;
1005 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { ugrpid = 'ugrp/' + args.domain + '/' + ugrpid; }
1006 + var userid = args.userid;
1007 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { userid = 'user/' + args.domain + '/' + userid; }
1008 + ws.send(JSON.stringify({ action: 'addusertousergroup', ugrpid: ugrpid, usernames: [userid], responseid: 'meshctrl' }));
1009 + break;
1010 + }
1011 + case 'removeuserfromusergroup': {
1012 + var ugrpid = args.groupid;
1013 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { ugrpid = 'ugrp/' + args.domain + '/' + ugrpid; }
1014 + var userid = args.userid;
1015 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { userid = 'user/' + args.domain + '/' + userid; }
1016 + ws.send(JSON.stringify({ action: 'removeuserfromusergroup', ugrpid: ugrpid, userid: userid, responseid: 'meshctrl' }));
1017 + break;
1018 + }
1019 case 'adddevicegroup': {
1020 var op = { action: 'createmesh', meshname: args.name, meshtype: 2, responseid: 'meshctrl' };
1021 if (args.desc) { op.desc = args.desc; }
@@ -1167,7 +1261,10 @@ function serverConnect() {
1261 case 'createusergroup': //
1262 case 'deleteusergroup': //
1263 case 'runcommands':
1264 + case 'addusertousergroup':
1265 + case 'removeuserfromusergroup':
1266 case 'userbroadcast': { // BROADCAST
1267 + if ((settings.multiresponse != null) && (settings.multiresponse > 1)) { settings.multiresponse--; break; }
1268 if (data.responseid == 'meshctrl') {
1269 if (data.meshid) { console.log(data.result, data.meshid); }
1270 else if (data.userid) { console.log(data.result, data.userid); }
@@ -1216,6 +1313,27 @@ function serverConnect() {
1313 if (usercount == 0) { console.log('No users in this user group.'); }
1314 }
1315 process.exit();
1316 + } else if (settings.cmd == 'removeallusersfromusergroup') {
1317 + var ugrpid = args.groupid, exit = false;
1318 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { ugrpid = 'ugrp/' + args.domain + '/' + ugrpid; }
1319 + var ugroup = data.ugroups[ugrpid];
1320 + if (ugroup == null) {
1321 + console.log('User group not found.');
1322 + exit = true;
1323 + } else {
1324 + var usercount = 0;
1325 + if (ugroup.links) {
1326 + for (var i in ugroup.links) {
1327 + if (i.startsWith('user/')) {
1328 + usercount++;
1329 + ws.send(JSON.stringify({ action: 'removeuserfromusergroup', ugrpid: ugrpid, userid: i, responseid: 'meshctrl' }));
1330 + console.log('Removing ' + i);
1331 + }
1332 + }
1333 + }
1334 + if (usercount == 0) { console.log('No users in this user group.'); exit = true; } else { settings.multiresponse = usercount; }
1335 + }
1336 + if (exit) { process.exit(); }
1337 }
1338 break;
1339 }
meshuser.js
+3
@@ -2360,6 +2360,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2360 }
2361
2362 // Check if the user exists
2363 + if (command.userid.startsWith('user/') == false) { command.userid = 'user/' + removeUserDomain.id + '/' + command.userid.toLowerCase(); }
2364 var chguser = parent.users[command.userid];
2365 if (chguser != null) {
2366 var change = false;
@@ -2396,6 +2397,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2397 }
2398 }
2399
2400 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
2401 +
2402 break;
2403 }
2404 case 'changemeshnotify':