diff --git a/ee/packages/federation-matrix/src/FederationMatrix.ts b/ee/packages/federation-matrix/src/FederationMatrix.ts index 8339c448c4d7e..e96199b1f48c6 100644 --- a/ee/packages/federation-matrix/src/FederationMatrix.ts +++ b/ee/packages/federation-matrix/src/FederationMatrix.ts @@ -4,7 +4,14 @@ import type { PresenceState } from '@hs/core'; import { ConfigService, createFederationContainer, getAllServices } from '@hs/federation-sdk'; import type { HomeserverEventSignatures, HomeserverServices, FederationContainerOptions } from '@hs/federation-sdk'; import { type IFederationMatrixService, Room, ServiceClass, Settings } from '@rocket.chat/core-services'; -import { isDeletedMessage, isMessageFromMatrixFederation, UserStatus, type IMessage, type IRoom, type IUser } from '@rocket.chat/core-typings'; +import { + isDeletedMessage, + isMessageFromMatrixFederation, + UserStatus, + type IMessage, + type IRoom, + type IUser, +} from '@rocket.chat/core-typings'; import { Emitter } from '@rocket.chat/emitter'; import { Router } from '@rocket.chat/http-router'; import { Logger } from '@rocket.chat/logger'; @@ -20,6 +27,7 @@ import { getMatrixSendJoinRoutes } from './api/_matrix/send-join'; import { getMatrixTransactionsRoutes } from './api/_matrix/transactions'; import { getFederationVersionsRoutes } from './api/_matrix/versions'; import { registerEvents } from './events'; +import { convertExternalUserIdToInternalUsername } from './helpers/identifiers'; export class FederationMatrix extends ServiceClass implements IFederationMatrixService { protected name = 'federation-matrix'; @@ -194,7 +202,7 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS try { // TODO: Check if it is external user - split domain etc - const localUserId = await Users.findOneByUsername(member); + const localUserId = await Users.findOneByUsername(convertExternalUserIdToInternalUsername(member)); if (localUserId) { await MatrixBridgedUser.createOrUpdateByLocalId(localUserId._id, member, false, matrixDomain); // continue; @@ -334,8 +342,8 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS const isExternalUser = username.includes(':'); if (isExternalUser) { - let externalUsernameToInvite = username; - const alreadyCreatedLocally = await Users.findOneByUsername(username, { projection: { _id: 1 } }); + let externalUsernameToInvite = convertExternalUserIdToInternalUsername(username); + const alreadyCreatedLocally = await Users.findOneByUsername(externalUsernameToInvite, { projection: { _id: 1 } }); if (alreadyCreatedLocally) { externalUsernameToInvite = `@${username}`; } diff --git a/ee/packages/federation-matrix/src/events/edu.ts b/ee/packages/federation-matrix/src/events/edu.ts index 425dcb2de8daf..3fab701075a3c 100644 --- a/ee/packages/federation-matrix/src/events/edu.ts +++ b/ee/packages/federation-matrix/src/events/edu.ts @@ -5,8 +5,6 @@ import type { Emitter } from '@rocket.chat/emitter'; import { Logger } from '@rocket.chat/logger'; import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '@rocket.chat/models'; -import { convertExternalUserIdToInternalUsername } from '../helpers/identifiers'; - const logger = new Logger('federation-matrix:edu'); export const edus = async (emitter: Emitter) => { @@ -18,7 +16,7 @@ export const edus = async (emitter: Emitter) => { return; } - const matrixUser = await MatrixBridgedUser.findOne({ mui: convertExternalUserIdToInternalUsername(data.user_id) }); + const matrixUser = await MatrixBridgedUser.findOne({ mui: data.user_id }); if (!matrixUser) { logger.debug(`No bridged user found for Matrix user_id: ${data.user_id}`); return; @@ -42,7 +40,7 @@ export const edus = async (emitter: Emitter) => { emitter.on('homeserver.matrix.presence', async (data) => { try { - const matrixUser = await MatrixBridgedUser.findOne({ mui: convertExternalUserIdToInternalUsername(data.user_id) }); + const matrixUser = await MatrixBridgedUser.findOne({ mui: data.user_id }); if (!matrixUser) { logger.debug(`No bridged user found for Matrix user_id: ${data.user_id}`); return; diff --git a/ee/packages/federation-matrix/src/events/message.ts b/ee/packages/federation-matrix/src/events/message.ts index dfde54bfa158c..f618287e44721 100644 --- a/ee/packages/federation-matrix/src/events/message.ts +++ b/ee/packages/federation-matrix/src/events/message.ts @@ -6,6 +6,8 @@ import type { Emitter } from '@rocket.chat/emitter'; import { Logger } from '@rocket.chat/logger'; import { Users, MatrixBridgedUser, MatrixBridgedRoom, Rooms, Subscriptions, Messages } from '@rocket.chat/models'; +import { convertExternalUserIdToInternalUsername } from '../helpers/identifiers'; + const logger = new Logger('federation-matrix:message'); export function message(emitter: Emitter) { @@ -29,13 +31,14 @@ export function message(emitter: Emitter) { } const username = userPart.substring(1); - let user = await Users.findOneByUsername(data.sender); + const internalUsername = convertExternalUserIdToInternalUsername(data.sender); + let user = await Users.findOneByUsername(internalUsername); if (!user) { - logger.info('Creating new federated user:', { username: data.sender, externalId: data.sender }); + logger.info('Creating new federated user:', { username: internalUsername, externalId: data.sender }); const userData: Partial = { - username: data.sender, + username: internalUsername, name: username, // TODO: Fetch display name from Matrix profile type: 'user', status: UserStatus.ONLINE, @@ -58,7 +61,7 @@ export function message(emitter: Emitter) { user = await Users.findOneById(insertedId); if (!user) { - logger.error('Failed to create user:', data.sender); + logger.error('Failed to create user:', internalUsername); return; } @@ -149,10 +152,10 @@ export function message(emitter: Emitter) { logger.debug(`No RC message found for event ${data.redacts}`); return; } - - const user = await Users.findOneByUsername(data.sender); + const internalUsername = convertExternalUserIdToInternalUsername(data.sender); + const user = await Users.findOneByUsername(internalUsername); if (!user) { - logger.debug(`User not found: ${data.sender}`); + logger.debug(`User not found: ${internalUsername}`); return; } diff --git a/ee/packages/federation-matrix/src/events/reaction.ts b/ee/packages/federation-matrix/src/events/reaction.ts index a2390f6139ccb..63a0c9bf647ec 100644 --- a/ee/packages/federation-matrix/src/events/reaction.ts +++ b/ee/packages/federation-matrix/src/events/reaction.ts @@ -5,6 +5,8 @@ import { Logger } from '@rocket.chat/logger'; import { Users, Messages } from '@rocket.chat/models'; // Rooms import emojione from 'emojione'; +import { convertExternalUserIdToInternalUsername } from '../helpers/identifiers'; + const logger = new Logger('federation-matrix:reaction'); export function reaction(emitter: Emitter) { @@ -21,9 +23,10 @@ export function reaction(emitter: Emitter) { return; } - const user = await Users.findOneByUsername(data.sender); + const internalUsername = convertExternalUserIdToInternalUsername(data.sender); + const user = await Users.findOneByUsername(internalUsername); if (!user) { - logger.error(`No RC user mapping found for Matrix event ${reactionTargetEventId} ${data.sender}`); + logger.error(`No RC user mapping found for Matrix event ${reactionTargetEventId} ${internalUsername}`); return; } @@ -40,7 +43,7 @@ export function reaction(emitter: Emitter) { const reactionEmoji = emojione.toShort(reactionKey); await Message.reactToMessage(user._id, reactionEmoji, rcMessage._id, true); - await Messages.setFederationReactionEventId(data.sender, rcMessage._id, reactionEmoji, data.event_id); + await Messages.setFederationReactionEventId(internalUsername, rcMessage._id, reactionEmoji, data.event_id); } catch (error) { logger.error('Failed to process Matrix reaction:', error); } @@ -75,9 +78,10 @@ export function reaction(emitter: Emitter) { return; } - const user = await Users.findOneByUsername(data.sender); + const internalUsername = convertExternalUserIdToInternalUsername(data.sender); + const user = await Users.findOneByUsername(internalUsername); if (!user) { - logger.debug(`User not found: ${data.sender}`); + logger.debug(`User not found: ${internalUsername}`); return; }