Skip to content

Commit b2c5973

Browse files
committed
WIP
1 parent 10aa85b commit b2c5973

File tree

8 files changed

+23
-51
lines changed

8 files changed

+23
-51
lines changed

apps/meteor/app/lib/server/functions/createDirectRoom.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,7 @@ export async function createDirectRoom(
7171

7272
await callbacks.run('beforeCreateDirectRoom', membersUsernames, roomExtraData);
7373

74-
const roomMembers: IUser[] = await Users.findUsersByUsernames(membersUsernames, {
75-
projection: { _id: 1, name: 1, username: 1, settings: 1, customFields: 1 },
76-
}).toArray();
74+
const roomMembers = await Users.findUsersByUsernames(membersUsernames).toArray();
7775
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
7876
const sortedMembers = roomMembers.sort((u1, u2) => (u1.name! || u1.username!).localeCompare(u2.name! || u2.username!));
7977

ee/packages/federation-matrix/src/FederationMatrix.ts

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export async function createOrUpdateFederatedUser(options: {
6969

7070
return Users.updateOne(
7171
{
72-
'federation.mui': username,
72+
username,
7373
},
7474
{
7575
username,
@@ -358,59 +358,32 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS
358358

359359
let matrixRoomResult: { room_id: string; event_id?: string };
360360
if (members.length === 2) {
361-
const otherMember = members.find((member) => {
362-
if (typeof member === 'string') {
363-
return true; // Remote user
364-
}
365-
return member._id !== creatorId;
366-
});
361+
const otherMember = members.find((member) => member._id !== creatorId);
367362
if (!otherMember) {
368363
throw new Error('Other member not found for 1-on-1 DM');
369364
}
370-
let otherMemberMatrixId: string;
371-
372-
if (otherMember.username?.includes(':')) {
373-
otherMemberMatrixId = otherMember.username.startsWith('@') ? otherMember.username : `@${otherMember.username}`;
374-
} else {
375-
otherMemberMatrixId = `@${otherMember.username}:${this.serverName}`;
365+
if (!isUserNativeFederated(otherMember)) {
366+
throw new Error('Other member is not federated');
376367
}
377-
const roomId = await this.homeserverServices.room.createDirectMessageRoom(actualMatrixUserId, otherMemberMatrixId);
368+
const roomId = await this.homeserverServices.room.createDirectMessageRoom(actualMatrixUserId, otherMember.username);
378369
matrixRoomResult = { room_id: roomId };
379370
} else {
380371
// For group DMs (more than 2 members), create a private room
381372
const roomName = room.name || room.fname || `Group chat with ${members.length} members`;
382373
matrixRoomResult = await this.homeserverServices.room.createRoom(actualMatrixUserId, roomName, 'invite');
383374
}
384375

385-
// TODO is this needed?
386-
// const mapping = await MatrixBridgedRoom.getLocalRoomId(matrixRoomResult.room_id);
387-
// if (!mapping) {
388-
// await MatrixBridgedRoom.createOrUpdateByLocalRoomId(room._id, matrixRoomResult.room_id, this.serverName);
389-
// }
390-
391376
for await (const member of members) {
392-
if (typeof member !== 'string' && member._id === creatorId) {
377+
if (member._id === creatorId) {
393378
continue;
394379
}
395380

396-
try {
397-
if (!member.username?.includes(':')) {
398-
continue;
399-
}
400-
401-
const memberMatrixUserId = member.username.startsWith('@') ? member.username : `@${member.username}`;
402-
403-
const existingMemberMatrixUserId = await Users.findOne({ 'federation.mui': memberMatrixUserId });
404-
if (!existingMemberMatrixUserId) {
405-
await createOrUpdateFederatedUser({
406-
username: member._id as `@${string}:${string}`,
407-
origin: memberMatrixUserId.split(':').pop() || '',
408-
});
409-
}
381+
if (!isUserNativeFederated(member)) {
382+
continue;
383+
}
410384

411-
if (members.length > 2) {
412-
await this.homeserverServices.invite.inviteUserToRoom(memberMatrixUserId, matrixRoomResult.room_id, actualMatrixUserId);
413-
}
385+
try {
386+
await this.homeserverServices.invite.inviteUserToRoom(member.username, matrixRoomResult.room_id, actualMatrixUserId);
414387
} catch (error) {
415388
this.logger.error('Error creating or updating bridged user for DM:', error);
416389
}

ee/packages/federation-matrix/src/api/_matrix/invite.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ async function joinRoom({
184184

185185
// need both the sender and the participating user to exist in the room
186186
// TODO implement on model
187-
const senderUser = await Users.findOne({ 'federation.mui': inviteEvent.sender }, { projection: { _id: 1 } });
187+
const senderUser = await Users.findOneByUsername(inviteEvent.sender, { projection: { _id: 1 } });
188188

189189
let senderUserId = senderUser?._id;
190190

ee/packages/federation-matrix/src/events/edu.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const edus = async (emitter: Emitter<HomeserverEventSignatures>, eduProce
2020
return;
2121
}
2222

23-
const matrixUser = await Users.findOne({ 'federation.mui': data.user_id });
23+
const matrixUser = await Users.findOneByUsername(data.user_id);
2424
if (!matrixUser?.username) {
2525
logger.debug(`No bridged user found for Matrix user_id: ${data.user_id}`);
2626
return;
@@ -42,7 +42,7 @@ export const edus = async (emitter: Emitter<HomeserverEventSignatures>, eduProce
4242
}
4343

4444
try {
45-
const matrixUser = await Users.findOne({ 'federation.mui': data.user_id });
45+
const matrixUser = await Users.findOneByUsername(data.user_id);
4646
if (!matrixUser) {
4747
logger.debug(`No federated user found for Matrix user_id: ${data.user_id}`);
4848
return;

ee/packages/federation-matrix/src/events/member.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ async function membershipLeaveAction(data: HomeserverEventSignatures['homeserver
1515
}
1616

1717
// state_key is the user affected by the membership change
18-
const affectedUser = await Users.findOne({ 'federation.mui': data.state_key });
18+
const affectedUser = await Users.findOneByUsername(data.state_key);
1919
if (!affectedUser) {
2020
logger.error(`No Rocket.Chat user found for bridged user: ${data.state_key}`);
2121
return;
@@ -28,7 +28,7 @@ async function membershipLeaveAction(data: HomeserverEventSignatures['homeserver
2828
logger.info(`User ${affectedUser.username} left room ${room._id} via Matrix federation`);
2929
} else {
3030
// Kick - find who kicked
31-
const kickerUser = await Users.findOne({ 'federation.mui': data.sender });
31+
const kickerUser = await Users.findOneByUsername(data.sender);
3232

3333
await Room.removeUserFromRoom(room._id, affectedUser, {
3434
byUser: kickerUser || { _id: 'matrix.federation', username: 'Matrix User' },

ee/packages/federation-matrix/src/events/message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export function message(emitter: Emitter<HomeserverEventSignatures>, serverName:
124124
}
125125

126126
// at this point we know for sure the user already exists
127-
const user = await Users.findOne({ 'federation.mui': data.sender });
127+
const user = await Users.findOneByUsername(data.sender);
128128
if (!user) {
129129
throw new Error(`User not found for sender: ${data.sender}`);
130130
}

ee/packages/federation-matrix/src/events/room.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export function room(emitter: Emitter<HomeserverEventSignatures>) {
1212
throw new Error('mapped room not found');
1313
}
1414

15-
const localUserId = await Users.findOne({ 'federation.mui': userId }, { projection: { _id: 1 } });
15+
const localUserId = await Users.findOneByUsername(userId, { projection: { _id: 1 } });
1616
if (!localUserId) {
1717
throw new Error('mapped user not found');
1818
}
@@ -28,7 +28,7 @@ export function room(emitter: Emitter<HomeserverEventSignatures>) {
2828
throw new Error('mapped room not found');
2929
}
3030

31-
const localUserId = await Users.findOne({ 'federation.mui': userId }, { projection: { _id: 1 } });
31+
const localUserId = await Users.findOneByUsername(userId, { projection: { _id: 1 } });
3232
if (!localUserId) {
3333
throw new Error('mapped user not found');
3434
}
@@ -44,12 +44,12 @@ export function room(emitter: Emitter<HomeserverEventSignatures>) {
4444
throw new Error('mapped room not found');
4545
}
4646

47-
const localUserId = await Users.findOne({ 'federation.mui': userId }, { projection: { _id: 1 } });
47+
const localUserId = await Users.findOneByUsername(userId, { projection: { _id: 1 } });
4848
if (!localUserId) {
4949
throw new Error('mapped user not found');
5050
}
5151

52-
const localSenderId = await Users.findOne({ 'federation.mui': senderId }, { projection: { _id: 1 } });
52+
const localSenderId = await Users.findOneByUsername(senderId, { projection: { _id: 1 } });
5353
if (!localSenderId) {
5454
throw new Error('mapped user not found');
5555
}

packages/core-typings/src/IUser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ export const isUserFederated = (user: Partial<IUser> | Partial<Serialized<IUser>
265265

266266
export interface IUserNativeFederated extends IUser {
267267
federated: true;
268+
username: `@${string}:${string}`;
268269
federation: {
269270
version: number;
270271
mui: string;

0 commit comments

Comments
 (0)