AnveshKumar M
Tera Sage
Tera Sage

Motivated by most commonly asked questions in community, I thought of creating a Script Include which can address the most common needs for any Developer like checking whether the user has a role / any one of the roles specified / all roles and is member of a group / member of any one of the group / member of all specified groups etc.

 

I tried my best to keep the code as simple as possible and understandable, and here it is.

 

var CustomUserUtils = Class.create();
CustomUserUtils.prototype = {
    initialize: function() {},

    /*
    	Parameters:
    		user : sys_id of user
    		role : role name
    	
    	Returns: boolean
    		- true 	: if the user have the exact role
    		- false	: if the user does not have exact role
    */

    hasRoleExactly: function(user, role) {
        var roleGr = new GlideRecord('sys_user_has_role');
        roleGr.addQuery('user', user);
        roleGr.addQuery('role.name', role);
        roleGr.addQuery('state', 'active');
        roleGr.setLimit(1);
        roleGr.query();

        if (roleGr.next()) {
            return true;
        }
        return false;
    },

    /*
    	Parameters:
    		user : sys_id of user
    		role : list of comma seperated roles
    	
    	Returns: Boolean
    		- true 	: if the user have any one of the exact role
    		- false	: if the user does not have any one of the exact role
    */
    hasAnyRoleExactly: function(user, roles) {
        var roleGr = new GlideRecord('sys_user_has_role');
        roleGr.addQuery('user', user);
        roleGr.addQuery('role.name', 'IN', roles);
        roleGr.addQuery('state', 'active');
        roleGr.setLimit(1);
        roleGr.query();

        if (roleGr.next()) {
            return true;
        }
        return false;
    },

    /*
    	Parameters:
    		user : sys_id of user
    		role : list of comma seperated roles
    	
    	Returns: Boolean
    		- true 	: if the user have all of the roles exactly
    		- false	: if the user does not have any one of the role exactly
    */
    hasAllRoles: function(user, roles) {
        var roleGr = new GlideRecord('sys_user_has_role');
        roleGr.addQuery('user', user);
        roleGr.addQuery('role.name', 'IN', roles);
        roleGr.addQuery('state', 'active');
        roleGr.query();
        var actual_roles = [];
        while (roleGr.next()) {
            actual_roles.push(roleGr.role.name + '');
        }
        var arrayUtil = new ArrayUtil();
        actual_roles = arrayUtil.unique(actual_roles);
        var query_roles = roles.split(',');
        if (query_roles.length === actual_roles.length) {
            return true;
        }
        return false;
    },

    /*
    	Parameters:
    		user : sys_id of user
    		group : group name
    	
    	Returns: Boolean
    		- true 	: if the user is member of the group
    		- false	: if the user is not member of the group
    */
    isMemberOf: function(user, group) {
        var grpGr = new GlideRecord('sys_user_grmember');
        grpGr.addQuery('user', user);
        grpGr.addQuery('group.name', group);
        grpGr.setLimit(1);
        grpGr.query();

        if (grpGr.next()) {
            return true;
        }
        return false;
    },

    /*
    	Parameters:
    		user : sys_id of user
    		groups : list of comma seperated group names
    	
    	Returns: Boolean
    		- true 	: if the user is member of any of one of the groups
    		- false	: if the user is not member of any groups specified
    */
    isMemberOfAny: function(user, groups) {
        var grpGr = new GlideRecord('sys_user_grmember');
        grpGr.addQuery('user', user);
        grpGr.addQuery('group.name', 'IN', groups);
        grpGr.setLimit(1);
        grpGr.query();

        if (grpGr.next()) {
            return true;
        }
        return false;
    },

    /*
    	Parameters:
    		user : sys_id of user
    		groups : list of comma seperated group names
    	
    	Returns: Boolean
    		- true 	: if the user is member of all the groups specified
    		- false	: if the user is not member of all the groups specified 
    */
    isMemberOfAll: function(user, groups) {
        var grpGr = new GlideRecord('sys_user_grmember');
        grpGr.addQuery('user', user);
        grpGr.addQuery('group.name', 'IN', groups);
        grpGr.query();
        var query_groups = groups.split(',');
        var actual_groups = [];
        while (grpGr.next()) {
            actual_groups.push(grpGr.group.name + '');
        }
        var arrayUtil = new ArrayUtil();
        actual_groups = arrayUtil.unique(actual_groups);

        if (query_groups.length === actual_groups.length) {
            return true;
        }
        return false;
    },

    type: 'CustomUserUtils'
};

 

I did tested this for both happy cases and negative scenarios to make sure it is bug free. For this I chose Abel Tuter as test user added the roles itil & knowledge and made him the member of CAB Approval, Service Desk and Database groups. Still if you find any shoot me a comment. 

 

var cuu = new CustomUserUtils();

//Has Role exactly - Happy case
gs.print(cuu.hasRoleExactly('62826bf03710200044e0bfc8bcbe5df1', 'itil'));

//Has Role exactly - Negative case
gs.print(cuu.hasRoleExactly('62826bf03710200044e0bfc8bcbe5df1', 'admin'));

//Has Any Role exactly - Happy case
gs.print(cuu.hasAnyRoleExactly('62826bf03710200044e0bfc8bcbe5df1', 'itil,knowledge'));

//Has Any Role exactly - Negative case
gs.print(cuu.hasAnyRoleExactly('62826bf03710200044e0bfc8bcbe5df1', 'admin,security_admin'));

//Has All Roles exactly - Happy case
gs.print(cuu.hasAllRoles('62826bf03710200044e0bfc8bcbe5df1', 'itil, knowledge'));

//Has All Roles exactly - Negative case
gs.print(cuu.hasAllRoles('62826bf03710200044e0bfc8bcbe5df1', 'admin,itil,knowledge'));

//Is Member of - Happy Case
gs.print(cuu.isMemberOf('62826bf03710200044e0bfc8bcbe5df1', 'Service Desk'));

//Is Member of - Negative Case
gs.print(cuu.isMemberOf('62826bf03710200044e0bfc8bcbe5df1', 'Hardware'));

//Is Member of Any - Happy Case
gs.print(cuu.isMemberOfAny('62826bf03710200044e0bfc8bcbe5df1', 'Service Desk, Hardware, Database'));

//Is Member of Any - Negative Case
gs.print(cuu.isMemberOfAny('62826bf03710200044e0bfc8bcbe5df1', 'Hardware,Software'));

//Is Member of All - Happy Case
gs.print(cuu.isMemberOfAll('62826bf03710200044e0bfc8bcbe5df1', 'Service Desk, CAB Approval,Database'));

//Is Member of All - Negative Case
gs.print(cuu.isMemberOfAll('62826bf03710200044e0bfc8bcbe5df1', 'Service Desk,CAB Approval,Database,Hardware,Software'));

 

I'll try extending the features of this Script Include and also create an extended class for accessing this from Client Side through GlideAjax.

 

Happy Coding đŸ˜€

 

-- Anvesh

Version history
Last update:
‎09-29-2023 02:37 AM
Updated by:
Contributors