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') {