apps/meteor/app/federation/server/normalizers/user.js
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,
};