RocketChat/Rocket.Chat

View on GitHub
apps/meteor/app/federation/server/normalizers/user.js

Summary

Maintainability
A
2 hrs
Test Coverage
import { Users } from '@rocket.chat/models';
import _ from 'underscore';

import { getNameAndDomain, isFullyQualified } from '../functions/helpers';
import { getFederationDomain } from '../lib/getFederationDomain';

const denormalizeUser = (originalResource) => {
    const resource = { ...originalResource };

    // Only denormalize local emails
    if (resource.federation && resource.federation.origin === getFederationDomain()) {
        resource.emails = [
            {
                address: resource.federation.originalInfo.email,
            },
        ];
    }

    const [username, domain] = getNameAndDomain(resource.username);

    resource.username = domain === getFederationDomain() ? username : resource.username;

    return resource;
};

const denormalizeAllUsers = (resources) => resources.map(denormalizeUser);

const normalizeUser = async (originalResource) => {
    // Get only what we need, non-sensitive data
    const resource = _.pick(
        originalResource,
        '_id',
        'username',
        'type',
        'emails',
        'name',
        'federation',
        'isRemote',
        'createdAt',
        '_updatedAt',
    );

    resource.emails = [
        {
            address: `${resource._id}@${getFederationDomain()}`,
        },
    ];
    const email = resource.emails[0].address;

    resource.active = true;
    resource.roles = ['user'];
    resource.status = 'online';
    resource.username = !isFullyQualified(resource.username) ? `${resource.username}@${getFederationDomain()}` : resource.username;

    // Federation
    resource.federation = resource.federation || {
        origin: getFederationDomain(),
        originalInfo: {
            email,
        },
    };

    resource.isRemote = resource.federation.origin !== getFederationDomain();

    // Persist the normalization
    await Users.updateOne({ _id: resource._id }, { $set: { isRemote: resource.isRemote, federation: resource.federation } });

    return resource;
};

const normalizeAllUsers = (resources) => Promise.all(resources.map(normalizeUser));

export default {
    denormalizeUser,
    denormalizeAllUsers,
    normalizeUser,
    normalizeAllUsers,
};