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; }