RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/statistics/server/lib/getServicesStatistics.ts

Summary

Maintainability
B
5 hrs
Test Coverage
import { Users } from '@rocket.chat/models';
import { MongoInternals } from 'meteor/mongo';

import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred';
import { settings } from '../../../settings/server';

const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo;

async function getCustomOAuthServices(): Promise<
    Record<
        string,
        {
            enabled: boolean;
            mergeRoles: boolean;
            users: number;
        }
    >
> {
    const readPreference = readSecondaryPreferred(db);

    const customOauth = settings.getByRegexp(/Accounts_OAuth_Custom-[^-]+$/im);
    return Object.fromEntries(
        await Promise.all(
            Object.entries(customOauth).map(async ([key, value]) => {
                const name = key.replace('Accounts_OAuth_Custom-', '');
                return [
                    name,
                    {
                        enabled: Boolean(value),
                        mergeRoles: settings.get<boolean>(`Accounts_OAuth_Custom-${name}-merge_roles`),
                        users: await Users.countActiveUsersByService(name, { readPreference }),
                        mapChannels: settings.get<boolean>(`Accounts_OAuth_Custom-${name}-map_channels`),
                        rolesToSync: !!settings.get<string>(`Accounts_OAuth_Custom-${name}-roles_to_sync`),
                    },
                ];
            }),
        ),
    );
}

export async function getServicesStatistics(): Promise<Record<string, unknown>> {
    const readPreference = readSecondaryPreferred(db);

    return {
        ldap: {
            users: await Users.countActiveUsersByService('ldap', { readPreference }),
            enabled: settings.get('LDAP_Enable'),
            loginFallback: settings.get('LDAP_Login_Fallback'),
            encryption: settings.get('LDAP_Encryption'),
            mergeUsers: settings.get('LDAP_Merge_Existing_Users'),
            syncRoles: settings.get('LDAP_Sync_User_Data_Roles'),
            syncRolesAutoRemove: settings.get('LDAP_Sync_User_Data_Roles_AutoRemove'),
            syncData: settings.get('LDAP_Sync_Custom_Fields'),
            syncChannels: settings.get('LDAP_Sync_User_Data_Channels'),
            syncAvatar: settings.get('LDAP_Sync_User_Avatar'),
            groupFilter: settings.get('LDAP_Group_Filter_Enable'),
            backgroundSync: {
                enabled: settings.get('LDAP_Background_Sync'),
                interval: settings.get('LDAP_Background_Sync_Interval'),
                newUsers: settings.get('LDAP_Background_Sync_Import_New_Users'),
                existingUsers: settings.get('LDAP_Background_Sync_Keep_Existant_Users_Updated'),
            },
            ee: {
                syncActiveState: settings.get('LDAP_Sync_User_Active_State'),
                syncTeams: settings.get('LDAP_Enable_LDAP_Groups_To_RC_Teams'),
                syncRoles: settings.get('LDAP_Sync_User_Data_Roles'),
            },
        },
        saml: {
            enabled: settings.get('SAML_Custom_Default'),
            users: await Users.countActiveUsersByService('saml', { readPreference }),
            signatureValidationType: settings.get('SAML_Custom_Default_signature_validation_type'),
            generateUsername: settings.get('SAML_Custom_Default_generate_username'),
            updateSubscriptionsOnLogin: settings.get('SAML_Custom_Default_channels_update'),
            syncRoles: settings.get('SAML_Custom_Default_role_attribute_sync'),
            userDataCustomFieldMap: !(
                settings.getSetting('SAML_Custom_Default_user_data_custom_fieldmap')?.packageValue ===
                settings.getSetting('SAML_Custom_Default_user_data_custom_fieldmap')?.value
            ),
        },
        cas: {
            enabled: settings.get('CAS_enabled'),
            users: await Users.countActiveUsersByService('cas', { readPreference }),
            allowUserCreation: settings.get('CAS_Creation_User_Enabled'),
            alwaysSyncUserData: settings.get('CAS_Sync_User_Data_Enabled'),
        },
        oauth: {
            apple: {
                enabled: settings.get('Accounts_OAuth_Apple'),
                users: await Users.countActiveUsersByService('apple', { readPreference }),
            },
            dolphin: {
                enabled: settings.get('Accounts_OAuth_Dolphin'),
                users: await Users.countActiveUsersByService('dolphin', { readPreference }),
            },
            drupal: {
                enabled: settings.get('Accounts_OAuth_Drupal'),
                users: await Users.countActiveUsersByService('drupal', { readPreference }),
            },
            facebook: {
                enabled: settings.get('Accounts_OAuth_Facebook'),
                users: await Users.countActiveUsersByService('facebook', { readPreference }),
            },
            github: {
                enabled: settings.get('Accounts_OAuth_Github'),
                users: await Users.countActiveUsersByService('github', { readPreference }),
            },
            githubEnterprise: {
                enabled: settings.get('Accounts_OAuth_GitHub_Enterprise'),
                users: await Users.countActiveUsersByService('github_enterprise', { readPreference }),
            },
            gitlab: {
                enabled: settings.get('Accounts_OAuth_Gitlab'),
                users: await Users.countActiveUsersByService('gitlab', { readPreference }),
            },
            google: {
                enabled: settings.get('Accounts_OAuth_Google'),
                users: await Users.countActiveUsersByService('google', { readPreference }),
            },
            linkedin: {
                enabled: settings.get('Accounts_OAuth_Linkedin'),
                users: await Users.countActiveUsersByService('linkedin', { readPreference }),
            },
            meteor: {
                enabled: settings.get('Accounts_OAuth_Meteor'),
                users: await Users.countActiveUsersByService('meteor', { readPreference }),
            },
            nextcloud: {
                enabled: settings.get('Accounts_OAuth_Nextcloud'),
                users: await Users.countActiveUsersByService('nextcloud', { readPreference }),
            },
            tokenpass: {
                enabled: settings.get('Accounts_OAuth_Tokenpass'),
                users: await Users.countActiveUsersByService('tokenpass', { readPreference }),
            },
            twitter: {
                enabled: settings.get('Accounts_OAuth_Twitter'),
                users: await Users.countActiveUsersByService('twitter', { readPreference }),
            },
            wordpress: {
                enabled: settings.get('Accounts_OAuth_Wordpress'),
                users: await Users.countActiveUsersByService('wordpress', { readPreference }),
            },
            custom: await getCustomOAuthServices(),
        },
    };
}