From dee1465cac8aa7d9d8d3c016873f3bf338bf2767 Mon Sep 17 00:00:00 2001 From: rocketchat-github-ci Date: Mon, 18 Mar 2024 14:34:14 +0000 Subject: [PATCH 1/4] Bump 6.6.4 --- .changeset/bump-patch-1710772454766.md | 5 +++++ yarn.lock | 16 ++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 .changeset/bump-patch-1710772454766.md diff --git a/.changeset/bump-patch-1710772454766.md b/.changeset/bump-patch-1710772454766.md new file mode 100644 index 0000000000000..e1eaa7980afb1 --- /dev/null +++ b/.changeset/bump-patch-1710772454766.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/yarn.lock b/yarn.lock index af1134d87e328..8e65c735f6b7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9348,9 +9348,9 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 4.0.2 + "@rocket.chat/ui-contexts": 4.0.3 "@rocket.chat/ui-kit": 0.33.0 - "@rocket.chat/ui-video-conf": 4.0.2 + "@rocket.chat/ui-video-conf": 4.0.3 "@tanstack/react-query": "*" react: "*" react-dom: "*" @@ -9432,14 +9432,14 @@ __metadata: ts-jest: ~29.1.1 typescript: ~5.3.2 peerDependencies: - "@rocket.chat/core-typings": 6.6.2 + "@rocket.chat/core-typings": 6.6.3 "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 4.0.2 - "@rocket.chat/ui-contexts": 4.0.2 + "@rocket.chat/ui-client": 4.0.3 + "@rocket.chat/ui-contexts": 4.0.3 katex: "*" react: "*" languageName: unknown @@ -10621,7 +10621,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 4.0.2 + "@rocket.chat/ui-contexts": 4.0.3 react: ~17.0.2 languageName: unknown linkType: soft @@ -10796,7 +10796,7 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 4.0.2 + "@rocket.chat/ui-contexts": 4.0.3 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10885,7 +10885,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 4.0.2 + "@rocket.chat/ui-contexts": 4.0.3 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" From c2872a93f202ad9aa989f2048e7b478e374e995a Mon Sep 17 00:00:00 2001 From: Marcos Spessatto Defendi Date: Fri, 8 Mar 2024 18:46:02 -0300 Subject: [PATCH 2/4] fix: convert network broker stopped lifecycle method to async (#31927) Co-authored-by: Diego Sampaio <8591547+sampaiodiego@users.noreply.github.com> --- .changeset/slimy-clocks-argue.md | 6 +++ .../search/server/search.internalService.ts | 4 +- apps/meteor/ee/server/NetworkBroker.ts | 4 +- apps/meteor/ee/server/startup/services.ts | 2 +- .../tests/unit/server/NetworkBroker.tests.ts | 39 +++++++++++++++++++ .../meteor/tests/mocks/server/BrokerMocked.ts | 10 +++-- .../hooks/BeforeSaveCheckMAC.tests.ts | 2 +- packages/core-services/src/LocalBroker.ts | 4 +- packages/core-services/src/lib/Api.ts | 4 +- .../core-services/src/types/IApiService.ts | 2 +- packages/core-services/src/types/IBroker.ts | 2 +- 11 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 .changeset/slimy-clocks-argue.md create mode 100644 apps/meteor/ee/tests/unit/server/NetworkBroker.tests.ts diff --git a/.changeset/slimy-clocks-argue.md b/.changeset/slimy-clocks-argue.md new file mode 100644 index 0000000000000..35d4e9e3e4331 --- /dev/null +++ b/.changeset/slimy-clocks-argue.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/core-services": patch +--- + +`stopped` lifecycle method was unexpectedly synchronous when using microservices, causing our code to create race conditions. diff --git a/apps/meteor/app/search/server/search.internalService.ts b/apps/meteor/app/search/server/search.internalService.ts index 97de497112847..2fbaa2e1da312 100644 --- a/apps/meteor/app/search/server/search.internalService.ts +++ b/apps/meteor/app/search/server/search.internalService.ts @@ -36,10 +36,10 @@ class Search extends ServiceClassInternal { const service = new Search(); -settings.watch('Search.Provider', () => { +settings.watch('Search.Provider', async () => { if (searchProviderService.activeProvider?.on) { api.registerService(service); } else { - api.destroyService(service); + await api.destroyService(service); } }); diff --git a/apps/meteor/ee/server/NetworkBroker.ts b/apps/meteor/ee/server/NetworkBroker.ts index 3af389e4f3e7a..0fed6fca542d1 100644 --- a/apps/meteor/ee/server/NetworkBroker.ts +++ b/apps/meteor/ee/server/NetworkBroker.ts @@ -71,12 +71,12 @@ export class NetworkBroker implements IBroker { return this.broker.call(method, data); } - destroyService(instance: IServiceClass): void { + async destroyService(instance: IServiceClass): Promise { const name = instance.getName(); if (!name) { return; } - void this.broker.destroyService(name); + await this.broker.destroyService(name); instance.removeAllListeners(); } diff --git a/apps/meteor/ee/server/startup/services.ts b/apps/meteor/ee/server/startup/services.ts index 86743602d1e10..2f63ddba42a82 100644 --- a/apps/meteor/ee/server/startup/services.ts +++ b/apps/meteor/ee/server/startup/services.ts @@ -33,7 +33,7 @@ if (!License.hasValidLicense()) { void License.onLicense('federation', async () => { const federationServiceEE = await FederationServiceEE.createFederationService(); if (federationService) { - api.destroyService(federationService); + await api.destroyService(federationService); } api.registerService(federationServiceEE); }); diff --git a/apps/meteor/ee/tests/unit/server/NetworkBroker.tests.ts b/apps/meteor/ee/tests/unit/server/NetworkBroker.tests.ts new file mode 100644 index 0000000000000..1aac9c33fc339 --- /dev/null +++ b/apps/meteor/ee/tests/unit/server/NetworkBroker.tests.ts @@ -0,0 +1,39 @@ +import { ServiceClass } from '@rocket.chat/core-services'; +import { expect } from 'chai'; +import sinon from 'sinon'; + +import { BrokerMocked } from '../../../../tests/mocks/server/BrokerMocked'; +import { NetworkBroker } from '../../../server/NetworkBroker'; + +class DelayedStopBroker extends BrokerMocked { + async destroyService(name: string) { + const instance = this.services.get(name); + + await new Promise((resolve) => setTimeout(resolve, 1000)); + + await instance.stopped(); + + await super.destroyService(name); + } +} + +const broker = new NetworkBroker(new DelayedStopBroker() as any); + +describe('NetworkBroker', () => { + it('should wait services to be fully destroyed', async () => { + const stoppedStub = sinon.stub(); + + const instance = new (class extends ServiceClass { + name = 'test'; + + async stopped() { + stoppedStub(); + } + })(); + + broker.createService(instance); + await broker.destroyService(instance); + + expect(stoppedStub.called).to.be.true; + }); +}); diff --git a/apps/meteor/tests/mocks/server/BrokerMocked.ts b/apps/meteor/tests/mocks/server/BrokerMocked.ts index dbab825acfad1..fd89044bc781e 100644 --- a/apps/meteor/tests/mocks/server/BrokerMocked.ts +++ b/apps/meteor/tests/mocks/server/BrokerMocked.ts @@ -1,12 +1,14 @@ export class BrokerMocked { actions: Record Promise> = {}; - destroyService(): void { - // no op + services: Map = new Map(); + + async destroyService(name: string): Promise { + this.services.delete(name); } - createService(): void { - // no op + createService(instance: any): void { + this.services.set(instance.name, instance); } async call(method: string, data: any): Promise { diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts index 2ee0604d6f815..faed1cdc16099 100644 --- a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts @@ -36,7 +36,7 @@ const broker = new BrokerMocked(); describe('Check MAC', () => { before(() => { - api.setBroker(broker); + api.setBroker(broker as any); }); it('should do nothing if not omnichannel room', async () => { diff --git a/packages/core-services/src/LocalBroker.ts b/packages/core-services/src/LocalBroker.ts index 47f4aaba3c807..451ced1cf39f1 100644 --- a/packages/core-services/src/LocalBroker.ts +++ b/packages/core-services/src/LocalBroker.ts @@ -34,7 +34,7 @@ export class LocalBroker implements IBroker { return this.call(method, data); } - destroyService(instance: ServiceClass): void { + async destroyService(instance: ServiceClass): Promise { const namespace = instance.getName(); instance.getEvents().forEach((event) => event.listeners.forEach((listener) => this.events.removeListener(event.eventName, listener))); @@ -51,7 +51,7 @@ export class LocalBroker implements IBroker { this.methods.delete(`${namespace}.${method}`); } instance.removeAllListeners(); - instance.stopped(); + await instance.stopped(); } createService(instance: IServiceClass): void { diff --git a/packages/core-services/src/lib/Api.ts b/packages/core-services/src/lib/Api.ts index 61a58301a0cc6..d02dfe1f8a564 100644 --- a/packages/core-services/src/lib/Api.ts +++ b/packages/core-services/src/lib/Api.ts @@ -15,13 +15,13 @@ export class Api implements IApiService { this.services.forEach((service) => this.broker?.createService(service)); } - destroyService(instance: IServiceClass): void { + async destroyService(instance: IServiceClass): Promise { if (!this.services.has(instance)) { return; } if (this.broker) { - this.broker.destroyService(instance); + await this.broker.destroyService(instance); } this.services.delete(instance); diff --git a/packages/core-services/src/types/IApiService.ts b/packages/core-services/src/types/IApiService.ts index ef88d57713bc2..802ae04ab5e29 100644 --- a/packages/core-services/src/types/IApiService.ts +++ b/packages/core-services/src/types/IApiService.ts @@ -5,7 +5,7 @@ import type { IServiceClass } from './ServiceClass'; export interface IApiService { setBroker(broker: IBroker): void; - destroyService(instance: IServiceClass): void; + destroyService(instance: IServiceClass): Promise; registerService(instance: IServiceClass): void; diff --git a/packages/core-services/src/types/IBroker.ts b/packages/core-services/src/types/IBroker.ts index cd1e0a3ded197..d75b25de3452b 100644 --- a/packages/core-services/src/types/IBroker.ts +++ b/packages/core-services/src/types/IBroker.ts @@ -48,7 +48,7 @@ export interface IServiceMetrics { export interface IBroker { metrics?: IServiceMetrics; - destroyService(service: IServiceClass): void; + destroyService(service: IServiceClass): Promise; createService(service: IServiceClass, serviceDependencies?: string[]): void; call(method: string, data: any): Promise; waitAndCall(method: string, data: any): Promise; From 428b7d7e1605ddeae42c9531b8a83438bf836b20 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Fri, 9 Feb 2024 00:33:27 +0530 Subject: [PATCH 3/4] fix: add group and section to homeserver domain setting (#31700) --- .changeset/cyan-countries-impress.md | 5 +++++ .gitignore | 2 ++ .../infrastructure/rocket-chat/adapters/Settings.ts | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 .changeset/cyan-countries-impress.md diff --git a/.changeset/cyan-countries-impress.md b/.changeset/cyan-countries-impress.md new file mode 100644 index 0000000000000..6bd78b6f62f86 --- /dev/null +++ b/.changeset/cyan-countries-impress.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed matrix homeserver domain setting not being visible in admin panel diff --git a/.gitignore b/.gitignore index 13ee265952bb2..fcf2b8cd07c7c 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ yarn-error.log* .envrc *.sublime-workspace + +**/.vim/ diff --git a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts index 92278549b6fcc..952c2a3384402 100644 --- a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts +++ b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts @@ -237,6 +237,8 @@ export class RocketChatSettingsAdapter { i18nLabel: 'Federation_Matrix_homeserver_domain', i18nDescription: 'Federation_Matrix_homeserver_domain_desc', alert: 'Federation_Matrix_homeserver_domain_alert', + group: 'Federation', + section: 'Matrix Bridge', }, ); From 28b59b5429c2820270babd4dfa199577d3a98e6c Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Tue, 19 Mar 2024 19:12:37 +0530 Subject: [PATCH 4/4] chore(federation-v2): do not load registration.yaml file in container (#32012) Co-authored-by: Marcos Defendi --- .changeset/moody-ghosts-add.md | 5 + .../rocketchat-i18n/i18n/en.i18n.json | 2 + .../infrastructure/matrix/Bridge.ts | 4 +- .../rocket-chat/adapters/Settings.ts | 130 ++++++------------ 4 files changed, 49 insertions(+), 92 deletions(-) create mode 100644 .changeset/moody-ghosts-add.md diff --git a/.changeset/moody-ghosts-add.md b/.changeset/moody-ghosts-add.md new file mode 100644 index 0000000000000..3b38317dcb97a --- /dev/null +++ b/.changeset/moody-ghosts-add.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Don't use the registration.yaml file to configure Matrix Federation anymore. diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 71a34af95bedf..641fae735dc8b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -2223,6 +2223,8 @@ "Federation_Description": "Federation allows an unlimited number of workspaces to communicate with each other.", "Federation_Enable": "Enable Federation", "Federation_Example_matrix_server": "Example: matrix.org", + "Federation_Matrix_enable_ephemeral_events": "Enable Matrix ephemeral events", + "Federation_Matrix_enable_ephemeral_events_Alert": "This requires a restart.
Enabling ephemeral events like user typing indicator can affect the performance of your Matrix Homeserver and Rocket.Chat server for federated communication", "Federation_Federated_room_search": "Federated room search", "Federation_Public_key": "Public Key", "Federation_Search_federated_rooms": "Search federated rooms", diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts b/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts index a1015696de989..cffd8ec309a0a 100644 --- a/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts +++ b/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts @@ -714,7 +714,7 @@ export class MatrixBridge implements IFederationBridge { // Dynamic import to prevent Rocket.Chat from loading the module until needed and then handle if that fails const { Bridge, AppServiceRegistration, MatrixUser } = await import('@rocket.chat/forked-matrix-appservice-bridge'); MatrixUserInstance = MatrixUser; - const registrationFile = this.internalSettings.generateRegistrationFileObject(); + const registrationFile = this.internalSettings.getAppServiceRegistrationObject(); this.bridgeInstance = new Bridge({ homeserverUrl: this.internalSettings.getHomeServerUrl(), @@ -730,7 +730,7 @@ export class MatrixBridge implements IFederationBridge { onLog: (line, isError) => { console.log(line, isError); }, - ...(this.internalSettings.generateRegistrationFileObject().enableEphemeralEvents + ...(this.internalSettings.getAppServiceRegistrationObject().enableEphemeralEvents ? { onEphemeralEvent: (request) => { const event = request.getData() as unknown as AbstractMatrixEvent; diff --git a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts index 952c2a3384402..e1eff65852f9c 100644 --- a/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts +++ b/apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts @@ -1,6 +1,4 @@ import crypto from 'crypto'; -import fs from 'fs'; -import { resolve } from 'path'; import { Settings } from '@rocket.chat/models'; import yaml from 'js-yaml'; @@ -16,7 +14,6 @@ export class RocketChatSettingsAdapter { public async initialize() { await this.addFederationSettings(); this.watchChangesAndUpdateRegistrationFile(); - await this.updateSettingsWithProvidedConfigFileIfNecessary(); } public getApplicationServiceId(): string { @@ -65,12 +62,8 @@ export class RocketChatSettingsAdapter { return settings.get('Federation_Matrix_enabled') === true; } - public areEphemeralEventsEnabled(): boolean { - return this.isTypingStatusEnabled(); - } - public isTypingStatusEnabled(): boolean { - return this.getRegistrationFileFromHomeserver()?.enableEphemeralEvents === true; + return settings.get('Federation_Matrix_enable_ephemeral_events') === true; } public onFederationEnabledStatusChanged( @@ -103,19 +96,19 @@ export class RocketChatSettingsAdapter { this.getHomeServerDomain(), this.getBridgeUrl(), this.getBridgePort(), - this.generateRegistrationFileObject(), + this.getAppServiceRegistrationObject(), ), ); } - public generateRegistrationFileObject(): IFederationBridgeRegistrationFile { + public getAppServiceRegistrationObject(): IFederationBridgeRegistrationFile { return { id: this.getApplicationServiceId(), homeserverToken: this.getApplicationHomeServerToken(), applicationServiceToken: this.getApplicationApplicationServiceToken(), bridgeUrl: this.getBridgeUrl(), botName: this.getBridgeBotUsername(), - enableEphemeralEvents: this.areEphemeralEventsEnabled(), + enableEphemeralEvents: this.isTypingStatusEnabled(), listenTo: { users: [ { @@ -140,7 +133,7 @@ export class RocketChatSettingsAdapter { } private async updateRegistrationFile(): Promise { - const registrationFile = this.generateRegistrationFileObject(); + const registrationFile = this.getAppServiceRegistrationObject(); await Settings.updateValueById( 'Federation_Matrix_registration_file', @@ -172,9 +165,7 @@ export class RocketChatSettingsAdapter { } private async addFederationSettings(): Promise { - const preExistingConfiguration = this.getRegistrationFileFromHomeserver(); - - await settingsRegistry.add('Federation_Matrix_enabled', Boolean(preExistingConfiguration), { + await settingsRegistry.add('Federation_Matrix_enabled', false, { readonly: false, type: 'boolean', i18nLabel: 'Federation_Matrix_enabled', @@ -185,11 +176,24 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); + await settingsRegistry.add('Federation_Matrix_enable_ephemeral_events', false, { + readonly: false, + type: 'boolean', + i18nLabel: 'Federation_Matrix_enable_ephemeral_events', + i18nDescription: 'Federation_Matrix_enable_ephemeral_events_desc', + alert: 'Federation_Matrix_enable_ephemeral_events_Alert', + public: true, + group: 'Federation', + section: 'Matrix Bridge', + }); + const uniqueId = settings.get('uniqueID') || uuidv4().slice(0, 15).replace(new RegExp('-', 'g'), '_'); const homeserverToken = crypto.createHash('sha256').update(`hs_${uniqueId}`).digest('hex'); const applicationServiceToken = crypto.createHash('sha256').update(`as_${uniqueId}`).digest('hex'); - await settingsRegistry.add('Federation_Matrix_id', preExistingConfiguration?.id || `rocketchat_${uniqueId}`, { + const siteUrl = settings.get('Site_Url'); + + await settingsRegistry.add('Federation_Matrix_id', `rocketchat_${uniqueId}`, { readonly: true, type: 'string', i18nLabel: 'Federation_Matrix_id', @@ -198,7 +202,7 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); - await settingsRegistry.add('Federation_Matrix_hs_token', preExistingConfiguration?.homeserverToken || homeserverToken, { + await settingsRegistry.add('Federation_Matrix_hs_token', homeserverToken, { readonly: true, type: 'string', i18nLabel: 'Federation_Matrix_hs_token', @@ -207,7 +211,7 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); - await settingsRegistry.add('Federation_Matrix_as_token', preExistingConfiguration?.applicationServiceToken || applicationServiceToken, { + await settingsRegistry.add('Federation_Matrix_as_token', applicationServiceToken, { readonly: true, type: 'string', i18nLabel: 'Federation_Matrix_as_token', @@ -216,33 +220,25 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); - await settingsRegistry.add( - 'Federation_Matrix_homeserver_url', - preExistingConfiguration?.rocketchat?.homeServerUrl || 'http://localhost:8008', - { - type: 'string', - i18nLabel: 'Federation_Matrix_homeserver_url', - i18nDescription: 'Federation_Matrix_homeserver_url_desc', - alert: 'Federation_Matrix_homeserver_url_alert', - group: 'Federation', - section: 'Matrix Bridge', - }, - ); + await settingsRegistry.add('Federation_Matrix_homeserver_url', 'http://localhost:8008', { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_url', + i18nDescription: 'Federation_Matrix_homeserver_url_desc', + alert: 'Federation_Matrix_homeserver_url_alert', + group: 'Federation', + section: 'Matrix Bridge', + }); - await settingsRegistry.add( - 'Federation_Matrix_homeserver_domain', - preExistingConfiguration?.rocketchat?.domainName || 'local.rocket.chat', - { - type: 'string', - i18nLabel: 'Federation_Matrix_homeserver_domain', - i18nDescription: 'Federation_Matrix_homeserver_domain_desc', - alert: 'Federation_Matrix_homeserver_domain_alert', - group: 'Federation', - section: 'Matrix Bridge', - }, - ); + await settingsRegistry.add('Federation_Matrix_homeserver_domain', siteUrl, { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_domain', + i18nDescription: 'Federation_Matrix_homeserver_domain_desc', + alert: 'Federation_Matrix_homeserver_domain_alert', + group: 'Federation', + section: 'Matrix Bridge', + }); - await settingsRegistry.add('Federation_Matrix_bridge_url', preExistingConfiguration?.bridgeUrl || 'http://host.docker.internal:3300', { + await settingsRegistry.add('Federation_Matrix_bridge_url', 'http://localhost:3300', { type: 'string', i18nLabel: 'Federation_Matrix_bridge_url', i18nDescription: 'Federation_Matrix_bridge_url_desc', @@ -250,7 +246,7 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); - await settingsRegistry.add('Federation_Matrix_bridge_localpart', preExistingConfiguration?.botName || 'rocket.cat', { + await settingsRegistry.add('Federation_Matrix_bridge_localpart', 'rocket.cat', { type: 'string', i18nLabel: 'Federation_Matrix_bridge_localpart', i18nDescription: 'Federation_Matrix_bridge_localpart_desc', @@ -260,7 +256,6 @@ export class RocketChatSettingsAdapter { await settingsRegistry.add('Federation_Matrix_registration_file', '', { readonly: true, - hidden: Boolean(preExistingConfiguration), type: 'code', i18nLabel: 'Federation_Matrix_registration_file', i18nDescription: 'Federation_Matrix_registration_file_desc', @@ -282,49 +277,4 @@ export class RocketChatSettingsAdapter { section: 'Matrix Bridge', }); } - - private getRegistrationFileFromHomeserver(): Record | undefined { - try { - const registrationYaml = fs.readFileSync(this.getFilePathForHomeserverConfig(), 'utf8'); - - const parsedFile = yaml.load(registrationYaml as string) as Record; - return { - applicationServiceToken: parsedFile.as_token, - bridgeUrl: parsedFile.url, - botName: parsedFile.sender_localpart, - homeserverToken: parsedFile.hs_token, - id: parsedFile.id, - listenTo: parsedFile.namespaces, - enableEphemeralEvents: parsedFile['de.sorunome.msc2409.push_ephemeral'], - rocketchat: { domainName: parsedFile.rocketchat?.homeserver_domain, homeServerUrl: parsedFile.rocketchat?.homeserver_url }, - }; - } catch (e) { - // no-op - } - } - - private getFilePathForHomeserverConfig(): string { - return process.env.NODE_ENV === 'development' - ? '../../../../../matrix-federation-config/registration.yaml' - : resolve(process.cwd(), '../../../matrix-federation-config/registration.yaml'); - } - - private async updateSettingsWithProvidedConfigFileIfNecessary() { - const existingConfiguration = this.getRegistrationFileFromHomeserver(); - if (!existingConfiguration) { - return; - } - - await Promise.all([ - Settings.updateValueById('Federation_Matrix_enabled', true), - Settings.updateValueById('Federation_Matrix_id', existingConfiguration.id), - Settings.updateValueById('Federation_Matrix_hs_token', existingConfiguration.homeserverToken), - Settings.updateValueById('Federation_Matrix_as_token', existingConfiguration.applicationServiceToken), - Settings.updateValueById('Federation_Matrix_homeserver_url', existingConfiguration.rocketchat?.homeServerUrl), - Settings.updateValueById('Federation_Matrix_homeserver_domain', existingConfiguration.rocketchat?.domainName), - Settings.updateValueById('Federation_Matrix_bridge_url', existingConfiguration.bridgeUrl), - Settings.updateValueById('Federation_Matrix_bridge_localpart', existingConfiguration.botName), - Settings.update({ _id: 'Federation_Matrix_registration_file' }, { $set: { hidden: Boolean(existingConfiguration) } }), - ]); - } }