Skip to content

Commit c179fcd

Browse files
committed
review
1 parent ff14893 commit c179fcd

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export const fileTypes: Record<string, FileMessageType> = {
5050

5151
/** helper to validate the username format */
5252
export function validateFederatedUsername(username: string): username is `@${string}:${string}` {
53-
return /^@[a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+$/.test(username);
53+
return /^@[a-zA-Z0-9._=-]+:[a-zA-Z0-9.:_-]+$/.test(username);
5454
}
5555

5656
/**
@@ -62,12 +62,11 @@ export function validateFederatedUsername(username: string): username is `@${str
6262
export async function createOrUpdateFederatedUser(options: {
6363
username: `@${string}:${string}`;
6464
name?: string;
65-
status?: UserStatus;
6665
origin: string;
67-
}): Promise<{ insertedId: any }> {
68-
const { username, name = username, status = UserStatus.OFFLINE, origin } = options;
66+
}): Promise<string> {
67+
const { username, name = username } = options;
6968

70-
return Users.updateOne(
69+
const result = await Users.updateOne(
7170
{
7271
username,
7372
},
@@ -76,7 +75,7 @@ export async function createOrUpdateFederatedUser(options: {
7675
username,
7776
name,
7877
type: 'user' as const,
79-
status,
78+
status: UserStatus.OFFLINE,
8079
active: true,
8180
roles: ['user'],
8281
requirePasswordChange: false,
@@ -86,14 +85,25 @@ export async function createOrUpdateFederatedUser(options: {
8685
mui: username,
8786
origin,
8887
},
89-
createdAt: new Date(),
9088
_updatedAt: new Date(),
9189
},
90+
$setOnInsert: {
91+
createdAt: new Date(),
92+
},
9293
},
9394
{
9495
upsert: true,
9596
},
96-
).then((result) => ({ insertedId: result.upsertedId }));
97+
);
98+
99+
const userId = result.upsertedId || (await Users.findOneByUsername(username, { projection: { _id: 1 } }))?._id;
100+
if (!userId) {
101+
throw new Error(`Failed to create or update federated user: ${username}`);
102+
}
103+
if (typeof userId !== 'string') {
104+
return userId.toString();
105+
}
106+
return userId;
97107
}
98108

99109
export { generateEd25519RandomSecretKey } from '@rocket.chat/federation-sdk';

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Room } from '@rocket.chat/core-services';
22
import type { IUser } from '@rocket.chat/core-typings';
3-
import { UserStatus } from '@rocket.chat/core-typings';
43
import type {
54
HomeserverServices,
65
RoomService,
@@ -13,6 +12,8 @@ import { Router } from '@rocket.chat/http-router';
1312
import { Rooms, Users } from '@rocket.chat/models';
1413
import { ajv } from '@rocket.chat/rest-typings/dist/v1/Ajv';
1514

15+
import { createOrUpdateFederatedUser } from '../../FederationMatrix';
16+
1617
const EventBaseSchema = {
1718
type: 'object',
1819
properties: {
@@ -186,19 +187,12 @@ async function joinRoom({
186187
// TODO implement on model
187188
const senderUser = await Users.findOneByUsername(inviteEvent.sender, { projection: { _id: 1 } });
188189

189-
let senderUserId = senderUser?._id;
190-
191-
// create locally
192-
if (!senderUser) {
193-
const { createOrUpdateFederatedUser } = await import('../../FederationMatrix');
194-
const createdUser = await createOrUpdateFederatedUser({
190+
const senderUserId =
191+
senderUser?._id ||
192+
(await createOrUpdateFederatedUser({
195193
username: inviteEvent.sender,
196-
status: UserStatus.ONLINE,
197194
origin: matrixRoom.origin,
198-
});
199-
200-
senderUserId = createdUser.insertedId;
201-
}
195+
}));
202196

203197
if (!senderUserId) {
204198
throw new Error('Sender user ID not found');

0 commit comments

Comments
 (0)