Factorize addusertousergroup
Noah Zalev committed
Dec 7, 2021 at 21:18 UTC
a5b9d02d49b91b957bd47cc4744f8a59593e17f4
1 file changed
+79
-80
meshuser.js
+79
-80
@@ -1783,84 +1783,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1783
parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
1784
}
1785
}
1786
- break;
1787
- }
1788
- case 'addusertousergroup':
1789
- {
1790
- var err = null;
1791
- try {
1792
- if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1793
- else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
1794
- else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
1795
- else {
1796
- var ugroupidsplit = command.ugrpid.split('/');
1797
- if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
1798
- }
1799
- } catch (ex) { err = 'Validation exception: ' + ex; }
1800
-
1801
- // Fetch the domain
1802
- var addUserDomain = domain;
1803
- if (obj.crossDomain === true) { addUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
1804
- if (addUserDomain == null) { err = 'Invalid domain'; }
1805
-
1806
- // Handle any errors
1807
- if (err != null) {
1808
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1809
- break;
1810
- }
1811
-
1812
- // Get the user group
1813
- var group = parent.userGroups[command.ugrpid];
1814
- if (group != null) {
1815
- if (group.links == null) { group.links = {}; }
1816
-
1817
- var unknownUsers = [], addedCount = 0, failCount = 0, knownUsers = [];
1818
- for (var i in command.usernames) {
1819
- // Check if the user exists
1820
- var chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i].toLowerCase();
1821
- var chguser = parent.users[chguserid];
1822
- if (chguser == null) { chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i]; chguser = parent.users[chguserid]; }
1823
- if (chguser != null) {
1824
- // Add mesh to user
1825
- if (chguser.links == null) { chguser.links = {}; }
1826
- chguser.links[group._id] = { rights: 1 };
1827
- db.SetUser(chguser);
1828
- parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1829
-
1830
- knownUsers.push(chguser)
1831
- // Notify user change
1832
- var targets = ['*', 'server-users', user._id, chguser._id];
1833
- var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msgid: 67, msgArgs: [chguser.name], msg: 'User group membership changed: ' + chguser.name, domain: addUserDomain.id };
1834
- 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.
1835
- parent.parent.DispatchEvent(targets, obj, event);
1836
-
1837
- // Add a user to the user group
1838
- group.links[chguserid] = { userid: chguser._id, name: chguser.name, rights: 1 };
1839
- addedCount++;
1840
- } else {
1841
- unknownUsers.push(command.usernames[i]);
1842
- failCount++;
1843
- }
1844
- }
1845
-
1846
- if (addedCount > 0) {
1847
- // Save the new group to the database
1848
- db.Set(group);
1849
-
1850
- // Notify user group change
1851
- var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msgid: 71, msgArgs: [knownUsers.map((u)=>u.name), group.name], msg: 'Added user(s) ' + knownUsers.map((u)=>u.name) + ' to user group ' + group.name, addUserDomain: domain.id };
1852
- 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.
1853
- parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
1854
- }
1855
-
1856
- if (unknownUsers.length > 0) {
1857
- // Send error back, user not found.
1858
- displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', "Device Group", 'ServerNotify', 5, (unknownUsers.length > 1) ? 16 : 15, [EscapeHtml(unknownUsers.join(', '))]);
1859
- }
1860
- }
1861
-
1862
- if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1863
-
1786
break;
1787
}
1788
case 'removeuserfromusergroup':
@@ -5632,6 +5554,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5554
const serverCommands = {
5555
'adduser': serverCommandAddUser,
5556
'adduserbatch': serverCommandAddUserBatch,
5557
+ 'addusertousergroup': serverCommandAddUserToUserGroup,
5558
'files': serverCommandFiles,
5559
'getnetworkinfo': serverCommandGetNetworkInfo,
5560
'getsysinfo': serverCommandGetSysInfo,
@@ -5917,6 +5840,82 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5840
});
5841
}
5842
5843
+ function serverCommandAddUserToUserGroup(command) {
5844
+ var err = null;
5845
+ try {
5846
+ if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
5847
+ else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
5848
+ else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
5849
+ else {
5850
+ var ugroupidsplit = command.ugrpid.split('/');
5851
+ if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
5852
+ }
5853
+ } catch (ex) { err = 'Validation exception: ' + ex; }
5854
+
5855
+ // Fetch the domain
5856
+ var addUserDomain = domain;
5857
+ if (obj.crossDomain === true) { addUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
5858
+ if (addUserDomain == null) { err = 'Invalid domain'; }
5859
+
5860
+ // Handle any errors
5861
+ if (err != null) {
5862
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
5863
+ return;
5864
+ }
5865
+
5866
+ // Get the user group
5867
+ var group = parent.userGroups[command.ugrpid];
5868
+ if (group != null) {
5869
+ if (group.links == null) { group.links = {}; }
5870
+
5871
+ var unknownUsers = [], addedCount = 0, failCount = 0, knownUsers = [];
5872
+ for (var i in command.usernames) {
5873
+ // Check if the user exists
5874
+ var chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i].toLowerCase();
5875
+ var chguser = parent.users[chguserid];
5876
+ if (chguser == null) { chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i]; chguser = parent.users[chguserid]; }
5877
+ if (chguser != null) {
5878
+ // Add mesh to user
5879
+ if (chguser.links == null) { chguser.links = {}; }
5880
+ chguser.links[group._id] = { rights: 1 };
5881
+ db.SetUser(chguser);
5882
+ parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
5883
+
5884
+ knownUsers.push(chguser);
5885
+ // Notify user change
5886
+ var targets = ['*', 'server-users', user._id, chguser._id];
5887
+ var event = { etype: 'user', userid: user._id, username: user.name, account: parent.CloneSafeUser(chguser), action: 'accountchange', msgid: 67, msgArgs: [chguser.name], msg: 'User group membership changed: ' + chguser.name, domain: addUserDomain.id };
5888
+ 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.
5889
+ parent.parent.DispatchEvent(targets, obj, event);
5890
+
5891
+ // Add a user to the user group
5892
+ group.links[chguserid] = { userid: chguser._id, name: chguser.name, rights: 1 };
5893
+ addedCount++;
5894
+ } else {
5895
+ unknownUsers.push(command.usernames[i]);
5896
+ failCount++;
5897
+ }
5898
+ }
5899
+
5900
+ if (addedCount > 0) {
5901
+ // Save the new group to the database
5902
+ db.Set(group);
5903
+
5904
+ // Notify user group change
5905
+ var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msgid: 71, msgArgs: [knownUsers.map((u)=>u.name), group.name], msg: 'Added user(s) ' + knownUsers.map((u)=>u.name) + ' to user group ' + group.name, addUserDomain: domain.id };
5906
+ 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.
5907
+ parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
5908
+ }
5909
+
5910
+ if (unknownUsers.length > 0) {
5911
+ // Send error back, user not found.
5912
+ displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', "Device Group", 'ServerNotify', 5, (unknownUsers.length > 1) ? 16 : 15, [EscapeHtml(unknownUsers.join(', '))]);
5913
+ }
5914
+ }
5915
+
5916
+ if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
5917
+ }
5918
+
5919
function serverCommandFiles(command) {
5920
// Send the full list of server files to the browser app
5921
updateUserFiles(user, ws, domain);
@@ -6152,7 +6151,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
6151
var cmdTableEntry = serverUserCommands[cmd2];
6152
if (cmdTableEntry) {
6153
if (cmdTableEntry[1] == '') {
6155
- cmdData.result = 'No help available for this command.'
6154
+ cmdData.result = 'No help available for this command.';
6155
} else {
6156
cmdData.result = cmdTableEntry[1]; }
6157
} else {
@@ -6322,7 +6321,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
6321
// Reset bad login table
6322
parent.badLoginTable = {};
6323
parent.badLoginTableLastClean = 0;
6325
- cmdData.result = 'Done.'
6324
+ cmdData.result = 'Done.';
6325
} else if (cmdData.cmdargs['_'] == '') {
6326
// Show current bad login table
6327
if (typeof parent.parent.config.settings.maxinvalidlogin.coolofftime == 'number') {