Improved user group management in meshctrl.js

Ylian Saint-Hilaire committed Oct 5, 2020 at 03:53 UTC a59f09a806eb5608701e9ff00bd5f193ea66f9e3
1 file changed +115 -57
meshctrl.js
+115 -57
@@ -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', 'addusertousergroup', 'removeuserfromusergroup', 'removeallusersfromusergroup'];
10 +const possibleCommands = ['listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', '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', 'addtousergroup', 'removefromusergroup', '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) {
@@ -24,18 +24,15 @@ if (args['_'].length == 0) {
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.");
27 console.log(" DeviceInfo - Show information about a device.");
28 console.log(" Config - Perform operation on config.json file.");
29 console.log(" AddUser - Create a new user account.");
30 console.log(" RemoveUser - Delete a user account.");
31 console.log(" AddUserGroup - Create a new user group.");
32 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.");
33 + console.log(" AddToUserGroup - Add a user, device or device group to a user group.");
34 + console.log(" RemoveFromUserGroup - Remove a user, device or device group from a user group.");
35 console.log(" RemoveAllUsersFromUserGroup - Remove all users from a user group.");
38 -
36 console.log(" AddDeviceGroup - Create a new device group.");
37 console.log(" RemoveDeviceGroup - Delete a device group.");
38 console.log(" EditDeviceGroup - Change a device group values.");
@@ -86,12 +83,6 @@ if (args['_'].length == 0) {
83 else { ok = true; }
84 break;
85 }
89 - case 'listusersofusergroup': {
90 - if (args.groupid == null) { console.log(winRemoveSingleQuotes("User group id missing, use --groupid '[id]'")); }
91 - else { ok = true; }
92 - break;
93 - }
94 -
86 case 'deviceinfo': {
87 if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); }
88 else { ok = true; }
@@ -168,15 +159,15 @@ if (args['_'].length == 0) {
159 else { ok = true; }
160 break;
161 }
171 - case 'addusertousergroup': {
162 + case 'addtousergroup': {
163 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]'")); }
164 + if (args.id == null) { console.log(winRemoveSingleQuotes("Missing identifier to add, use --id [id]")); }
165 else { ok = true; }
166 break;
167 }
177 - case 'removeuserfromusergroup': {
168 + case 'removefromusergroup': {
169 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]'")); }
170 + if (args.id == null) { console.log(winRemoveSingleQuotes("Missing identifier to remove, use --id [id]")); }
171 else { ok = true; }
172 break;
173 }
@@ -362,17 +353,6 @@ if (args['_'].length == 0) {
353 console.log(" --json - Show result as JSON.");
354 break;
355 }
365 - case 'listusersofusergroup': {
366 - console.log("List users that are part of a user group, Example usage:\r\n");
367 - console.log(" MeshCtrl ListUserOfUserGroup ");
368 - console.log("\r\nRequired arguments:\r\n");
369 - if (process.platform == 'win32') {
370 - console.log(" --id [groupid] - Device group identifier.");
371 - } else {
372 - console.log(" --id '[groupid]' - Device group identifier.");
373 - }
374 - break;
375 - }
356 case 'adduser': {
357 console.log("Add a new user account, Example usages:\r\n");
358 console.log(" MeshCtrl AddUser --user newaccountname --pass newpassword");
@@ -419,28 +399,34 @@ if (args['_'].length == 0) {
399 }
400 break;
401 }
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'"));
402 + case 'addtousergroup': {
403 + console.log("Add a user, device or device group to a user group, Example usages:\r\n");
404 + console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'user//abcdef' --groupid 'ugrp//abcdf'"));
405 + console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'node//abcdef' --groupid 'ugrp//abcdf' --rights [rights]"));
406 + console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'mesh//abcdef' --groupid 'ugrp//abcdf' --rights [rights]a"));
407 console.log("\r\nRequired arguments:\r\n");
408 if (process.platform == 'win32') {
427 - console.log(" --userid [userid] - User identifier.");
409 + console.log(" --id [id] - Identifier to add.");
410 console.log(" --groupid [groupid] - User group identifier.");
411 } else {
430 - console.log(" --userid '[userid]' - User identifier.");
412 + console.log(" --id '[id]' - Identifier to add.");
413 console.log(" --groupid '[groupid]' - User group identifier.");
414 }
415 + console.log("\r\nOptional arguments:\r\n");
416 + console.log(" --rights [number] - Rights granted for adding device or device group.");
417 break;
418 }
435 - case 'removeuserfromusergroup': {
436 - console.log("Remove a user from a user group, Example usages:\r\n");
419 + case 'removefromusergroup': {
420 + console.log("Remove a user, device or device group from a user group, Example usages:\r\n");
421 console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'user//abcdef' --groupid 'ugrp//abcdf'"));
422 + console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'node//abcdef' --groupid 'ugrp//abcdf'"));
423 + console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'mesh//abcdef' --groupid 'ugrp//abcdf'"));
424 console.log("\r\nRequired arguments:\r\n");
425 if (process.platform == 'win32') {
440 - console.log(" --userid [userid] - User identifier.");
426 + console.log(" --id [userid] - Identifier to remove.");
427 console.log(" --groupid [groupid] - User group identifier.");
428 } else {
443 - console.log(" --userid '[userid]' - User identifier.");
429 + console.log(" --id '[userid]' - Identifier to remove.");
430 console.log(" --groupid '[groupid]' - User group identifier.");
431 }
432 break;
@@ -948,7 +934,6 @@ function serverConnect() {
934 case 'userinfo': { break; }
935 case 'listusers': { ws.send(JSON.stringify({ action: 'users', responseid: 'meshctrl' })); break; }
936 case 'listusersessions': { ws.send(JSON.stringify({ action: 'wssessioncount', responseid: 'meshctrl' })); break; }
951 - case 'listusersofusergroup':
937 case 'removeallusersfromusergroup':
938 case 'listusergroups': { ws.send(JSON.stringify({ action: 'usergroups', responseid: 'meshctrl' })); break; }
939 case 'listdevicegroups': { ws.send(JSON.stringify({ action: 'meshes', responseid: 'meshctrl' })); break; }
@@ -1000,20 +985,97 @@ function serverConnect() {
985 ws.send(JSON.stringify({ action: 'deleteusergroup', ugrpid: ugrpid, responseid: 'meshctrl' }));
986 break;
987 }
1003 - case 'addusertousergroup': {
988 + case 'addtousergroup': {
989 var ugrpid = args.groupid;
990 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' }));
991 +
992 + // Add a user to a user group
993 + if (args.userid != null) {
994 + var userid = args.userid;
995 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { userid = 'user/' + args.domain + '/' + userid; }
996 + ws.send(JSON.stringify({ action: 'addusertousergroup', ugrpid: ugrpid, usernames: [userid.split('/')[2]], responseid: 'meshctrl' }));
997 + break;
998 + }
999 +
1000 + if ((args.id != null) && (args.id.startsWith('user/'))) {
1001 + ws.send(JSON.stringify({ action: 'addusertousergroup', ugrpid: ugrpid, usernames: [args.id.split('/')[2]], responseid: 'meshctrl' }));
1002 + break;
1003 + }
1004 +
1005 + var rights = 0;
1006 + if (args.rights != null) { rights = parseInt(args.rights); }
1007 +
1008 + // Add a device group to a user group
1009 + if (args.meshid != null) {
1010 + var meshid = args.meshid;
1011 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { meshid = 'mesh/' + args.domain + '/' + meshid; }
1012 + ws.send(JSON.stringify({ action: 'addmeshuser', meshid: meshid, userid: ugrpid, meshadmin: rights, responseid: 'meshctrl' }));
1013 + break;
1014 + }
1015 +
1016 + if ((args.id != null) && (args.id.startsWith('mesh/'))) {
1017 + ws.send(JSON.stringify({ action: 'addmeshuser', meshid: args.id, userid: ugrpid, meshadmin: rights, responseid: 'meshctrl' }));
1018 + break;
1019 + }
1020 +
1021 + // Add a device to a user group
1022 + if (args.nodeid != null) {
1023 + var nodeid = args.nodeid;
1024 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { nodeid = 'node/' + args.domain + '/' + nodeid; }
1025 + ws.send(JSON.stringify({ action: 'adddeviceuser', nodeid: nodeid, userids: [ugrpid], rights: rights, responseid: 'meshctrl' }));
1026 + break;
1027 + }
1028 +
1029 + if ((args.id != null) && (args.id.startsWith('node/'))) {
1030 + ws.send(JSON.stringify({ action: 'adddeviceuser', nodeid: args.id, userids: [ugrpid], rights: rights, responseid: 'meshctrl' }));
1031 + break;
1032 + }
1033 +
1034 break;
1035 }
1011 - case 'removeuserfromusergroup': {
1036 + case 'removefromusergroup': {
1037 var ugrpid = args.groupid;
1038 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' }));
1039 +
1040 + // Remove a user from a user group
1041 + if (args.userid != null) {
1042 + var userid = args.userid;
1043 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { userid = 'user/' + args.domain + '/' + userid; }
1044 + ws.send(JSON.stringify({ action: 'removeuserfromusergroup', ugrpid: ugrpid, userid: userid, responseid: 'meshctrl' }));
1045 + break;
1046 + }
1047 +
1048 + if ((args.id != null) && (args.id.startsWith('user/'))) {
1049 + ws.send(JSON.stringify({ action: 'removeuserfromusergroup', ugrpid: ugrpid, userid: args.id, responseid: 'meshctrl' }));
1050 + break;
1051 + }
1052 +
1053 + // Remove a device group from a user group
1054 + if (args.meshid != null) {
1055 + var meshid = args.meshid;
1056 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { meshid = 'mesh/' + args.domain + '/' + meshid; }
1057 + ws.send(JSON.stringify({ action: 'removemeshuser', meshid: meshid, userid: ugrpid, responseid: 'meshctrl' }));
1058 + break;
1059 + }
1060 +
1061 + if ((args.id != null) && (args.id.startsWith('mesh/'))) {
1062 + ws.send(JSON.stringify({ action: 'removemeshuser', meshid: args.id, userid: ugrpid, responseid: 'meshctrl' }));
1063 + break;
1064 + }
1065 +
1066 + // Remove a device from a user group
1067 + if (args.nodeid != null) {
1068 + var nodeid = args.nodeid;
1069 + if ((args.domain != null) && (userid.indexOf('/') < 0)) { nodeid = 'node/' + args.domain + '/' + nodeid; }
1070 + ws.send(JSON.stringify({ action: 'adddeviceuser', nodeid: nodeid, userids: [ugrpid], rights: 0, responseid: 'meshctrl', remove: true }));
1071 + break;
1072 + }
1073 +
1074 + if ((args.id != null) && (args.id.startsWith('node/'))) {
1075 + ws.send(JSON.stringify({ action: 'adddeviceuser', nodeid: args.id, userids: [ugrpid], rights: 0, responseid: 'meshctrl', remove: true }));
1076 + break;
1077 + }
1078 +
1079 break;
1080 }
1081 case 'adddevicegroup': {
@@ -1298,21 +1360,17 @@ function serverConnect() {
1360 var x = i + ', ' + data.ugroups[i].name;
1361 if (data.ugroups[i].desc && (data.ugroups[i].desc != '')) { x += ', ' + data.ugroups[i].desc; }
1362 console.log(x);
1363 + var mesh = [], user = [], node = [];
1364 + if (data.ugroups[i].links != null) { for (var j in data.ugroups[i].links) { if (j.startsWith('mesh/')) { mesh.push(j); } if (j.startsWith('user/')) { user.push(j); } if (j.startsWith('node/')) { node.push(j); } } }
1365 + console.log(' Users:');
1366 + if (user.length > 0) { for (var j in user) { console.log(' ' + user[j]); } } else { console.log(' (None)'); }
1367 + console.log(' Device Groups:');
1368 + if (mesh.length > 0) { for (var j in mesh) { console.log(' ' + mesh[j] + ', ' + data.ugroups[i].links[mesh[j]].rights); } } else { console.log(' (None)'); }
1369 + console.log(' Devices:');
1370 + if (node.length > 0) { for (var j in node) { console.log(' ' + node[j] + ', ' + data.ugroups[i].links[node[j]].rights); } } else { console.log(' (None)'); }
1371 }
1372 }
1373 process.exit();
1304 - } else if (settings.cmd == 'listusersofusergroup') {
1305 - var ugrpid = args.groupid;
1306 - if ((args.domain != null) && (userid.indexOf('/') < 0)) { ugrpid = 'ugrp/' + args.domain + '/' + ugrpid; }
1307 - var ugroup = data.ugroups[ugrpid];
1308 - if (ugroup == null) {
1309 - console.log('User group not found.');
1310 - } else {
1311 - var usercount = 0;
1312 - if (ugroup.links) { for (var i in ugroup.links) { if (i.startsWith('user/')) { usercount++; console.log(i); } } }
1313 - if (usercount == 0) { console.log('No users in this user group.'); }
1314 - }
1315 - process.exit();
1374 } else if (settings.cmd == 'removeallusersfromusergroup') {
1375 var ugrpid = args.groupid, exit = false;
1376 if ((args.domain != null) && (userid.indexOf('/') < 0)) { ugrpid = 'ugrp/' + args.domain + '/' + ugrpid; }