diff --git a/apps/meteor/app/federation-v2/server/application/RoomServiceSender.ts b/apps/meteor/app/federation-v2/server/application/RoomServiceSender.ts index 5413188358c7..2be2283ddd86 100644 --- a/apps/meteor/app/federation-v2/server/application/RoomServiceSender.ts +++ b/apps/meteor/app/federation-v2/server/application/RoomServiceSender.ts @@ -4,6 +4,7 @@ import { IMessage, IRoom, IUser } from '@rocket.chat/core-typings'; import { FederatedRoom } from '../domain/FederatedRoom'; import { FederatedUser } from '../domain/FederatedUser'; import { IFederationBridge } from '../domain/IFederationBridge'; +import { RocketChatNotificationAdapter } from '../infrastructure/rocket-chat/adapters/Notification'; import { RocketChatRoomAdapter } from '../infrastructure/rocket-chat/adapters/Room'; import { RocketChatSettingsAdapter } from '../infrastructure/rocket-chat/adapters/Settings'; import { RocketChatUserAdapter } from '../infrastructure/rocket-chat/adapters/User'; @@ -14,6 +15,7 @@ export class FederationRoomServiceSender { private rocketRoomAdapter: RocketChatRoomAdapter, private rocketUserAdapter: RocketChatUserAdapter, private rocketSettingsAdapter: RocketChatSettingsAdapter, + private rocketNotificationAdapter: RocketChatNotificationAdapter, private bridge: IFederationBridge, ) {} // eslint-disable-line no-empty-function @@ -85,7 +87,14 @@ export class FederationRoomServiceSender { await this.bridge.inviteToRoom(federatedRoom.externalId, federatedInviterUser.externalId, federatedInviteeUser.externalId); await this.bridge.joinRoom(federatedRoom.externalId, federatedInviteeUser.externalId); } else if (!wasInvitedWhenTheRoomWasCreated) { - this.bridge.inviteToRoom(federatedRoom.externalId, federatedInviterUser.externalId, federatedInviteeUser.externalId); + this.bridge.inviteToRoom(federatedRoom.externalId, federatedInviterUser.externalId, federatedInviteeUser.externalId).catch(() => { + this.rocketNotificationAdapter.notifyWithEphemeralMessage( + 'Federation_Matrix_only_owners_can_invite_users', + federatedInviterUser?.internalReference?._id, + internalRoomId, + federatedInviterUser?.internalReference?.language, + ); + }); } await this.rocketRoomAdapter.addUserToRoom(federatedRoom, federatedInviteeUser, federatedInviterUser); } diff --git a/apps/meteor/app/federation-v2/server/index.ts b/apps/meteor/app/federation-v2/server/index.ts index 36a57e1932b4..d2d90966d4d0 100644 --- a/apps/meteor/app/federation-v2/server/index.ts +++ b/apps/meteor/app/federation-v2/server/index.ts @@ -9,6 +9,7 @@ const federation = FederationFactory.buildBridge(rocketSettingsAdapter, queueIns const rocketRoomAdapter = FederationFactory.buildRocketRoomAdapter(); const rocketUserAdapter = FederationFactory.buildRocketUserAdapter(); const rocketMessageAdapter = FederationFactory.buildRocketMessageAdapter(); +const rocketNotificationAdapter = FederationFactory.buildRocketNotificationdapter(); const federationRoomServiceReceiver = FederationFactory.buildRoomServiceReceiver( rocketRoomAdapter, @@ -23,6 +24,7 @@ export const federationRoomServiceSender = FederationFactory.buildRoomServiceSen rocketRoomAdapter, rocketUserAdapter, rocketSettingsAdapter, + rocketNotificationAdapter, federation, ); diff --git a/apps/meteor/app/federation-v2/server/infrastructure/Factory.ts b/apps/meteor/app/federation-v2/server/infrastructure/Factory.ts index 0373dd1b9000..36a20f827c10 100644 --- a/apps/meteor/app/federation-v2/server/infrastructure/Factory.ts +++ b/apps/meteor/app/federation-v2/server/infrastructure/Factory.ts @@ -16,6 +16,7 @@ import { RocketChatRoomAdapter } from './rocket-chat/adapters/Room'; import { RocketChatSettingsAdapter } from './rocket-chat/adapters/Settings'; import { RocketChatUserAdapter } from './rocket-chat/adapters/User'; import { IFederationBridge } from '../domain/IFederationBridge'; +import { RocketChatNotificationAdapter } from './rocket-chat/adapters/Notification'; export class FederationFactory { public static buildRocketSettingsAdapter(): RocketChatSettingsAdapter { @@ -34,6 +35,10 @@ export class FederationFactory { return new RocketChatMessageAdapter(); } + public static buildRocketNotificationdapter(): RocketChatNotificationAdapter { + return new RocketChatNotificationAdapter(); + } + public static buildQueue(): InMemoryQueue { return new InMemoryQueue(); } @@ -52,9 +57,10 @@ export class FederationFactory { rocketRoomAdapter: RocketChatRoomAdapter, rocketUserAdapter: RocketChatUserAdapter, rocketSettingsAdapter: RocketChatSettingsAdapter, + rocketNotificationAdapter: RocketChatNotificationAdapter, bridge: IFederationBridge, ): FederationRoomServiceSender { - return new FederationRoomServiceSender(rocketRoomAdapter, rocketUserAdapter, rocketSettingsAdapter, bridge); + return new FederationRoomServiceSender(rocketRoomAdapter, rocketUserAdapter, rocketSettingsAdapter, rocketNotificationAdapter, bridge); } public static buildBridge(rocketSettingsAdapter: RocketChatSettingsAdapter, queue: InMemoryQueue): IFederationBridge { diff --git a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Notification.ts b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Notification.ts new file mode 100644 index 000000000000..8e07d94cf12a --- /dev/null +++ b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Notification.ts @@ -0,0 +1,14 @@ +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; + +import { api } from '../../../../../../server/sdk/api'; + +export class RocketChatNotificationAdapter { + public notifyWithEphemeralMessage(i18nMessageKey: string, userId: string, roomId: string, language = 'en'): void { + api.broadcast('notify.ephemeralMessage', userId, roomId, { + msg: TAPi18n.__(i18nMessageKey, { + postProcess: 'sprintf', + lng: language, + }), + }); + } +} diff --git a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts index 3660399dc341..71ff9af73461 100644 --- a/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts +++ b/apps/meteor/app/federation-v2/server/infrastructure/rocket-chat/adapters/Settings.ts @@ -158,12 +158,14 @@ export class RocketChatSettingsAdapter { type: 'string', i18nLabel: 'Federation_Matrix_homeserver_url', i18nDescription: 'Federation_Matrix_homeserver_url_desc', + alert: 'Federation_Matrix_homeserver_url_alert', }); this.add('Federation_Matrix_homeserver_domain', 'local.rocket.chat', { type: 'string', i18nLabel: 'Federation_Matrix_homeserver_domain', i18nDescription: 'Federation_Matrix_homeserver_domain_desc', + alert: 'Federation_Matrix_homeserver_domain_alert', }); this.add('Federation_Matrix_bridge_url', 'http://host.docker.internal:3300', {