Some checks failed
Create issues from TODOs / todos (push) Failing after 3s
Close inactive issues / close-issues (push) Has been cancelled
Deploy GitHub Pages / deploy-preview (push) Has been cancelled
CI / ⚙️ Variables Setup (push) Has been cancelled
CI / ⚙️ Test Guard (push) Has been cancelled
CI / 🚀 Notify external services - draft (push) Has been cancelled
CI / 📦 Build Packages (push) Has been cancelled
CI / 📦 Meteor Build (coverage) (push) Has been cancelled
CI / 📦 Meteor Build (production) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], fips) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Publish Docker Images (ghcr.io) (push) Has been cancelled
CI / 📦 Track Image Sizes (push) Has been cancelled
CI / 🔎 Code Check - Action Lint (push) Has been cancelled
CI / 🔎 Code Check (push) Has been cancelled
CI / 🔨 Test Storybook (push) Has been cancelled
CI / 🔨 Test Unit (push) Has been cancelled
CI / 🔨 Test API (CE) (push) Has been cancelled
CI / 🔨 Test API Livechat (CE) (push) Has been cancelled
CI / 🔨 Test UI (CE) (push) Has been cancelled
CI / 🔨 Test API (EE) (push) Has been cancelled
CI / 🔨 Test API Livechat (EE) (push) Has been cancelled
CI / 🔨 Test API Apps (deno-runtime - EE) (push) Has been cancelled
CI / 🔨 Test UI (EE) (push) Has been cancelled
CI / 🔨 Test API (FIPS) (push) Has been cancelled
CI / 🔨 Test API Livechat (FIPS) (push) Has been cancelled
CI / 🔨 Test UI (FIPS) (push) Has been cancelled
CI / 🔨 Test Federation Matrix (push) Has been cancelled
CI / 📊 Report Coverage (push) Has been cancelled
CI / ✅ Tests Done (push) Has been cancelled
CI / 🚀 Publish build assets (push) Has been cancelled
CI / 🚀 Publish Docker Images (DockerHub) (push) Has been cancelled
CI / 🚀 Notify external services (push) Has been cancelled
CI / Update Version Durability (push) Has been cancelled
Release / Release (push) Has been cancelled
Auto-close duplicate issues / auto-close-duplicates (push) Failing after 1s
Code scanning - action / CodeQL-Build (push) Failing after 1s
97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
import type { IUser } from '@rocket.chat/core-typings';
|
|
import { License } from '@rocket.chat/license';
|
|
import { Users } from '@rocket.chat/models';
|
|
import Gravatar from 'gravatar';
|
|
import { Accounts } from 'meteor/accounts-base';
|
|
|
|
import { notifyOnUserChangeById } from '../../notifyListener';
|
|
import { validateEmailDomain } from '../../validateEmailDomain';
|
|
import { warnGravatarDeprecation } from '../gravatarDeprecation';
|
|
import { setUserAvatar } from '../setUserAvatar';
|
|
import { handleBio } from './handleBio';
|
|
import { handleNickname } from './handleNickname';
|
|
import type { SaveUserData } from './saveUser';
|
|
import { sendPasswordEmail, sendWelcomeEmail } from './sendUserEmail';
|
|
import { getNewUserRoles } from '../../../services/user/lib/getNewUserRoles';
|
|
import { settings } from '../../../settings';
|
|
|
|
export const saveNewUser = async function (userData: SaveUserData, sendPassword: boolean, performedBy: IUser) {
|
|
await validateEmailDomain(userData.email);
|
|
|
|
const roles = (!!userData.roles && userData.roles.length > 0 && userData.roles) || getNewUserRoles();
|
|
const isGuest = roles?.length === 1 && roles.includes('guest');
|
|
|
|
// insert user
|
|
const createUser: Record<string, any> = {
|
|
username: userData.username,
|
|
password: userData.password,
|
|
...(userData.name && { name: userData.name }),
|
|
joinDefaultChannels: userData.joinDefaultChannels,
|
|
isGuest,
|
|
globalRoles: roles,
|
|
skipNewUserRolesSetting: true,
|
|
performedBy,
|
|
};
|
|
if (userData.email) {
|
|
createUser.email = userData.email;
|
|
}
|
|
|
|
const _id = await Accounts.createUserAsync(createUser);
|
|
|
|
const updater = Users.getUpdater();
|
|
|
|
updater.set('settings', userData.settings || {});
|
|
if (typeof userData.name !== 'undefined') {
|
|
updater.set('name', userData.name);
|
|
}
|
|
|
|
if (typeof userData.requirePasswordChange !== 'undefined') {
|
|
updater.set('requirePasswordChange', userData.requirePasswordChange);
|
|
}
|
|
|
|
if (typeof userData.verified === 'boolean') {
|
|
updater.set('emails.0.verified', userData.verified);
|
|
}
|
|
|
|
if (typeof userData.freeSwitchExtension === 'string' && userData.freeSwitchExtension !== '') {
|
|
updater.set('freeSwitchExtension', userData.freeSwitchExtension);
|
|
}
|
|
|
|
handleBio(updater, userData.bio);
|
|
handleNickname(updater, userData.nickname);
|
|
|
|
await Users.updateFromUpdater({ _id }, updater);
|
|
|
|
if (userData.sendWelcomeEmail) {
|
|
await sendWelcomeEmail(userData);
|
|
}
|
|
|
|
if (sendPassword) {
|
|
await sendPasswordEmail(userData);
|
|
}
|
|
|
|
userData._id = _id;
|
|
|
|
// Offline (air-gapped) licenses suppress the default Gravatar fetch — a
|
|
// default-on outbound call the workspace must never initiate on its own.
|
|
if (settings.get('Accounts_SetDefaultAvatar') === true && userData.email && !License.hasOfflineLicense()) {
|
|
warnGravatarDeprecation();
|
|
|
|
const gravatarUrl = Gravatar.url(userData.email, {
|
|
default: '404',
|
|
size: '200',
|
|
protocol: 'https',
|
|
});
|
|
|
|
try {
|
|
await setUserAvatar({ ...userData, _id }, gravatarUrl, '', 'url');
|
|
} catch (e) {
|
|
// Ignore this error for now, as it not being successful isn't bad
|
|
}
|
|
}
|
|
|
|
void notifyOnUserChangeById({ clientAction: 'inserted', id: _id });
|
|
|
|
return _id;
|
|
};
|