Factorize removeuserfromusergroup

Noah Zalev committed Dec 7, 2021 at 22:00 UTC 92c53d98541d1749a0ca69c04490113494beef33
1 file changed +69 -70
meshuser.js
+69 -70
@@ -1771,76 +1771,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1771 parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
1772 }
1773 }
1774 - break;
1775 - }
1776 - case 'removeuserfromusergroup':
1777 - {
1778 - var err = null;
1779 - try {
1780 - if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1781 - else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; }
1782 - else if (common.validateString(command.userid, 1, 256) == false) { err = 'Invalid userid'; }
1783 - else {
1784 - var ugroupidsplit = command.ugrpid.split('/');
1785 - if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
1786 - }
1787 - } catch (ex) { err = 'Validation exception: ' + ex; }
1788 -
1789 - // Fetch the domain
1790 - var removeUserDomain = domain;
1791 - if (obj.crossDomain !== true) { removeUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
1792 - if (removeUserDomain == null) { err = 'Invalid domain'; }
1793 -
1794 - // Handle any errors
1795 - if (err != null) {
1796 - if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1797 - break;
1798 - }
1799 -
1800 - // Check if the user exists
1801 - if (command.userid.startsWith('user/') == false) {
1802 - if (parent.users['user/' + removeUserDomain.id + '/' + command.userid.toLowerCase()] != null) { command.userid = 'user/' + removeUserDomain.id + '/' + command.userid.toLowerCase(); }
1803 - else if (parent.users['user/' + removeUserDomain.id + '/' + command.userid] != null) { command.userid = 'user/' + removeUserDomain.id + '/' + command.userid; }
1804 - }
1805 -
1806 - var chguser = parent.users[command.userid];
1807 - if (chguser != null) {
1808 - var change = false;
1809 - if ((chguser.links != null) && (chguser.links[command.ugrpid] != null)) {
1810 - change = true;
1811 - delete chguser.links[command.ugrpid];
1812 -
1813 - // Notify user change
1814 - var targets = ['*', 'server-users', user._id, chguser._id];
1815 - 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: removeUserDomain.id };
1816 - 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.
1817 - parent.parent.DispatchEvent(targets, obj, event);
1818 -
1819 - db.SetUser(chguser);
1820 - parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
1821 - }
1822 -
1823 - // Get the user group
1824 - var group = parent.userGroups[command.ugrpid];
1825 - if (group != null) {
1826 - // Remove the user from the group
1827 - if ((group.links != null) && (group.links[command.userid] != null)) {
1828 - change = true;
1829 - delete group.links[command.userid];
1830 - db.Set(group);
1831 -
1832 - // Notify user group change
1833 - if (change) {
1834 - 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: 72, msgArgs: [chguser.name, group.name], msg: 'Removed user ' + chguser.name + ' from user group ' + group.name, domain: removeUserDomain.id };
1835 - 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.
1836 - parent.parent.DispatchEvent(['*', group._id, user._id, chguser._id], obj, event);
1837 - }
1838 - }
1839 - }
1840 - }
1841 -
1842 - if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1843 -
1774 break;
1775 }
1776 case 'changemeshnotify':
@@ -5554,6 +5484,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5484 'pong': serverCommandPong,
5485 'powertimeline': serverCommandPowerTimeline,
5486 'print': serverCommandPrint,
5487 + 'removeuserfromusergroup': serverCommandRemoveUserFromUserGroup,
5488 'serverclearerrorlog': serverCommandServerClearErrorLog,
5489 'serverconsole': serverCommandServerConsole,
5490 'servererrors': serverCommandServerErrors,
@@ -6053,6 +5984,74 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
5984
5985 function serverCommandPrint(command) { console.log(command.value); }
5986
5987 + function serverCommandRemoveUserFromUserGroup(command) {
5988 + var err = null;
5989 + try {
5990 + if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
5991 + else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; }
5992 + else if (common.validateString(command.userid, 1, 256) == false) { err = 'Invalid userid'; }
5993 + else {
5994 + var ugroupidsplit = command.ugrpid.split('/');
5995 + if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
5996 + }
5997 + } catch (ex) { err = 'Validation exception: ' + ex; }
5998 +
5999 + // Fetch the domain
6000 + var removeUserDomain = domain;
6001 + if (obj.crossDomain !== true) { removeUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
6002 + if (removeUserDomain == null) { err = 'Invalid domain'; }
6003 +
6004 + // Handle any errors
6005 + if (err != null) {
6006 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
6007 + return;
6008 + }
6009 +
6010 + // Check if the user exists
6011 + if (command.userid.startsWith('user/') == false) {
6012 + if (parent.users['user/' + removeUserDomain.id + '/' + command.userid.toLowerCase()] != null) { command.userid = 'user/' + removeUserDomain.id + '/' + command.userid.toLowerCase(); }
6013 + else if (parent.users['user/' + removeUserDomain.id + '/' + command.userid] != null) { command.userid = 'user/' + removeUserDomain.id + '/' + command.userid; }
6014 + }
6015 +
6016 + var chguser = parent.users[command.userid];
6017 + if (chguser != null) {
6018 + var change = false;
6019 + if ((chguser.links != null) && (chguser.links[command.ugrpid] != null)) {
6020 + change = true;
6021 + delete chguser.links[command.ugrpid];
6022 +
6023 + // Notify user change
6024 + var targets = ['*', 'server-users', user._id, chguser._id];
6025 + 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: removeUserDomain.id };
6026 + 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.
6027 + parent.parent.DispatchEvent(targets, obj, event);
6028 +
6029 + db.SetUser(chguser);
6030 + parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
6031 + }
6032 +
6033 + // Get the user group
6034 + var group = parent.userGroups[command.ugrpid];
6035 + if (group != null) {
6036 + // Remove the user from the group
6037 + if ((group.links != null) && (group.links[command.userid] != null)) {
6038 + change = true;
6039 + delete group.links[command.userid];
6040 + db.Set(group);
6041 +
6042 + // Notify user group change
6043 + if (change) {
6044 + 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: 72, msgArgs: [chguser.name, group.name], msg: 'Removed user ' + chguser.name + ' from user group ' + group.name, domain: removeUserDomain.id };
6045 + 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.
6046 + parent.parent.DispatchEvent(['*', group._id, user._id, chguser._id], obj, event);
6047 + }
6048 + }
6049 + }
6050 + }
6051 +
6052 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: 'ok' })); } catch (ex) { } }
6053 + }
6054 +
6055 function serverCommandServerClearErrorLog(command) {
6056 // Clear the server error log if user has site update permissions
6057 if (userHasSiteUpdate()) { fs.unlink(parent.parent.getConfigFilePath('mesherrors.txt'), function (err) { }); }