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
16 changes: 12 additions & 4 deletions ee/packages/federation-matrix/src/FederationMatrix.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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';
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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}`;
}
Expand Down
6 changes: 2 additions & 4 deletions ee/packages/federation-matrix/src/events/edu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<HomeserverEventSignatures>) => {
Expand All @@ -18,7 +16,7 @@ export const edus = async (emitter: Emitter<HomeserverEventSignatures>) => {
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;
Expand All @@ -42,7 +40,7 @@ export const edus = async (emitter: Emitter<HomeserverEventSignatures>) => {

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;
Expand Down
17 changes: 10 additions & 7 deletions ee/packages/federation-matrix/src/events/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<HomeserverEventSignatures>) {
Expand All @@ -29,13 +31,14 @@ export function message(emitter: Emitter<HomeserverEventSignatures>) {
}
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<IUser> = {
username: data.sender,
username: internalUsername,
name: username, // TODO: Fetch display name from Matrix profile
type: 'user',
status: UserStatus.ONLINE,
Expand All @@ -58,7 +61,7 @@ export function message(emitter: Emitter<HomeserverEventSignatures>) {

user = await Users.findOneById(insertedId);
if (!user) {
logger.error('Failed to create user:', data.sender);
logger.error('Failed to create user:', internalUsername);
return;
}

Expand Down Expand Up @@ -149,10 +152,10 @@ export function message(emitter: Emitter<HomeserverEventSignatures>) {
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;
}

Expand Down
14 changes: 9 additions & 5 deletions ee/packages/federation-matrix/src/events/reaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<HomeserverEventSignatures>) {
Expand All @@ -21,9 +23,10 @@ export function reaction(emitter: Emitter<HomeserverEventSignatures>) {
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;
}

Expand All @@ -40,7 +43,7 @@ export function reaction(emitter: Emitter<HomeserverEventSignatures>) {

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);
}
Expand Down Expand Up @@ -75,9 +78,10 @@ export function reaction(emitter: Emitter<HomeserverEventSignatures>) {
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;
}

Expand Down
Loading