The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Rocket.Chat/packages/rocketchat-lib/server/functions/setUsername.js

88 lines
3.4 KiB

import s from 'underscore.string';
import { Accounts } from 'meteor/accounts-base';
Convert rocketchat-file-upload to main module structure (#13094) * Move rocketchat settings to specific package * WIP: Move models from rocketchat-lib to a specific package (server) * Move function from rocketchat:lib to rocketchat:utils to use it in rocketchat:models * Move client models from rocketchat:lib to rocketchat:models * Fix lint * Move rocketchat.info from lib to utils * Remove directly dependency between lib and migrations * Move statistics Model to rocketchat:models * Create rocketchat:metrics to be able to depacking rocketchat callbacks * Move callbacks to specific package * Remove unused dependency * Move rocketchat-notifications to a specific package * Move rocketchat-promises to a specific package * remove directly dependency from metrics and models * Move CachedCollection from lib to models * Move ui models/collections from ui to models * Move authorization client/ui models to rocketchat:models to be able to remove lib dependency * Creation of rocketchat:ui-utils to help decouple rocketchat:lib and rocketchat:authz * Move some common functions to rocketchat:utils * Change imports to dynamic imports to avoid directly dependency between some packages * Move authz models to rocketchat:models * Remove directly dependency between rocketchat:authz and rocketchat:lib * Move some functions from rocketchat:lib to rocketchat:utils * Add functions to settings package * Convert rocketchat:file-upload to main module structure * Import FileUpload where it is being used * Remove FileUpload and fileUploadHandler from globals eslintrc * Merge branch 'develop' into globals/move-rocketchat-callbacks * Fix missed export * Fix canBeDeleted and canBeCreated function, remove async
7 years ago
import { FileUpload } from 'meteor/rocketchat:file-upload';
RocketChat._setUsername = function(userId, u) {
const username = s.trim(u);
if (!userId || !username) {
return false;
}
let nameValidation;
try {
nameValidation = new RegExp(`^${ RocketChat.settings.get('UTF8_Names_Validation') }$`);
} catch (error) {
nameValidation = new RegExp('^[0-9a-zA-Z-_.]+$');
}
if (!nameValidation.test(username)) {
return false;
}
const user = RocketChat.models.Users.findOneById(userId);
// User already has desired username, return
if (user.username === username) {
return user;
}
const previousUsername = user.username;
// Check username availability or if the user already owns a different casing of the name
if (!previousUsername || !(username.toLowerCase() === previousUsername.toLowerCase())) {
if (!RocketChat.checkUsernameAvailability(username)) {
return false;
}
}
// If first time setting username, send Enrollment Email
try {
if (!previousUsername && user.emails && user.emails.length > 0 && RocketChat.settings.get('Accounts_Enrollment_Email')) {
Accounts.sendEnrollmentEmail(user._id);
}
} catch (e) {
console.error(e);
}
// Set new username*
RocketChat.models.Users.setUsername(user._id, username);
user.username = username;
if (!previousUsername && RocketChat.settings.get('Accounts_SetDefaultAvatar') === true) {
const avatarSuggestions = getAvatarSuggestionForUser(user);
let gravatar;
Object.keys(avatarSuggestions).some((service) => {
const avatarData = avatarSuggestions[service];
if (service !== 'gravatar') {
RocketChat.setUserAvatar(user, avatarData.blob, avatarData.contentType, service);
gravatar = null;
return true;
}
gravatar = avatarData;
return false;
});
if (gravatar != null) {
RocketChat.setUserAvatar(user, gravatar.blob, gravatar.contentType, 'gravatar');
}
}
// Username is available; if coming from old username, update all references
if (previousUsername) {
RocketChat.models.Messages.updateAllUsernamesByUserId(user._id, username);
RocketChat.models.Messages.updateUsernameOfEditByUserId(user._id, username);
RocketChat.models.Messages.findByMention(previousUsername).forEach(function(msg) {
const updatedMsg = msg.msg.replace(new RegExp(`@${ previousUsername }`, 'ig'), `@${ username }`);
return RocketChat.models.Messages.updateUsernameAndMessageOfMentionByIdAndOldUsername(msg._id, previousUsername, username, updatedMsg);
});
RocketChat.models.Rooms.replaceUsername(previousUsername, username);
RocketChat.models.Rooms.replaceMutedUsername(previousUsername, username);
RocketChat.models.Rooms.replaceUsernameOfUserByUserId(user._id, username);
RocketChat.models.Subscriptions.setUserUsernameByUserId(user._id, username);
RocketChat.models.Subscriptions.setNameForDirectRoomsWithOldName(previousUsername, username);
RocketChat.models.LivechatDepartmentAgents.replaceUsernameOfAgentByUserId(user._id, username);
const fileStore = FileUpload.getStore('Avatars');
const file = fileStore.model.findOneByName(previousUsername);
9 years ago
if (file) {
fileStore.model.updateFileNameById(file._id, username);
}
}
return user;
};
RocketChat.setUsername = RocketChat.RateLimiter.limitFunction(RocketChat._setUsername, 1, 60000, {
[0](userId) {
return !userId || !RocketChat.authz.hasPermission(userId, 'edit-other-user-info');
},
});