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