import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import { settings } from '../../app/settings'; import { hasPermission } from '../../app/authorization'; import { Users } from '../../app/models'; import { RateLimiter } from '../../app/lib'; import { addUser } from '../../app/federation/server/functions/addUser'; import { createRoom } from '../../app/lib/server'; Meteor.methods({ createDirectMessage(username) { check(username, String); if (!Meteor.userId()) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'createDirectMessage', }); } const me = Meteor.user(); if (!me.username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'createDirectMessage', }); } if (settings.get('Message_AllowDirectMessagesToYourself') === false && me.username === username) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'createDirectMessage', }); } if (!hasPermission(Meteor.userId(), 'create-d')) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'createDirectMessage', }); } let to = Users.findOneByUsernameIgnoringCase(username); // If the username does have an `@`, but does not exist locally, we create it first if (!to && username.indexOf('@') !== -1) { to = addUser(username); } if (!to) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'createDirectMessage', }); } if (!hasPermission(to._id, 'view-d-room')) { throw new Meteor.Error('error-not-allowed', 'Target user not allowed to receive messages', { method: 'createDirectMessage', }); } const { _id: rid } = createRoom('d', undefined, undefined, [me, to]); return { rid, }; }, }); RateLimiter.limitMethod('createDirectMessage', 10, 60000, { userId(userId) { return !hasPermission(userId, 'send-many-messages'); }, });