mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	Factorize addusertousergroup
This commit is contained in:
		
							parent
							
								
									e626f03d5d
								
							
						
					
					
						commit
						a5b9d02d49
					
				
					 1 changed files with 79 additions and 80 deletions
				
			
		
							
								
								
									
										159
									
								
								meshuser.js
									
										
									
									
									
								
							
							
						
						
									
										159
									
								
								meshuser.js
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1783,84 +1783,6 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
 | 
			
		|||
                            parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            case 'addusertousergroup':
 | 
			
		||||
                {
 | 
			
		||||
                    var err = null;
 | 
			
		||||
                    try {
 | 
			
		||||
                        if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
 | 
			
		||||
                        else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
 | 
			
		||||
                        else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
 | 
			
		||||
                        else {
 | 
			
		||||
                            var ugroupidsplit = command.ugrpid.split('/');
 | 
			
		||||
                            if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch (ex) { err = 'Validation exception: ' + ex; }
 | 
			
		||||
 | 
			
		||||
                    // Fetch the domain
 | 
			
		||||
                    var addUserDomain = domain;
 | 
			
		||||
                    if (obj.crossDomain === true) { addUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
 | 
			
		||||
                    if (addUserDomain == null) { err = 'Invalid domain'; }
 | 
			
		||||
 | 
			
		||||
                    // Handle any errors
 | 
			
		||||
                    if (err != null) {
 | 
			
		||||
                        if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Get the user group
 | 
			
		||||
                    var group = parent.userGroups[command.ugrpid];
 | 
			
		||||
                    if (group != null) {
 | 
			
		||||
                        if (group.links == null) { group.links = {}; }
 | 
			
		||||
 | 
			
		||||
                        var unknownUsers = [], addedCount = 0, failCount = 0, knownUsers = [];
 | 
			
		||||
                        for (var i in command.usernames) {
 | 
			
		||||
                            // Check if the user exists
 | 
			
		||||
                            var chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i].toLowerCase();
 | 
			
		||||
                            var chguser = parent.users[chguserid];
 | 
			
		||||
                            if (chguser == null) { chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i]; chguser = parent.users[chguserid]; }
 | 
			
		||||
                            if (chguser != null) {
 | 
			
		||||
                                // Add mesh to user
 | 
			
		||||
                                if (chguser.links == null) { chguser.links = {}; }
 | 
			
		||||
                                chguser.links[group._id] = { rights: 1 };
 | 
			
		||||
                                db.SetUser(chguser);
 | 
			
		||||
                                parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
 | 
			
		||||
 | 
			
		||||
                                knownUsers.push(chguser)
 | 
			
		||||
                                // Notify user change
 | 
			
		||||
                                var targets = ['*', 'server-users', user._id, chguser._id];
 | 
			
		||||
                                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 };
 | 
			
		||||
                                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.
 | 
			
		||||
                                parent.parent.DispatchEvent(targets, obj, event);
 | 
			
		||||
 | 
			
		||||
                                // Add a user to the user group
 | 
			
		||||
                                group.links[chguserid] = { userid: chguser._id, name: chguser.name, rights: 1 };
 | 
			
		||||
                                addedCount++;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                unknownUsers.push(command.usernames[i]);
 | 
			
		||||
                                failCount++;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (addedCount > 0) {
 | 
			
		||||
                            // Save the new group to the database
 | 
			
		||||
                            db.Set(group);
 | 
			
		||||
 | 
			
		||||
                            // Notify user group change
 | 
			
		||||
                            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 };
 | 
			
		||||
                            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.
 | 
			
		||||
                            parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (unknownUsers.length > 0) {
 | 
			
		||||
                            // Send error back, user not found.
 | 
			
		||||
                            displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', "Device Group", 'ServerNotify', 5, (unknownUsers.length > 1) ? 16 : 15, [EscapeHtml(unknownUsers.join(', '))]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            case 'removeuserfromusergroup':
 | 
			
		||||
| 
						 | 
				
			
			@ -5632,6 +5554,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
 | 
			
		|||
    const serverCommands = {
 | 
			
		||||
        'adduser': serverCommandAddUser,
 | 
			
		||||
        'adduserbatch': serverCommandAddUserBatch,
 | 
			
		||||
        'addusertousergroup': serverCommandAddUserToUserGroup,
 | 
			
		||||
        'files': serverCommandFiles,
 | 
			
		||||
        'getnetworkinfo': serverCommandGetNetworkInfo,
 | 
			
		||||
        'getsysinfo': serverCommandGetSysInfo,
 | 
			
		||||
| 
						 | 
				
			
			@ -5917,6 +5840,82 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
 | 
			
		|||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function serverCommandAddUserToUserGroup(command) {
 | 
			
		||||
        var err = null;
 | 
			
		||||
        try {
 | 
			
		||||
            if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
 | 
			
		||||
            else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
 | 
			
		||||
            else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
 | 
			
		||||
            else {
 | 
			
		||||
                var ugroupidsplit = command.ugrpid.split('/');
 | 
			
		||||
                if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || ((obj.crossDomain !== true) && (ugroupidsplit[1] != domain.id))) { err = 'Invalid groupid'; }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (ex) { err = 'Validation exception: ' + ex; }
 | 
			
		||||
 | 
			
		||||
        // Fetch the domain
 | 
			
		||||
        var addUserDomain = domain;
 | 
			
		||||
        if (obj.crossDomain === true) { addUserDomain = parent.parent.config.domains[ugroupidsplit[1]]; }
 | 
			
		||||
        if (addUserDomain == null) { err = 'Invalid domain'; }
 | 
			
		||||
 | 
			
		||||
        // Handle any errors
 | 
			
		||||
        if (err != null) {
 | 
			
		||||
            if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get the user group
 | 
			
		||||
        var group = parent.userGroups[command.ugrpid];
 | 
			
		||||
        if (group != null) {
 | 
			
		||||
            if (group.links == null) { group.links = {}; }
 | 
			
		||||
 | 
			
		||||
            var unknownUsers = [], addedCount = 0, failCount = 0, knownUsers = [];
 | 
			
		||||
            for (var i in command.usernames) {
 | 
			
		||||
                // Check if the user exists
 | 
			
		||||
                var chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i].toLowerCase();
 | 
			
		||||
                var chguser = parent.users[chguserid];
 | 
			
		||||
                if (chguser == null) { chguserid = 'user/' + addUserDomain.id + '/' + command.usernames[i]; chguser = parent.users[chguserid]; }
 | 
			
		||||
                if (chguser != null) {
 | 
			
		||||
                    // Add mesh to user
 | 
			
		||||
                    if (chguser.links == null) { chguser.links = {}; }
 | 
			
		||||
                    chguser.links[group._id] = { rights: 1 };
 | 
			
		||||
                    db.SetUser(chguser);
 | 
			
		||||
                    parent.parent.DispatchEvent([chguser._id], obj, 'resubscribe');
 | 
			
		||||
 | 
			
		||||
                    knownUsers.push(chguser);
 | 
			
		||||
                    // Notify user change
 | 
			
		||||
                    var targets = ['*', 'server-users', user._id, chguser._id];
 | 
			
		||||
                    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 };
 | 
			
		||||
                    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.
 | 
			
		||||
                    parent.parent.DispatchEvent(targets, obj, event);
 | 
			
		||||
 | 
			
		||||
                    // Add a user to the user group
 | 
			
		||||
                    group.links[chguserid] = { userid: chguser._id, name: chguser.name, rights: 1 };
 | 
			
		||||
                    addedCount++;
 | 
			
		||||
                } else {
 | 
			
		||||
                    unknownUsers.push(command.usernames[i]);
 | 
			
		||||
                    failCount++;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (addedCount > 0) {
 | 
			
		||||
                // Save the new group to the database
 | 
			
		||||
                db.Set(group);
 | 
			
		||||
 | 
			
		||||
                // Notify user group change
 | 
			
		||||
                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 };
 | 
			
		||||
                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.
 | 
			
		||||
                parent.parent.DispatchEvent(['*', group._id, user._id, chguserid], obj, event);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (unknownUsers.length > 0) {
 | 
			
		||||
                // Send error back, user not found.
 | 
			
		||||
                displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', "Device Group", 'ServerNotify', 5, (unknownUsers.length > 1) ? 16 : 15, [EscapeHtml(unknownUsers.join(', '))]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function serverCommandFiles(command) {
 | 
			
		||||
        // Send the full list of server files to the browser app
 | 
			
		||||
        updateUserFiles(user, ws, domain);
 | 
			
		||||
| 
						 | 
				
			
			@ -6152,7 +6151,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
 | 
			
		|||
            var cmdTableEntry = serverUserCommands[cmd2];
 | 
			
		||||
            if (cmdTableEntry) {
 | 
			
		||||
                if (cmdTableEntry[1] == '') {
 | 
			
		||||
                    cmdData.result = 'No help available for this command.'
 | 
			
		||||
                    cmdData.result = 'No help available for this command.';
 | 
			
		||||
                } else {
 | 
			
		||||
                    cmdData.result = cmdTableEntry[1]; }
 | 
			
		||||
            } else { 
 | 
			
		||||
| 
						 | 
				
			
			@ -6322,7 +6321,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
 | 
			
		|||
                // Reset bad login table
 | 
			
		||||
                parent.badLoginTable = {};
 | 
			
		||||
                parent.badLoginTableLastClean = 0;
 | 
			
		||||
                cmdData.result = 'Done.'
 | 
			
		||||
                cmdData.result = 'Done.';
 | 
			
		||||
            } else if (cmdData.cmdargs['_'] == '') {
 | 
			
		||||
                // Show current bad login table
 | 
			
		||||
                if (typeof parent.parent.config.settings.maxinvalidlogin.coolofftime == 'number') {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue