More user groups improvements.
Ylian Saint-Hilaire committed
Jan 2, 2020 at 01:26 UTC
58d990361953d69ce715d43661e186272e52906d
3 files changed
+95
-85
meshuser.js
+75
-61
@@ -1574,10 +1574,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1574
var ugroupidsplit = command.ugrpid.split('/');
1575
if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) break;
1576
1577
- db.Get(command.ugrpid, function (err, groups) {
1578
- if ((err != null) || (groups.length != 1)) return;
1579
- var group = common.unEscapeLinksFieldName(groups[0]), change = '';
1580
-
1577
+ // Get the user group
1578
+ var group = parent.userGroups[command.ugrpid];
1579
+ if (group != null) {
1580
if ((common.validateString(command.name, 1, 64) == true) && (command.name != group.name) && (command.name.indexOf(' ') == -1)) { change = 'User group name changed from "' + group.name + '" to "' + command.name + '"'; group.name = command.name; }
1581
if ((common.validateString(command.desc, 0, 1024) == true) && (command.desc != group.desc)) { if (change != '') change += ' and description changed'; else change += 'User group "' + group.name + '" description changed'; group.desc = command.desc; }
1582
if (change != '') {
@@ -1586,7 +1585,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1585
if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come.
1586
parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
1587
}
1589
- });
1588
+ }
1589
break;
1590
}
1591
case 'addusertousergroup':
@@ -1608,9 +1607,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1607
break;
1608
}
1609
1611
- db.Get(command.ugrpid, function (err, groups) {
1612
- if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1613
- var group = common.unEscapeLinksFieldName(groups[0]);
1610
+ // Get the user group
1611
+ var group = parent.userGroups[command.ugrpid];
1612
+ if (group != null) {
1613
if (group.links == null) { group.links = {}; }
1614
1615
var unknownUsers = [], addedCount = 0, failCount = 0;
@@ -1630,14 +1629,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1629
if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
1630
parent.parent.DispatchEvent(targets, obj, event);
1631
1633
- // Add a user to the mesh
1632
+ // Add a user to the user group
1633
group.links[chguserid] = { userid: chguser.id, name: chguser.name, rights: 1 };
1635
- db.Set(common.escapeLinksFieldName(group));
1636
-
1637
- // Notify user group change
1638
- var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Added user ' + chguser.name + ' to user group ' + group.name, domain: domain.id };
1639
- if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1640
- parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
1634
addedCount++;
1635
} else {
1636
unknownUsers.push(command.usernames[i]);
@@ -1645,13 +1638,24 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1638
}
1639
}
1640
1641
+ if (addedCount > 0) {
1642
+ // Save the new group to the database
1643
+ db.Set(common.escapeLinksFieldName(group));
1644
+
1645
+ // Notify user group change
1646
+ var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Added user ' + chguser.name + ' to user group ' + group.name, domain: domain.id };
1647
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1648
+ parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
1649
+ }
1650
+
1651
if (unknownUsers.length > 0) {
1652
// Send error back, user not found.
1653
displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', 'Device Group', 'ServerNotify');
1654
}
1655
+ }
1656
+
1657
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1658
1653
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1654
- });
1659
break;
1660
}
1661
case 'removeuserfromusergroup':
@@ -1673,46 +1677,42 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1677
break;
1678
}
1679
1676
- db.Get(command.ugrpid, function (err, groups) {
1677
- //if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1678
- var group = null;
1679
- if ((err == null) && (groups.length == 1)) { group = common.unEscapeLinksFieldName(groups[0]); }
1680
+ // Check if the user exists
1681
+ var chguser = parent.users[command.userid];
1682
+ if (chguser != null) {
1683
+ var change = false;
1684
+ if ((chguser.links != null) && (chguser.links[command.ugrpid] != null)) {
1685
+ change = true;
1686
+ delete chguser.links[command.ugrpid];
1687
1681
- // Check if the user exists
1682
- var chguser = parent.users[command.userid];
1683
- if (chguser != null) {
1684
- var change = false;
1685
- if ((chguser.links != null) && (chguser.links[command.ugrpid] != null)) {
1686
- change = true;
1687
- delete chguser.links[command.ugrpid];
1688
+ // Notify user change
1689
+ var targets = ['*', 'server-users', user._id, chguser._id];
1690
+ var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'User group membership changed: ' + chguser.name, domain: domain.id };
1691
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
1692
+ parent.parent.DispatchEvent(targets, obj, event);
1693
1689
- // Notify user change
1690
- var targets = ['*', 'server-users', user._id, chguser._id];
1691
- var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msg: 'User group membership changed: ' + chguser.name, domain: domain.id };
1692
- if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
1693
- parent.parent.DispatchEvent(targets, obj, event);
1694
+ db.SetUser(chguser);
1695
+ parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1696
+ }
1697
1695
- db.SetUser(chguser);
1696
- parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1697
- }
1698
+ // Get the user group
1699
+ var group = parent.userGroups[command.ugrpid];
1700
+ if (group != null) {
1701
+ // Remove the user from the group
1702
+ if ((group.links != null) && (group.links[command.userid] != null)) {
1703
+ change = true;
1704
+ delete group.links[command.userid];
1705
+ db.Set(common.escapeLinksFieldName(group));
1706
1699
- if (group != null) {
1700
- // Remove the user from the group
1701
- if ((group.links != null) && (group.links[command.userid] != null)) {
1702
- change = true;
1703
- delete group.links[command.userid];
1704
- db.Set(common.escapeLinksFieldName(group));
1705
-
1706
- // Notify user group change
1707
- if (change) {
1708
- var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Removed user ' + chguser.name + ' from user group ' + group.name, domain: domain.id };
1709
- if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1710
- parent.parent.DispatchEvent(['*', group._id, user._id, chguser._id], obj, event);
1711
- }
1707
+ // Notify user group change
1708
+ if (change) {
1709
+ var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Removed user ' + chguser.name + ' from user group ' + group.name, domain: domain.id };
1710
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1711
+ parent.parent.DispatchEvent(['*', group._id, user._id, chguser._id], obj, event);
1712
}
1713
}
1714
}
1715
- });
1715
+ }
1716
1717
break;
1718
}
@@ -2027,17 +2027,31 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2027
2028
// Remove all user links to this mesh
2029
for (var j in mesh.links) {
2030
- var xuser = parent.users[j];
2031
- if (xuser && xuser.links) {
2032
- delete xuser.links[mesh._id];
2033
- db.SetUser(xuser);
2034
- parent.parent.DispatchEvent([xuser._id], obj, 'resubscribe');
2030
+ if (j.startsWith('user/')) {
2031
+ var xuser = parent.users[j];
2032
+ if (xuser && xuser.links) {
2033
+ delete xuser.links[mesh._id];
2034
+ db.SetUser(xuser);
2035
+ parent.parent.DispatchEvent([xuser._id], obj, 'resubscribe');
2036
2036
- // Notify user change
2037
- var targets = ['*', 'server-users', user._id, xuser._id];
2038
- var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(xuser), action: 'accountchange', msg: 'Device group membership changed: ' + xuser.name, domain: domain.id };
2039
- if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
2040
- parent.parent.DispatchEvent(targets, obj, event);
2037
+ // Notify user change
2038
+ var targets = ['*', 'server-users', user._id, xuser._id];
2039
+ var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(xuser), action: 'accountchange', msg: 'Device group membership changed: ' + xuser.name, domain: domain.id };
2040
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
2041
+ parent.parent.DispatchEvent(targets, obj, event);
2042
+ }
2043
+ } else if (j.startsWith('ugrp/')) {
2044
+ var xgroup = parent.userGroups[j];
2045
+ if (xgroup && xgroup.links) {
2046
+ delete xgroup.links[mesh._id];
2047
+ db.Set(xgroup);
2048
+
2049
+ // Notify user group change
2050
+ var targets = ['*', 'server-ugroups', user._id, xgroup._id];
2051
+ var event = { etype: 'ugrp', username: user.name, ugrpid: xgroup._id, name: xgroup.name, desc: xgroup.desc, action: 'usergroupchange', links: xgroup.links, msg: 'User group changed: ' + xgroup.name, domain: domain.id };
2052
+ if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
2053
+ parent.parent.DispatchEvent(targets, obj, event);
2054
+ }
2055
}
2056
}
2057
@@ -2125,7 +2139,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2139
if (newuserid == obj.user._id) { continue; }
2140
2141
// Add mesh to user or user group
2128
- if (newuser.links == null) newuser.links = {};
2142
+ if (newuser.links == null) { newuser.links = {}; }
2143
if (newuser.links[command.meshid]) { newuser.links[command.meshid].rights = command.meshadmin; } else { newuser.links[command.meshid] = { rights: command.meshadmin }; }
2144
if (newuserid.startsWith('user/')) { db.SetUser(newuser); }
2145
else if (newuserid.startsWith('ugrp/')) { db.Set(newuser); }
translate/translate.json
+9
-15
@@ -4168,7 +4168,7 @@
4168
"nl": "Apparaatgroepen",
4169
"xloc": [
4170
"default.handlebars->container->column_l->p2->9",
4171
- "default.handlebars->23->1246",
4171
+ "default.handlebars->23->1247",
4172
"default.handlebars->23->1258",
4173
"default.handlebars->23->1313",
4174
"default.handlebars->23->1386",
@@ -8987,7 +8987,7 @@
8987
"default.handlebars->23->1041",
8988
"default.handlebars->23->1178",
8989
"default.handlebars->23->1219",
8990
- "default.handlebars->23->1245",
8990
+ "default.handlebars->23->1246",
8991
"default.handlebars->23->1249",
8992
"default.handlebars->23->1253",
8993
"default.handlebars->23->1255",
@@ -14311,7 +14311,7 @@
14311
"nl": "Gebruikers",
14312
"xloc": [
14313
"default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral",
14314
- "default.handlebars->23->1247",
14314
+ "default.handlebars->23->1248",
14315
"default.handlebars->23->1257",
14316
"default.handlebars->23->1401"
14317
]
@@ -15532,8 +15532,10 @@
15532
},
15533
{
15534
"en": "Summary -",
15535
- "cs": "Souhrn –",
15536
- "nl": "Samenvatting -"
15535
+ "nl": "Samenvatting -",
15536
+ "xloc": [
15537
+ "default.handlebars->container->column_l->p21->p21title->3"
15538
+ ]
15539
},
15540
{
15541
"en": "Power States",
@@ -15963,7 +15965,6 @@
15965
]
15966
},
15967
{
15966
- "en": "Relay Count",
15968
"en": "Relay Count",
15969
"cs": "Počet předávání (relay)",
15970
"xloc": [
@@ -15977,13 +15978,6 @@
15978
"default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevAmt"
15979
]
15980
},
15980
- {
15981
- "en": "Summary -",
15982
- "nl": "Samenvatting -",
15983
- "xloc": [
15984
- "default.handlebars->container->column_l->p21->p21title->3"
15985
- ]
15986
- },
15981
{
15982
"en": "My User Groups",
15983
"nl": "Mijn gebruikersgroepen",
@@ -16023,7 +16017,7 @@
16017
"en": "No groups found.",
16018
"nl": "Geen groepen gevonden.",
16019
"xloc": [
16026
- "default.handlebars->23->1248"
16020
+ "default.handlebars->23->1245"
16021
]
16022
},
16023
{
@@ -16328,4 +16322,4 @@
16322
]
16323
}
16324
]
16331
-}
16325
+}
\ No newline at end of file
views/default.handlebars
+11
-9
@@ -7981,7 +7981,7 @@
7981
7982
function p20validateAddMeshUserDialog() {
7983
var meshrights = null;
7984
- if (xxdialogTag === 1) {
7984
+ if ((xxdialogTag === 1) || (xxdialogTag === 3)) {
7985
meshrights = GetMeshRights(decodeURIComponent(Q('dp2groupid').value));
7986
} else {
7987
meshrights = GetMeshRights(currentMesh);
@@ -9087,17 +9087,19 @@
9087
9088
function updateUserGroups() {
9089
// Sort the list of group names
9090
- var sortedGroups = [];
9090
+ var sortedGroups = [], x = '';
9091
for (var i in usergroups) { sortedGroups.push(usergroups[i]); }
9092
sortedGroups.sort(nameSort);
9093
9094
- // Display the groups using the sorted list
9095
- var x = '<table class=p3usersTable cellpadding=0 cellspacing=0>', addHeader = true;
9096
- x += '<th>' + "Name" + '<th style=width:80px>' + "Device Groups" + '<th style=width:80px>' + "Users";
9097
- for (var i in sortedGroups) { x += addUserGroupHtml(sortedGroups[i]); }
9098
- x += '</table>';
9099
-
9100
- if (sortedGroups.length == 0) { x += '<br />' + "No groups found." + '<br />'; }
9094
+ if (sortedGroups.length == 0) {
9095
+ x += '<br />' + "No groups found." + '<br />';
9096
+ } else {
9097
+ // Display the groups using the sorted list
9098
+ x += '<table class=p3usersTable cellpadding=0 cellspacing=0>';
9099
+ x += '<th>' + "Name" + '<th style=width:80px>' + "Device Groups" + '<th style=width:80px>' + "Users";
9100
+ for (var i in sortedGroups) { x += addUserGroupHtml(sortedGroups[i]); }
9101
+ x += '</table>';
9102
+ }
9103
QH('p50groups', x);
9104
9105
// Update current user panel if needed