Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/meteor/app/api/server/v1/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ API.v1.addRoute(
}

const sent = await applyAirGappedRestrictionsValidation(() =>
executeSendMessage(this.userId, this.bodyParams.message as Pick<IMessage, 'rid'>, this.bodyParams.previewUrls),
executeSendMessage(this.userId, this.bodyParams.message as Pick<IMessage, 'rid'>, { previewUrls: this.bodyParams.previewUrls }),
);
const [message] = await normalizeMessagesForUser([sent], this.userId);

Expand Down
32 changes: 24 additions & 8 deletions apps/meteor/app/lib/server/methods/sendMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,21 @@ import { settings } from '../../../settings/server';
import { sendMessage } from '../functions/sendMessage';
import { RateLimiter } from '../lib';

export async function executeSendMessage(uid: IUser['_id'], message: AtLeast<IMessage, 'rid'>, previewUrls?: string[]) {
/**
*
* @param uid
* @param message
* @param extraInfo
* - ts: The timestamp of the message. the message object already has a ts, but this value is validated and only a window of 10 seconds is allowed to be used. this value overrides the message.ts value without validation.
*
*
* @returns
*/
export async function executeSendMessage(
uid: IUser['_id'],
message: AtLeast<IMessage, 'rid'>,
extraInfo?: { ts?: Date; previewUrls?: string[] },
) {
if (message.tshow && !message.tmid) {
throw new Meteor.Error('invalid-params', 'tshow provided but missing tmid', {
method: 'sendMessage',
Expand All @@ -32,19 +46,21 @@ export async function executeSendMessage(uid: IUser['_id'], message: AtLeast<IMe
});
}

if (message.ts) {
const isTimestampFromClient = Boolean(!extraInfo?.ts && message.ts);
const now = new Date();
message.ts = extraInfo?.ts ?? message.ts ?? now;
if (isTimestampFromClient) {
const tsDiff = Math.abs(moment(message.ts).diff(Date.now()));
if (tsDiff > 60000) {
throw new Meteor.Error('error-message-ts-out-of-sync', 'Message timestamp is out of sync', {
method: 'sendMessage',
message_ts: message.ts,
server_ts: new Date().getTime(),
});
} else if (tsDiff > 10000) {
message.ts = new Date();
}
} else {
message.ts = new Date();
if (tsDiff > 10000) {
message.ts = now;
}
}

if (message.msg) {
Expand Down Expand Up @@ -90,7 +106,7 @@ export async function executeSendMessage(uid: IUser['_id'], message: AtLeast<IMe
}

metrics.messagesSent.inc(); // TODO This line needs to be moved to it's proper place. See the comments on: https://github.com/RocketChat/Rocket.Chat/pull/5736
return await sendMessage(user, message, room, false, previewUrls);
return await sendMessage(user, message, room, false, extraInfo?.previewUrls);
} catch (err: any) {
SystemLogger.error({ msg: 'Error sending message:', err });

Expand Down Expand Up @@ -147,7 +163,7 @@ Meteor.methods<ServerMethods>({
}

try {
return await applyAirGappedRestrictionsValidation(() => executeSendMessage(uid, message, previewUrls));
return await applyAirGappedRestrictionsValidation(() => executeSendMessage(uid, message, { previewUrls }));
} catch (error: any) {
if (['error-not-allowed', 'restricted-workspace'].includes(error.error || error.message)) {
throw new Meteor.Error(error.error || error.message, error.reason, {
Expand Down
36 changes: 21 additions & 15 deletions apps/meteor/server/services/messages/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export class MessageService extends ServiceClassInternal implements IMessageServ
files,
attachments,
thread,
ts,
}: {
fromId: string;
rid: string;
Expand All @@ -108,23 +109,28 @@ export class MessageService extends ServiceClassInternal implements IMessageServ
files?: IMessage['files'];
attachments?: IMessage['attachments'];
thread?: { tmid: string; tshow: boolean };
ts: Date;
}): Promise<IMessage> {
return executeSendMessage(fromId, {
rid,
msg,
...thread,
federation: {
eventId: federation_event_id,
version: 1,
return executeSendMessage(
fromId,
{
rid,
msg,
...thread,
federation: {
eventId: federation_event_id,
version: 1,
},
...(file && { file }),
...(files && { files }),
...(attachments && { attachments }),
...(e2e_content && {
t: 'e2e',
content: e2e_content,
}),
},
...(file && { file }),
...(files && { files }),
...(attachments && { attachments }),
...(e2e_content && {
t: 'e2e',
content: e2e_content,
}),
});
{ ts },
);
}

async sendMessageWithValidation(user: IUser, message: Partial<IMessage>, room: Partial<IRoom>, upsert = false): Promise<IMessage> {
Expand Down
6 changes: 5 additions & 1 deletion ee/packages/federation-matrix/src/events/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ export function message() {
msg: formatted,
federation_event_id: eventId,
thread,
ts: new Date(event.origin_server_ts),
});
return;
}
Expand All @@ -242,7 +243,7 @@ export function message() {
eventId,
thread,
);
await Message.saveMessageFromFederation(result);
await Message.saveMessageFromFederation({ ...result, ts: new Date(event.origin_server_ts) });
} else {
const formatted = toInternalMessageFormat({
rawMessage: messageBody,
Expand All @@ -257,6 +258,7 @@ export function message() {
msg: formatted,
federation_event_id: eventId,
thread,
ts: new Date(event.origin_server_ts),
});
}
} catch (error) {
Expand Down Expand Up @@ -359,6 +361,7 @@ export function message() {
},
federation_event_id: eventId,
thread,
ts: new Date(event.origin_server_ts),
});
return;
}
Expand All @@ -372,6 +375,7 @@ export function message() {
},
federation_event_id: eventId,
thread,
ts: new Date(event.origin_server_ts),
});
} catch (error) {
logger.error(error, 'Error processing Matrix message:');
Expand Down
2 changes: 2 additions & 0 deletions packages/core-services/src/types/IMessageService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export interface IMessageService {
files,
attachments,
thread,
ts,
}: {
fromId: string;
rid: string;
Expand All @@ -32,6 +33,7 @@ export interface IMessageService {
files?: IMessage['files'];
attachments?: IMessage['attachments'];
thread?: { tmid: string; tshow: boolean };
ts: Date;
}): Promise<IMessage>;
saveSystemMessageAndNotifyUser<T = IMessage>(
type: MessageTypesValues,
Expand Down
Loading