From 89ee5474a41dddc0838faa59d60e88cba58d9829 Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Wed, 30 Mar 2022 11:00:36 -0300 Subject: [PATCH 01/18] POC - initial commit --- app/federation-matrix/server/bridge.ts | 63 + app/federation-matrix/server/config.ts | 10 + .../server/data-interface/index.ts | 9 + .../server/data-interface/message.ts | 17 + .../server/data-interface/room.ts | 7 + .../server/data-interface/user.ts | 7 + .../server/definitions/IMatrixEvent.ts | 16 + .../IMatrixEventContentAddMemberToRoom.ts | 10 + .../IMatrixEventContentCreateRoom.ts | 4 + .../IMatrixEventContentSendMessage.ts | 8 + .../IMatrixEventContentSetRoomJoinRules.ts | 8 + .../IMatrixEventContentSetRoomName.ts | 3 + .../IMatrixEventContentSetRoomTopic.ts | 3 + .../definitions/IMatrixEventContent/index.ts | 16 + .../server/definitions/MatrixEventType.ts | 12 + app/federation-matrix/server/eventHandler.ts | 50 + .../server/events/createRoom.ts | 44 + app/federation-matrix/server/events/index.ts | 6 + .../server/events/roomMembership.ts | 134 ++ .../server/events/sendMessage.ts | 22 + .../server/events/setRoomJoinRules.ts | 43 + .../server/events/setRoomName.ts | 37 + .../server/events/setRoomTopic.ts | 22 + app/federation-matrix/server/index.ts | 3 + .../server/matrix-client/index.ts | 9 + .../server/matrix-client/message.ts | 24 + .../server/matrix-client/room.ts | 48 + .../server/matrix-client/user.ts | 138 +++ .../server/methods/checkBridgedRoomExists.ts | 7 + app/federation-matrix/server/queue.ts | 16 + app/lib/client/methods/sendMessage.js | 9 +- app/lib/server/methods/sendMessage.js | 9 +- app/models/server/index.js | 3 + app/models/server/models/MatrixBridgedRoom.ts | 28 + app/models/server/models/MatrixBridgedUser.ts | 37 + app/slashcommands-bridge/client/index.ts | 3 + app/slashcommands-bridge/server/index.ts | 43 + app/ui-sidenav/client/roomList.js | 5 + client/importPackages.ts | 1 + ee/server/lib/ldap/Manager.ts | 2 +- package-lock.json | 1093 ++++++++++++++++- package.json | 2 + server/importPackages.ts | 2 + server/modules/watchers/publishFields.ts | 3 + server/services/room/service.ts | 2 +- tests/data/rooms.helper.js | 2 +- 46 files changed, 2011 insertions(+), 29 deletions(-) create mode 100644 app/federation-matrix/server/bridge.ts create mode 100644 app/federation-matrix/server/config.ts create mode 100644 app/federation-matrix/server/data-interface/index.ts create mode 100644 app/federation-matrix/server/data-interface/message.ts create mode 100644 app/federation-matrix/server/data-interface/room.ts create mode 100644 app/federation-matrix/server/data-interface/user.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEvent.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts create mode 100644 app/federation-matrix/server/definitions/IMatrixEventContent/index.ts create mode 100644 app/federation-matrix/server/definitions/MatrixEventType.ts create mode 100644 app/federation-matrix/server/eventHandler.ts create mode 100644 app/federation-matrix/server/events/createRoom.ts create mode 100644 app/federation-matrix/server/events/index.ts create mode 100644 app/federation-matrix/server/events/roomMembership.ts create mode 100644 app/federation-matrix/server/events/sendMessage.ts create mode 100644 app/federation-matrix/server/events/setRoomJoinRules.ts create mode 100644 app/federation-matrix/server/events/setRoomName.ts create mode 100644 app/federation-matrix/server/events/setRoomTopic.ts create mode 100644 app/federation-matrix/server/index.ts create mode 100644 app/federation-matrix/server/matrix-client/index.ts create mode 100644 app/federation-matrix/server/matrix-client/message.ts create mode 100644 app/federation-matrix/server/matrix-client/room.ts create mode 100644 app/federation-matrix/server/matrix-client/user.ts create mode 100644 app/federation-matrix/server/methods/checkBridgedRoomExists.ts create mode 100644 app/federation-matrix/server/queue.ts create mode 100644 app/models/server/models/MatrixBridgedRoom.ts create mode 100644 app/models/server/models/MatrixBridgedUser.ts create mode 100644 app/slashcommands-bridge/client/index.ts create mode 100644 app/slashcommands-bridge/server/index.ts diff --git a/app/federation-matrix/server/bridge.ts b/app/federation-matrix/server/bridge.ts new file mode 100644 index 000000000000..bc0ff690d167 --- /dev/null +++ b/app/federation-matrix/server/bridge.ts @@ -0,0 +1,63 @@ +import { Bridge, AppServiceRegistration } from 'matrix-appservice-bridge'; + +import { IMatrixEvent } from './definitions/IMatrixEvent'; +import { MatrixEventType } from './definitions/MatrixEventType'; +import { addToQueue } from './queue'; +import { config } from './config'; + +/* eslint-disable @typescript-eslint/camelcase */ +const registrationConfig = AppServiceRegistration.fromObject({ + id: config.id, + hs_token: config.hsToken, + as_token: config.asToken, + namespaces: { + users: [ + { + exclusive: false, + // Reserve these MXID's (usernames) + regex: `.*`, + }, + ], + aliases: [ + { + exclusive: false, + // Reserve these room aliases + regex: `.*`, + }, + ], + rooms: [ + { + exclusive: false, + // This regex is used to define which rooms we listen to with the bridge. + // This does not reserve the rooms like the other namespaces. + regex: '.*', + }, + ], + }, + url: config.bridgeUrl, + sender_localpart: config.matrixBridgeMxidLocalpart, + rate_limited: false, + protocols: null, +}); +/* eslint-enable @typescript-eslint/camelcase */ + +export const matrixBridge = new Bridge({ + homeserverUrl: config.homeServerUrl, + domain: config.serverName, + registration: registrationConfig, + disableStores: true, + controller: { + onAliasQuery: (alias, matrixRoomId): void => { + console.log('onAliasQuery', alias, matrixRoomId); + }, + onEvent: async (request /* , context*/): Promise => { + // Get the event + const event = request.getData() as unknown as IMatrixEvent; + + addToQueue(event); + }, + onLog: async (line, isError): Promise => { + console.log(line, isError); + }, + }, +}); diff --git a/app/federation-matrix/server/config.ts b/app/federation-matrix/server/config.ts new file mode 100644 index 000000000000..f93d3def5010 --- /dev/null +++ b/app/federation-matrix/server/config.ts @@ -0,0 +1,10 @@ +export const config = { + id: 'rocketchat', + hsToken: 'c905a9a5b1c37288e82e17a5aa7af56fc1783368c285d9be7dbc8276ef5b6fe6', + asToken: 'f872e34bd8dad6d0d6d99897a085e0a7e8fb4c7aac7d8968c19d64fd650d5e82', + serverName: 'servera', + serverDomain: 'example.com', + bridgeUrl: 'http://host.docker.internal:3300', + matrixBridgeMxidLocalpart: 'rocket.cat', + homeServerUrl: 'http://localhost:8008', +}; diff --git a/app/federation-matrix/server/data-interface/index.ts b/app/federation-matrix/server/data-interface/index.ts new file mode 100644 index 000000000000..18e2fbf7020f --- /dev/null +++ b/app/federation-matrix/server/data-interface/index.ts @@ -0,0 +1,9 @@ +import * as message from './message'; +import * as room from './room'; +import * as user from './user'; + +export const dataInterface = { + message: message.normalize, + room: room.normalize, + user: user.normalize, +}; diff --git a/app/federation-matrix/server/data-interface/message.ts b/app/federation-matrix/server/data-interface/message.ts new file mode 100644 index 000000000000..364ba03ce3ac --- /dev/null +++ b/app/federation-matrix/server/data-interface/message.ts @@ -0,0 +1,17 @@ +import { IMessage } from '../../../../definition/IMessage'; +import { IUser } from '../../../../definition/IUser'; +import { dataInterface } from '.'; + +interface INormalizedMessage extends IMessage { + u: IUser; +} + +export const normalize = async (message: IMessage): Promise => { + // TODO: normalize the entire payload (if needed) + const normalizedMessage: INormalizedMessage = message as INormalizedMessage; + + // Normalize the user + normalizedMessage.u = await dataInterface.user(message.u._id); + + return normalizedMessage; +}; diff --git a/app/federation-matrix/server/data-interface/room.ts b/app/federation-matrix/server/data-interface/room.ts new file mode 100644 index 000000000000..7787ab1b8c61 --- /dev/null +++ b/app/federation-matrix/server/data-interface/room.ts @@ -0,0 +1,7 @@ +import { IRoom } from '../../../../definition/IRoom'; +import { Rooms } from '../../../models/server'; + +export const normalize = async (roomId: string): Promise => { + // Normalize the user + return Rooms.findOneById(roomId); +}; diff --git a/app/federation-matrix/server/data-interface/user.ts b/app/federation-matrix/server/data-interface/user.ts new file mode 100644 index 000000000000..0a0f532afc45 --- /dev/null +++ b/app/federation-matrix/server/data-interface/user.ts @@ -0,0 +1,7 @@ +import { IUser } from '../../../../definition/IUser'; +import { Users } from '../../../models/server'; + +export const normalize = async (userId: string): Promise => { + // Normalize the user + return Users.findOneById(userId); +}; diff --git a/app/federation-matrix/server/definitions/IMatrixEvent.ts b/app/federation-matrix/server/definitions/IMatrixEvent.ts new file mode 100644 index 000000000000..7111057ec55e --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEvent.ts @@ -0,0 +1,16 @@ +import { MatrixEventType } from './MatrixEventType'; +import { EventContent } from './IMatrixEventContent'; + +export interface IMatrixEvent { + age: number; + content: EventContent[T]; + invite_room_state?: IMatrixEvent[]; + event_id: string; + origin_server_ts: number; + room_id: string; + sender: string; + state_key: string; + type: T; + unsigned: { age: number }; + user_id: string; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts new file mode 100644 index 000000000000..2accfbffbc8b --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts @@ -0,0 +1,10 @@ +export enum AddMemberToRoomMembership { + JOIN = 'join', + INVITE = 'invite', + LEAVE = 'leave', +} + +export interface IMatrixEventContentAddMemberToRoom { + displayname: string; + membership: AddMemberToRoomMembership; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts new file mode 100644 index 000000000000..b374135c9309 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts @@ -0,0 +1,4 @@ +export interface IMatrixEventContentCreateRoom { + creator: string; + room_version: string; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts new file mode 100644 index 000000000000..8158e21f74d0 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts @@ -0,0 +1,8 @@ +export enum MatrixSendMessageType { + 'm.text', +} + +export interface IMatrixEventContentSendMessage { + body: string; + msgtype: MatrixSendMessageType; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts new file mode 100644 index 000000000000..920f9bb53777 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts @@ -0,0 +1,8 @@ +export enum SetRoomJoinRules { + JOIN = 'public', + INVITE = 'invite', +} + +export interface IMatrixEventContentSetRoomJoinRules { + join_rule: SetRoomJoinRules; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts new file mode 100644 index 000000000000..5ac3f72e15c6 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts @@ -0,0 +1,3 @@ +export interface IMatrixEventContentSetRoomName { + name: string; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts new file mode 100644 index 000000000000..54e91e0881c0 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts @@ -0,0 +1,3 @@ +export interface IMatrixEventContentSetRoomTopic { + topic: string; +} diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/index.ts b/app/federation-matrix/server/definitions/IMatrixEventContent/index.ts new file mode 100644 index 000000000000..7615779282e1 --- /dev/null +++ b/app/federation-matrix/server/definitions/IMatrixEventContent/index.ts @@ -0,0 +1,16 @@ +import { MatrixEventType } from '../MatrixEventType'; +import { IMatrixEventContentCreateRoom } from './IMatrixEventContentCreateRoom'; +import { IMatrixEventContentAddMemberToRoom } from './IMatrixEventContentAddMemberToRoom'; +import { IMatrixEventContentSendMessage } from './IMatrixEventContentSendMessage'; +import { IMatrixEventContentSetRoomJoinRules } from './IMatrixEventContentSetRoomJoinRules'; +import { IMatrixEventContentSetRoomName } from './IMatrixEventContentSetRoomName'; +import { IMatrixEventContentSetRoomTopic } from './IMatrixEventContentSetRoomTopic'; + +export type EventContent = { + [MatrixEventType.CREATE_ROOM]: IMatrixEventContentCreateRoom; + [MatrixEventType.ROOM_MEMBERSHIP]: IMatrixEventContentAddMemberToRoom; + [MatrixEventType.SET_ROOM_JOIN_RULES]: IMatrixEventContentSetRoomJoinRules; + [MatrixEventType.SET_ROOM_NAME]: IMatrixEventContentSetRoomName; + [MatrixEventType.SET_ROOM_TOPIC]: IMatrixEventContentSetRoomTopic; + [MatrixEventType.SEND_MESSAGE]: IMatrixEventContentSendMessage; +}; diff --git a/app/federation-matrix/server/definitions/MatrixEventType.ts b/app/federation-matrix/server/definitions/MatrixEventType.ts new file mode 100644 index 000000000000..14d4f0bb0ecb --- /dev/null +++ b/app/federation-matrix/server/definitions/MatrixEventType.ts @@ -0,0 +1,12 @@ +export enum MatrixEventType { + CREATE_ROOM = 'm.room.create', + ROOM_MEMBERSHIP = 'm.room.member', + // SET_ROOM_POWER_LEVELS = 'm.room.power_levels', + // SET_ROOM_CANONICAL_ALIAS = 'm.room.canonical_alias', + SET_ROOM_JOIN_RULES = 'm.room.join_rules', + // SET_ROOM_HISTORY_VISIBILITY = 'm.room.history_visibility', + // SET_ROOM_GUEST_ACCESS = 'm.room.guest_access', + SET_ROOM_NAME = 'm.room.name', + SET_ROOM_TOPIC = 'm.room.topic', + SEND_MESSAGE = 'm.room.message', +} diff --git a/app/federation-matrix/server/eventHandler.ts b/app/federation-matrix/server/eventHandler.ts new file mode 100644 index 000000000000..166ed1199adc --- /dev/null +++ b/app/federation-matrix/server/eventHandler.ts @@ -0,0 +1,50 @@ +import { IMatrixEvent } from './definitions/IMatrixEvent'; +import { MatrixEventType } from './definitions/MatrixEventType'; +import { handleRoomMembership, handleCreateRoom, handleSendMessage, setRoomJoinRules, setRoomName, setRoomTopic } from './events'; + +export const eventHandler = async (event: IMatrixEvent): Promise => { + console.log(`Processing ${event.type}...`, JSON.stringify(event, null, 2)); + + switch (event.type) { + case MatrixEventType.CREATE_ROOM: { + await handleCreateRoom(event as IMatrixEvent); + + break; + } + case MatrixEventType.ROOM_MEMBERSHIP: { + await handleRoomMembership(event as IMatrixEvent); + + break; + } + case MatrixEventType.SET_ROOM_JOIN_RULES: { + await setRoomJoinRules(event as IMatrixEvent); + + break; + } + case MatrixEventType.SET_ROOM_NAME: { + await setRoomName(event as IMatrixEvent); + + break; + } + case MatrixEventType.SET_ROOM_TOPIC: { + await setRoomTopic(event as IMatrixEvent); + + break; + } + case MatrixEventType.SEND_MESSAGE: { + await handleSendMessage(event as IMatrixEvent); + + break; + } + // case MatrixEventType.SET_ROOM_POWER_LEVELS: + // case MatrixEventType.SET_ROOM_CANONICAL_ALIAS: + // case MatrixEventType.SET_ROOM_HISTORY_VISIBILITY: + // case MatrixEventType.SET_ROOM_GUEST_ACCESS: { + // console.log(`Ignoring ${event.type}`); + // + // break; + // } + default: + console.log(`Could not find handler for ${event.type}`, event); + } +}; diff --git a/app/federation-matrix/server/events/createRoom.ts b/app/federation-matrix/server/events/createRoom.ts new file mode 100644 index 000000000000..746f1f95c999 --- /dev/null +++ b/app/federation-matrix/server/events/createRoom.ts @@ -0,0 +1,44 @@ +import { MatrixBridgedRoom, MatrixBridgedUser, Users } from '../../../models/server'; +import { createRoom } from '../../../lib/server'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; +import { checkBridgedRoomExists } from '../methods/checkBridgedRoomExists'; +import { matrixClient } from '../matrix-client'; + +export const handleCreateRoom = async (event: IMatrixEvent): Promise => { + const { room_id: matrixRoomId, sender } = event; + + return new Promise((resolve) => { + setTimeout(async () => { + // Check if the room already exists and if so, ignore + const roomExists = await checkBridgedRoomExists(matrixRoomId); + + if (roomExists) { + return resolve(); + } + + // Find the bridged user id + const bridgedUserId = await MatrixBridgedUser.getId(sender); + let user; + + // Create the user if necessary + if (!bridgedUserId) { + const { uid } = await matrixClient.user.createLocal(sender); + + user = Users.findOneById(uid); + } else { + user = await Users.findOneById(bridgedUserId); + } + + // Create temp room name + const roomName = `Federation-${matrixRoomId.split(':')[0].replace('!', '')}`; + + // @ts-ignore TODO: typing of legacy functions + const { rid: roomId } = createRoom('c', roomName, user.username); + + MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); + + resolve(); + }, 500); + }); +}; diff --git a/app/federation-matrix/server/events/index.ts b/app/federation-matrix/server/events/index.ts new file mode 100644 index 000000000000..ef403e8e78cd --- /dev/null +++ b/app/federation-matrix/server/events/index.ts @@ -0,0 +1,6 @@ +export * from './createRoom'; +export * from './roomMembership'; +export * from './sendMessage'; +export * from './setRoomJoinRules'; +export * from './setRoomName'; +export * from './setRoomTopic'; diff --git a/app/federation-matrix/server/events/roomMembership.ts b/app/federation-matrix/server/events/roomMembership.ts new file mode 100644 index 000000000000..66479a4265cd --- /dev/null +++ b/app/federation-matrix/server/events/roomMembership.ts @@ -0,0 +1,134 @@ +import { MatrixBridgedUser, MatrixBridgedRoom, Users, Rooms } from '../../../models/server'; +import { addUserToRoom, createRoom, removeUserFromRoom } from '../../../lib/server'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; +import { AddMemberToRoomMembership } from '../definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom'; +import { setRoomJoinRules } from './setRoomJoinRules'; +import { setRoomName } from './setRoomName'; +import { addToQueue } from '../queue'; +import { matrixClient } from '../matrix-client'; + +const ensureRoom = async ( + matrixRoomId: string, + roomId: string, + username: string, + roomState?: IMatrixEvent[], +): Promise => { + const room = await Rooms.findOneById(roomId); + // If the room does not exist, create it + if (!room) { + // Create temp room name + const roomName = `Federation-${matrixRoomId.split(':')[0].replace('!', '')}`; + + // @ts-ignore TODO: typing of legacy functions + const { rid: createdRoomId } = createRoom('c', roomName, username); + + roomId = createdRoomId; + + MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); + + // TODO: this should be better + /* eslint-disable no-await-in-loop */ + for (const state of roomState || []) { + switch (state.type) { + case 'm.room.create': + continue; + case 'm.room.join_rules': { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase + await setRoomJoinRules({ room_id: roomId, ...state }); + + break; + } + case 'm.room.name': { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase + await setRoomName({ room_id: roomId, ...state }); + + break; + } + case 'm.room.member': { + // @ts-ignore + if (state.content.membership === 'join') { + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/camelcase,@typescript-eslint/no-use-before-define + await handleRoomMembership({ room_id: roomId, ...state }); + } + + break; + } + } + } + /* eslint-enable no-await-in-loop */ + } + + return roomId; +}; + +export const handleRoomMembership = async (event: IMatrixEvent): Promise => { + const { + room_id: matrixRoomId, + sender: senderMatrixUserId, + state_key: affectedMatrixUserId, + content: { membership }, + invite_room_state: roomState, + } = event; + + // Find the bridged room id + let roomId = await MatrixBridgedRoom.getId(matrixRoomId); + + // If there is no room id, throw error + if (!roomId) { + throw new Error(`Could not find room with matrixRoomId: ${matrixRoomId}`); + } + + // Find the sender user + const senderUserId = await MatrixBridgedUser.getId(senderMatrixUserId); + let senderUser = await Users.findOneById(senderUserId); + // If the sender user does not exist, it means we need to create it + if (!senderUser) { + const { uid } = await matrixClient.user.createLocal(senderMatrixUserId); + + senderUser = Users.findOneById(uid); + } + + // Find the affected user + const affectedUserId = await MatrixBridgedUser.getId(affectedMatrixUserId); + let affectedUser = await Users.findOneById(affectedUserId); + // If the affected user does not exist, it means we need to create it + if (!affectedUser) { + const { uid } = await matrixClient.user.createLocal(affectedMatrixUserId); + + affectedUser = Users.findOneById(uid); + } + + switch (membership) { + case AddMemberToRoomMembership.JOIN: + roomId = await ensureRoom(matrixRoomId, roomId, senderUser.username, roomState); + + addUserToRoom(roomId, affectedUser); + break; + case AddMemberToRoomMembership.INVITE: + // Re-run the state first + if (!roomId) { + for (const state of roomState || []) { + // eslint-disable-next-line @typescript-eslint/camelcase,no-await-in-loop + addToQueue({ ...state, room_id: matrixRoomId }); + } + + addToQueue(event); + + return; + } + + // If the room exists, then just add the user + // TODO: this should be a local invite + addUserToRoom(roomId, affectedUser, senderUser); + break; + case AddMemberToRoomMembership.LEAVE: + removeUserFromRoom(roomId, affectedUser, { + byUser: senderUser, + }); + break; + } +}; diff --git a/app/federation-matrix/server/events/sendMessage.ts b/app/federation-matrix/server/events/sendMessage.ts new file mode 100644 index 000000000000..d2d35ac992df --- /dev/null +++ b/app/federation-matrix/server/events/sendMessage.ts @@ -0,0 +1,22 @@ +// @ts-ignore +import { MatrixBridgedRoom, MatrixBridgedUser, Messages, Users } from '../../../models'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; + +export const handleSendMessage = async (event: IMatrixEvent): Promise => { + const { room_id: matrixRoomId, sender } = event; + + // Find the bridged user id + const userId = await MatrixBridgedUser.getId(sender); + + // Find the user + const user = await Users.findOneById(userId); + + // Find the bridged room id + const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + + Messages.createWithTypeRoomIdMessageAndUser('m', roomId, event.content.body, { + _id: user._id, + username: user.username, + }); +}; diff --git a/app/federation-matrix/server/events/setRoomJoinRules.ts b/app/federation-matrix/server/events/setRoomJoinRules.ts new file mode 100644 index 000000000000..534e0b3043e6 --- /dev/null +++ b/app/federation-matrix/server/events/setRoomJoinRules.ts @@ -0,0 +1,43 @@ +import { MatrixBridgedRoom, Rooms, Subscriptions } from '../../../models/server'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; +import { SetRoomJoinRules } from '../definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules'; + +export const setRoomJoinRules = async (event: IMatrixEvent): Promise => { + const { + room_id: matrixRoomId, + content: { join_rule: joinRule }, + } = event; + + // Find the bridged room id + const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + + let type; + + switch (joinRule) { + case SetRoomJoinRules.INVITE: + type = 'p'; + break; + case SetRoomJoinRules.JOIN: + default: + type = 'c'; + } + + Rooms.update( + { _id: roomId }, + { + $set: { + t: type, + }, + }, + ); + + Subscriptions.update( + { rid: roomId }, + { + $set: { + t: type, + }, + }, + ); +}; diff --git a/app/federation-matrix/server/events/setRoomName.ts b/app/federation-matrix/server/events/setRoomName.ts new file mode 100644 index 000000000000..9e71970ddfc3 --- /dev/null +++ b/app/federation-matrix/server/events/setRoomName.ts @@ -0,0 +1,37 @@ +import { MatrixBridgedRoom, Rooms, Subscriptions } from '../../../models/server'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; + +export const setRoomName = async (event: IMatrixEvent): Promise => { + const { + room_id: matrixRoomId, + content: { name }, + } = event; + + // Normalize room name + const normalizedName = name.replace('@', ''); + + // Find the bridged room id + const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + + Rooms.update( + { _id: roomId }, + { + $set: { + name: normalizedName, + fname: normalizedName, + bridged: true, // TODO: this should not be here + }, + }, + ); + + Subscriptions.update( + { rid: roomId }, + { + $set: { + name: normalizedName, + fname: normalizedName, + }, + }, + ); +}; diff --git a/app/federation-matrix/server/events/setRoomTopic.ts b/app/federation-matrix/server/events/setRoomTopic.ts new file mode 100644 index 000000000000..d75d38df651e --- /dev/null +++ b/app/federation-matrix/server/events/setRoomTopic.ts @@ -0,0 +1,22 @@ +import { MatrixBridgedRoom, Rooms } from '../../../models/server'; +import { IMatrixEvent } from '../definitions/IMatrixEvent'; +import { MatrixEventType } from '../definitions/MatrixEventType'; + +export const setRoomTopic = async (event: IMatrixEvent): Promise => { + const { + room_id: matrixRoomId, + content: { topic }, + } = event; + + // Find the bridged room id + const roomId = await MatrixBridgedRoom.getId(matrixRoomId); + + Rooms.update( + { _id: roomId }, + { + $set: { + description: topic, + }, + }, + ); +}; diff --git a/app/federation-matrix/server/index.ts b/app/federation-matrix/server/index.ts new file mode 100644 index 000000000000..3f319b0a0153 --- /dev/null +++ b/app/federation-matrix/server/index.ts @@ -0,0 +1,3 @@ +import { matrixBridge } from './bridge'; + +matrixBridge.run(3300); diff --git a/app/federation-matrix/server/matrix-client/index.ts b/app/federation-matrix/server/matrix-client/index.ts new file mode 100644 index 000000000000..68664d6e9cdf --- /dev/null +++ b/app/federation-matrix/server/matrix-client/index.ts @@ -0,0 +1,9 @@ +import * as message from './message'; +import * as room from './room'; +import * as user from './user'; + +export const matrixClient = { + message, + room, + user, +}; diff --git a/app/federation-matrix/server/matrix-client/message.ts b/app/federation-matrix/server/matrix-client/message.ts new file mode 100644 index 000000000000..073e4ad380bf --- /dev/null +++ b/app/federation-matrix/server/matrix-client/message.ts @@ -0,0 +1,24 @@ +import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; +import { IMessage } from '../../../../definition/IMessage'; +import { matrixBridge } from '../bridge'; + +export const send = async (message: IMessage): Promise => { + // Retrieve the matrix user + const userMatrixId = MatrixBridgedUser.getMatrixId(message.u._id); + + // Retrieve the matrix room + const roomMatrixId = MatrixBridgedRoom.getMatrixId(message.rid); + + if (!userMatrixId) { + throw new Error(`Could not find user matrix id for ${message.u._id}`); + } + + if (!roomMatrixId) { + throw new Error(`Could not find room matrix id for ${message.rid}`); + } + + const intent = matrixBridge.getIntent(userMatrixId); + await intent.sendText(roomMatrixId, message.msg || '...not-supported...'); + + return message; +}; diff --git a/app/federation-matrix/server/matrix-client/room.ts b/app/federation-matrix/server/matrix-client/room.ts new file mode 100644 index 000000000000..f4a9ad4e821f --- /dev/null +++ b/app/federation-matrix/server/matrix-client/room.ts @@ -0,0 +1,48 @@ +import { IRoom } from '/definition/IRoom'; +import { IUser } from '/definition/IUser'; +import { MatrixBridgedRoom, MatrixBridgedUser } from '/app/models'; +import { matrixBridge } from '/app/federation-matrix/server/bridge'; + +interface ICreateRoomResult { + rid: string; + mri: string; +} + +export const create = async (user: IUser, room: IRoom): Promise => { + // Check if this room already exists (created by another method) + // and if so, ignore the callback + const roomMatrixId = MatrixBridgedRoom.getMatrixId(room._id); + if (roomMatrixId) { + return { rid: room._id, mri: roomMatrixId }; + } + + // Retrieve the matrix user + const userMatrixId = MatrixBridgedUser.getMatrixId(user._id); + + if (!userMatrixId) { + throw new Error(`Could not find user matrix id for ${user._id}`); + } + + const intent = matrixBridge.getIntent(userMatrixId); + + const roomName = `@${room.name}`; + + // Create the matrix room + const matrixRoom = await intent.createRoom({ + createAsClient: true, + options: { + name: roomName, + topic: room.topic, + visibility: room.t === 'p' ? 'invite' : 'public', + preset: room.t === 'p' ? 'private_chat' : 'public_chat', + }, + }); + + // Add to the map + MatrixBridgedRoom.insert({ rid: room._id, mri: matrixRoom.room_id }); + + // Add our user + await intent.invite(matrixRoom.room_id, userMatrixId); + + return { rid: room._id, mri: matrixRoom.room_id }; +}; diff --git a/app/federation-matrix/server/matrix-client/user.ts b/app/federation-matrix/server/matrix-client/user.ts new file mode 100644 index 000000000000..e02b99036ea0 --- /dev/null +++ b/app/federation-matrix/server/matrix-client/user.ts @@ -0,0 +1,138 @@ +import { MatrixProfileInfo } from 'matrix-bot-sdk'; + +import { IUser } from '../../../../definition/IUser'; +import { matrixBridge } from '../bridge'; +import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '../../../models/server'; +import { config } from '../config'; +import { matrixClient } from '.'; +import { dataInterface } from '../data-interface'; + +interface ICreateUserResult { + uid: string; + mui: string; + remote: boolean; +} + +export const invite = async (inviterId: string, roomId: string, invitedId: string): Promise => { + console.log(`[${inviterId}-${invitedId}-${roomId}] Inviting user ${invitedId} to ${roomId}...`); + + // Find the bridged room id + let matrixRoomId = await MatrixBridgedRoom.getMatrixId(roomId); + + if (!matrixRoomId) { + console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote room...`); + + // Get the room + const room = await dataInterface.room(roomId); + + // Create the missing room + const { mri } = await matrixClient.room.create({ _id: inviterId } as IUser, room); + + matrixRoomId = mri; + + console.log(`[${inviterId}-${invitedId}-${roomId}] Remote room created as ${matrixRoomId}...`); + } + + // Find the inviter user + let inviterUser = MatrixBridgedUser.getById(inviterId); + + if (!inviterUser) { + console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote inviter user...`); + + // Get the user + const user = await dataInterface.user(inviterId); + + // Create the missing user + inviterUser = await matrixClient.user.createRemote(user); + + console.log(`[${inviterId}-${invitedId}-${roomId}] Inviter user created as ${inviterUser.mui}...`); + } + + // Determine if the user is local or remote + let invitedUserMatrixId = invitedId; + const invitedUserDomain = invitedId.includes(':') ? invitedId.split(':').pop() : ''; + const invitedUserIsRemote = invitedUserDomain && invitedUserDomain !== config.serverDomain; + + console.log(invitedUserMatrixId, invitedUserDomain, invitedUserIsRemote); + + // If the invited user is not remote, let's ensure it exists remotely + if (!invitedUserIsRemote) { + console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote invited user...`); + + // Find the invited user + const invitedUser = Users.findOneByUsername(invitedId.replace('@', '')); + + // Check if we already have a matrix id for that user + const existingMatrixId = MatrixBridgedUser.getMatrixId(invitedUser._id); + + if (!existingMatrixId) { + const { mui } = await matrixClient.user.createRemote(invitedUser); + + invitedUserMatrixId = mui; + } else { + invitedUserMatrixId = existingMatrixId; + } + + console.log(`[${inviterId}-${invitedId}-${roomId}] Invited user created as ${invitedUserMatrixId}...`); + } + + console.log(`[${inviterId}-${invitedId}-${roomId}] Inviting the user...`); + + // Invite the user + await matrixBridge.getIntent(inviterUser.mui).invite(matrixRoomId, invitedUserMatrixId); + + // Auto-join if the user is Rocket.Chat controlled + if (!invitedUserIsRemote) { + console.log(`[${inviterId}-${invitedId}-${roomId}] Auto-join room...`); + + await matrixBridge.getIntent(invitedUserMatrixId).join(matrixRoomId); + } +}; + +export const createRemote = async (u: IUser): Promise => { + const matrixUserId = `@${u.username?.toLowerCase()}:${config.serverDomain}`; + + console.log(`Creating remote user ${matrixUserId}...`); + + const intent = matrixBridge.getIntent(matrixUserId); + + await intent.ensureProfile(u.name); + + await intent.setDisplayName(`${u.username} (${u.name})`); + + const payload = { uid: u._id, mui: matrixUserId, remote: true }; + + MatrixBridgedUser.upsert({ uid: u._id }, payload); + + return payload; +}; + +export const createLocal = async (matrixUserId: string): Promise => { + console.log(`Creating local user ${matrixUserId}...`); + + const intent = matrixBridge.getIntent(matrixUserId); + + let currentProfile: MatrixProfileInfo = {}; + + try { + currentProfile = await intent.getProfileInfo(matrixUserId); + } catch (err) { + // no-op + } + + const uid = Users.create({ + username: matrixUserId.replace('@', ''), + type: 'user', + status: 'online', + active: true, + roles: ['user'], + name: currentProfile.displayname, + requirePasswordChange: false, + }); + + const payload = { uid, mui: matrixUserId, remote: false }; + + MatrixBridgedUser.upsert({ uid }, payload); + + return payload; +}; diff --git a/app/federation-matrix/server/methods/checkBridgedRoomExists.ts b/app/federation-matrix/server/methods/checkBridgedRoomExists.ts new file mode 100644 index 000000000000..7db759e1cc38 --- /dev/null +++ b/app/federation-matrix/server/methods/checkBridgedRoomExists.ts @@ -0,0 +1,7 @@ +import { MatrixBridgedRoom } from '../../../models/server'; + +export const checkBridgedRoomExists = async (matrixRoomId: string): Promise => { + const existingRoomId = MatrixBridgedRoom.getId(matrixRoomId); + + return !!existingRoomId; +}; diff --git a/app/federation-matrix/server/queue.ts b/app/federation-matrix/server/queue.ts new file mode 100644 index 000000000000..f1f0ea02061e --- /dev/null +++ b/app/federation-matrix/server/queue.ts @@ -0,0 +1,16 @@ +// Create the queue +import { queueAsPromised } from 'fastq'; +import * as fastq from 'fastq'; + +import { IMatrixEvent } from './definitions/IMatrixEvent'; +import { MatrixEventType } from './definitions/MatrixEventType'; +import { eventHandler } from './eventHandler'; + +export const matrixEventQueue: queueAsPromised> = fastq.promise(eventHandler, 1); + +export const addToQueue = (event: IMatrixEvent): void => { + console.log(`Queueing ${event.type}...`); + + // TODO: Handle error + matrixEventQueue.push(event).catch((err) => console.error(err)); +}; diff --git a/app/lib/client/methods/sendMessage.js b/app/lib/client/methods/sendMessage.js index 29c54e7a0d6a..dd81f9db359d 100644 --- a/app/lib/client/methods/sendMessage.js +++ b/app/lib/client/methods/sendMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { TimeSync } from 'meteor/mizzao:timesync'; import s from 'underscore.string'; -import { ChatMessage } from '../../../models'; +import { ChatMessage, Rooms } from '../../../models'; import { settings } from '../../../settings'; import { callbacks } from '../../../../lib/callbacks'; import { t } from '../../../utils/client'; @@ -31,6 +31,13 @@ Meteor.methods({ if (settings.get('Message_Read_Receipt_Enabled')) { message.unread = true; } + + // If the room is bridged, send the message to Synapse only + const { bridged } = Rooms.findOne({ _id: message.rid }, { fields: { bridged: 1 } }); + if (bridged) { + return; + } + message = callbacks.run('beforeSaveMessage', message); onClientMessageReceived(message).then(function (message) { ChatMessage.insert(message); diff --git a/app/lib/server/methods/sendMessage.js b/app/lib/server/methods/sendMessage.js index 6ddbbf851f96..5d62200d8a7d 100644 --- a/app/lib/server/methods/sendMessage.js +++ b/app/lib/server/methods/sendMessage.js @@ -7,12 +7,13 @@ import { hasPermission } from '../../../authorization'; import { metrics } from '../../../metrics'; import { settings } from '../../../settings'; import { messageProperties } from '../../../ui-utils'; -import { Users, Messages } from '../../../models'; +import { Users, Messages, Rooms } from '../../../models'; import { sendMessage } from '../functions'; import { RateLimiter } from '../lib'; import { canSendMessage } from '../../../authorization/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; import { api } from '../../../../server/sdk/api'; +import { matrixClient } from '../../../federation-matrix/server/matrix-client'; export function executeSendMessage(uid, message) { if (message.tshow && !message.tmid) { @@ -105,6 +106,12 @@ Meteor.methods({ } try { + // If the room is bridged, send the message to Synapse only + const { bridged } = Rooms.findOne({ _id: message.rid }, { fields: { bridged: 1 } }); + if (bridged) { + return matrixClient.message.send({ ...message, u: { _id: uid } }); + } + return executeSendMessage(uid, message); } catch (error) { if ((error.error || error.message) === 'error-not-allowed') { diff --git a/app/models/server/index.js b/app/models/server/index.js index 52ee6952eb7f..2e69514840d8 100644 --- a/app/models/server/index.js +++ b/app/models/server/index.js @@ -22,6 +22,9 @@ export { AppsPersistenceModel } from './models/apps-persistence-model'; export { AppsModel } from './models/apps-model'; export { FederationRoomEvents } from './models/FederationRoomEvents'; +export { MatrixBridgedRoom } from './models/MatrixBridgedRoom'; +export { MatrixBridgedUser } from './models/MatrixBridgedUser'; + export { Base, BaseDb, diff --git a/app/models/server/models/MatrixBridgedRoom.ts b/app/models/server/models/MatrixBridgedRoom.ts new file mode 100644 index 000000000000..bfdfc3d1301f --- /dev/null +++ b/app/models/server/models/MatrixBridgedRoom.ts @@ -0,0 +1,28 @@ +import { Base } from './_Base'; + +interface IMatrixBridgedRoom { + rid: string; + mri: string; +} + +class MatrixBridgedRoomModel extends Base { + constructor() { + super('matrix_bridged_rooms'); + this.tryEnsureIndex({ rid: 1 }, { unique: true, sparse: true }); + this.tryEnsureIndex({ mri: 1 }, { unique: true, sparse: true }); + } + + getMatrixId(rid: string): string | null { + const bridgedRoom: IMatrixBridgedRoom = this.findOne({ rid }); + + return bridgedRoom ? bridgedRoom.mri : null; + } + + getId(mri: string): string | null { + const bridgedRoom: IMatrixBridgedRoom = this.findOne({ mri }); + + return bridgedRoom ? bridgedRoom.rid : null; + } +} + +export const MatrixBridgedRoom = new MatrixBridgedRoomModel(); diff --git a/app/models/server/models/MatrixBridgedUser.ts b/app/models/server/models/MatrixBridgedUser.ts new file mode 100644 index 000000000000..b2eabb9d686e --- /dev/null +++ b/app/models/server/models/MatrixBridgedUser.ts @@ -0,0 +1,37 @@ +import { Base } from './_Base'; + +export interface IMatrixBridgedUser { + uid: string; + mui: string; + remote: boolean; +} + +class MatrixBridgedUserModel extends Base { + constructor() { + super('matrix_bridged_users'); + this.tryEnsureIndex({ uid: 1 }, { unique: true, sparse: true }); + this.tryEnsureIndex({ mui: 1 }, { unique: true, sparse: true }); + } + + getMatrixId(uid: string): string | null { + const bridgedUser: IMatrixBridgedUser = this.findOne({ uid }); + + return bridgedUser ? bridgedUser.mui : null; + } + + getByMatrixId(mui: string): IMatrixBridgedUser | null { + return this.findOne({ mui }); + } + + getId(mui: string): string | null { + const bridgedUser: IMatrixBridgedUser = this.findOne({ mui }); + + return bridgedUser ? bridgedUser.uid : null; + } + + getById(uid: string): IMatrixBridgedUser | null { + return this.findOne({ uid }); + } +} + +export const MatrixBridgedUser = new MatrixBridgedUserModel(); diff --git a/app/slashcommands-bridge/client/index.ts b/app/slashcommands-bridge/client/index.ts new file mode 100644 index 000000000000..df2ed311ad8e --- /dev/null +++ b/app/slashcommands-bridge/client/index.ts @@ -0,0 +1,3 @@ +import { slashCommands } from '../../utils'; + +slashCommands.add('bridge', undefined); diff --git a/app/slashcommands-bridge/server/index.ts b/app/slashcommands-bridge/server/index.ts new file mode 100644 index 000000000000..5f677b984fb8 --- /dev/null +++ b/app/slashcommands-bridge/server/index.ts @@ -0,0 +1,43 @@ +import { Meteor } from 'meteor/meteor'; +import { Match } from 'meteor/check'; + +import { slashCommands } from '../../utils/lib/slashCommand'; +import { matrixClient } from '../../federation-matrix/server/matrix-client'; + +function Bridge(_command: 'bridge', stringParams: string, item: Record): void { + if (_command !== 'bridge' || !Match.test(stringParams, String)) { + return; + } + + const [command, ...params] = stringParams.split(' '); + + const { rid: roomId } = item; + + switch (command) { + case 'invite': + // Invite a user + // Example: /bridge invite rc_helena:b.rc.allskar.com + const [userId] = params; + + const currentUserId = Meteor.userId(); + + if (currentUserId) { + Promise.await(matrixClient.user.invite(currentUserId, roomId, `@${userId.replace('@', '')}`)); + } + + break; + } +} + +slashCommands.add( + 'bridge', + Bridge, + { + description: 'Invites_an_user_to_a_bridged_room', + params: '#command #user', + }, + undefined, + false, + undefined, + undefined, +); diff --git a/app/ui-sidenav/client/roomList.js b/app/ui-sidenav/client/roomList.js index e6d116bfb46c..503d6d38897a 100644 --- a/app/ui-sidenav/client/roomList.js +++ b/app/ui-sidenav/client/roomList.js @@ -172,6 +172,7 @@ const mergeSubRoom = (subscription) => { departmentId: 1, source: 1, queuedAt: 1, + bridged: 1, }, }; @@ -213,6 +214,7 @@ const mergeSubRoom = (subscription) => { ts, source, queuedAt, + bridged, } = room; subscription.lm = subscription.lr ? new Date(Math.max(subscription.lr, lastRoomUpdate)) : lastRoomUpdate; @@ -251,6 +253,7 @@ const mergeSubRoom = (subscription) => { ts, source, queuedAt, + bridged, }); }; @@ -294,6 +297,7 @@ const mergeRoomSub = (room) => { ts, source, queuedAt, + bridged, } = room; Subscriptions.update( @@ -334,6 +338,7 @@ const mergeRoomSub = (room) => { ts, source, queuedAt, + bridged, ...getLowerCaseNames(room, sub.name, sub.fname), }, }, diff --git a/client/importPackages.ts b/client/importPackages.ts index 04be8bbaf135..df26b89e6ef2 100644 --- a/client/importPackages.ts +++ b/client/importPackages.ts @@ -43,6 +43,7 @@ import '../app/apps/client'; import '../app/slackbridge/client'; import '../app/slashcommands-archiveroom/client'; import '../app/slashcommand-asciiarts/client'; +import '../app/slashcommands-bridge/client'; import '../app/slashcommands-create/client'; import '../app/slashcommands-hide/client'; import '../app/slashcommands-invite/client'; diff --git a/ee/server/lib/ldap/Manager.ts b/ee/server/lib/ldap/Manager.ts index 54e421a23703..be3939314919 100644 --- a/ee/server/lib/ldap/Manager.ts +++ b/ee/server/lib/ldap/Manager.ts @@ -244,7 +244,7 @@ export class LDAPEEManager extends LDAPManager { logger.debug(`Channel '${channel}' doesn't exist, creating it.`); const roomOwner = settings.get('LDAP_Sync_User_Data_Channels_Admin') || ''; - // #ToDo: Remove typecastings when createRoom is converted to ts. + // #ToDo: Remove typecastings when createRoom.ts is converted to ts. const room = createRoom('c', channel, roomOwner, [], false, { customFields: { ldap: true }, } as any) as unknown as ICreatedRoom | undefined; diff --git a/package-lock.json b/package-lock.json index 9a6768193116..886fd89039de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -3530,6 +3535,11 @@ } } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "@cypress/request": { "version": "2.88.10", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", @@ -3630,6 +3640,16 @@ } } }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@discoveryjs/json-ext": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", @@ -4570,6 +4590,11 @@ "glob-to-regexp": "^0.3.0" } }, + "@napi-rs/cli": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.4.5.tgz", + "integrity": "sha512-CLa3PSHh4Y760OXkHidzfHavVtfbQyfMhj3sWpta3SZjbWMk0tbdPhRez9y8KVApVVWjBxz5agEeFMfxxr+KTg==" + }, "@napi-rs/pinyin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@napi-rs/pinyin/-/pinyin-1.6.2.tgz", @@ -9586,6 +9611,15 @@ "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", "dev": true }, + "@turt2live/matrix-sdk-crypto-nodejs": { + "version": "0.1.0-beta.10", + "resolved": "https://registry.npmjs.org/@turt2live/matrix-sdk-crypto-nodejs/-/matrix-sdk-crypto-nodejs-0.1.0-beta.10.tgz", + "integrity": "sha512-y5TA8fD5a7xaIwjZhQ66eT3scDsU47GkcCuQ0vjlXB0shY2cCMB4MF1nY/7c1/DniM+KvDXxrhs2VXphlPLpaA==", + "requires": { + "@napi-rs/cli": "^2.2.0", + "shelljs": "^0.8.4" + } + }, "@types/adm-zip": { "version": "0.4.34", "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.34.tgz", @@ -9638,7 +9672,6 @@ "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -9724,7 +9757,6 @@ "version": "3.4.33", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "dev": true, "requires": { "@types/node": "*" } @@ -9778,7 +9810,6 @@ "version": "4.17.12", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -9790,7 +9821,6 @@ "version": "4.17.22", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.22.tgz", "integrity": "sha512-WdqmrUsRS4ootGha6tVwk/IVHM1iorU8tGehftQD2NWiPniw/sm7xdJOIlXLwqdInL9wBw/p7oO8vaYEF3NDmA==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -10072,8 +10102,7 @@ "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/minimatch": { "version": "3.0.5", @@ -10270,14 +10299,12 @@ "@types/qs": { "version": "6.9.6", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", - "dev": true + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" }, "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, "@types/reach__router": { "version": "1.3.9", @@ -10375,7 +10402,6 @@ "version": "1.13.9", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -11479,6 +11505,11 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "optional": true }, + "another-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", + "integrity": "sha1-tfQBnJc7bdXGUGotk0acttMq7tw=" + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -13737,6 +13768,14 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "batch-processor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz", @@ -13792,6 +13831,21 @@ "dev": true, "optional": true }, + "binary-search-tree": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz", + "integrity": "sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=", + "requires": { + "underscore": "~1.4.4" + }, + "dependencies": { + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" + } + } + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -14152,6 +14206,11 @@ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, + "browser-request": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", + "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=" + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -15550,6 +15609,26 @@ "dev": true, "optional": true }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + }, + "dependencies": { + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + } + } + }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -17497,6 +17576,11 @@ "hoist-non-react-statics": "^3.3.0" } }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -19458,9 +19542,9 @@ "integrity": "sha512-Qc7oCVO9hAPz5GUONmToIoa95YWzoe7SLsrjIXTfCFf6HFQXxxWePXe8D+Kp/XCrr5H/pMJwP2xprW07wYv/BQ==" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "requires": { "reusify": "^1.0.4" } @@ -19517,6 +19601,11 @@ "pend": "~1.2.0" } }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, "fflate": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.1.tgz", @@ -19601,6 +19690,14 @@ } } }, + "file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "requires": { + "moment": "^2.29.1" + } + }, "file-system-cache": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", @@ -19819,6 +19916,11 @@ "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "focus-visible": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", @@ -21372,6 +21474,22 @@ } } }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -22505,6 +22623,11 @@ } } }, + "htmlencode": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz", + "integrity": "sha1-9+LWr74YqHp45jujMI51N2Z0Dj8=" + }, "htmlparser2": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", @@ -23397,6 +23520,23 @@ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true }, + "is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==" + }, + "is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -23466,6 +23606,16 @@ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -24228,6 +24378,11 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, + "jsonpointer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" + }, "jsontokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-2.0.2.tgz", @@ -24543,6 +24698,11 @@ "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", "dev": true }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "lamejs": { "version": "git+https://github.com/zhuker/lamejs.git#564612b5b57336238a5920ba4c301b49f7cb2bab", "from": "git+https://github.com/zhuker/lamejs.git", @@ -25307,6 +25467,30 @@ } } }, + "logform": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", + "requires": { + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -25326,6 +25510,18 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "requires": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -25531,6 +25727,562 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "matrix-appservice": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/matrix-appservice/-/matrix-appservice-0.10.0.tgz", + "integrity": "sha512-bxkvPaFXzuuRfqSQgIBbA6M+nKXeRJEeZlJfzjhP0RBBMl62HQTXqNLSVHhLRCdzKbr1OayrbDKL+BnmoghDDA==", + "requires": { + "@types/express": "^4.17.8", + "body-parser": "^1.19.0", + "express": "^4.17.1", + "js-yaml": "^4.1.0", + "morgan": "^1.10.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "matrix-appservice-bridge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/matrix-appservice-bridge/-/matrix-appservice-bridge-3.2.0.tgz", + "integrity": "sha512-fkVarDN2vLwgr/j2gOAT58AOVK+ualZghOI5oIOCImwut4U7gXBig2sjJ9f+NYjE2ljlWOas4UPSRLsly16EvQ==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "chalk": "^4.1.0", + "extend": "^3.0.2", + "is-my-json-valid": "^2.20.5", + "js-yaml": "^4.0.0", + "matrix-appservice": "^0.10.0", + "matrix-bot-sdk": "^0.6.0-beta.2", + "matrix-js-sdk": "^12.4.1", + "nedb": "^1.8.0", + "nopt": "^5.0.0", + "p-queue": "^6.6.2", + "prom-client": "^14.0.0", + "winston": "^3.3.3", + "winston-daily-rotate-file": "^4.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "requires": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + } + }, + "prom-client": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.0.1.tgz", + "integrity": "sha512-HxTArb6fkOntQHoRGvv4qd/BkorjliiuO2uSWC2KC17MUTKYttWdDoXX/vxOhQdkoECEM9BBH0pj2l8G8kev6w==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "matrix-bot-sdk": { + "version": "0.6.0-beta.6", + "resolved": "https://registry.npmjs.org/matrix-bot-sdk/-/matrix-bot-sdk-0.6.0-beta.6.tgz", + "integrity": "sha512-1ISdwN87ylkHcQ8UChS5YEf41Ggil0c/0cMHh/DjBdssbcNpMdIj+/5vfA2VYlK3TMu6BMFX7Ot9GnXsxp5oWA==", + "requires": { + "@turt2live/matrix-sdk-crypto-nodejs": "^0.1.0-beta.10", + "@types/express": "^4.17.13", + "another-json": "^0.2.0", + "chalk": "^4", + "express": "^4.17.2", + "glob-to-regexp": "^0.4.1", + "hash.js": "^1.1.7", + "html-to-text": "^8.1.0", + "htmlencode": "^0.0.4", + "lowdb": "^1", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "morgan": "^1.10.0", + "request": "^2.88.2", + "request-promise": "^4.2.6", + "sanitize-html": "^2.6.1" + }, + "dependencies": { + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "html-to-text": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.1.0.tgz", + "integrity": "sha512-Z9iYAqYK2c18GswSbnxJSeMs7lyJgwR2oIkDOyOHGBbYsPsG4HvT379jj3Lcbfko8A5ceyyMHAfkmp/BiXA9/Q==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.5", + "selderee": "^0.6.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "matrix-js-sdk": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-12.5.0.tgz", + "integrity": "sha512-HnEXoEhqpNp9/W9Ep7ZNZAubFlUssFyVpjgKfMOxxg+dYbBk5NWToHmAPQxlRUgrZ/rIMLVyMJROSCIthDbo2A==", + "requires": { + "@babel/runtime": "^7.12.5", + "another-json": "^0.2.0", + "browser-request": "^0.3.3", + "bs58": "^4.0.1", + "content-type": "^1.0.4", + "loglevel": "^1.7.1", + "p-retry": "^4.5.0", + "qs": "^6.9.6", + "request": "^2.88.2", + "unhomoglyph": "^1.0.6" + }, + "dependencies": { + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + } + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, "md5-file": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", @@ -27669,6 +28421,25 @@ "iced-runtime": ">=0.0.1" } }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -27801,6 +28572,30 @@ } } }, + "nedb": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz", + "integrity": "sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg=", + "requires": { + "async": "0.2.10", + "binary-search-tree": "0.2.5", + "localforage": "^1.3.0", + "mkdirp": "~0.5.1", + "underscore": "~1.4.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -28172,6 +28967,14 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.2.tgz", "integrity": "sha512-YSzu7TLbI+bsjCis/TZlAXBoM4y93HhlIgo0P5oiA2ua9Z4k+E2Fod//ybIzdJxOlXGRcHIh/WaeCBehvxZb/Q==" }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -28296,6 +29099,11 @@ } } }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -28618,8 +29426,7 @@ "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", @@ -28629,6 +29436,14 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", @@ -28764,8 +29579,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "2.1.0", @@ -28814,7 +29628,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, "requires": { "p-finally": "^1.0.0" } @@ -28912,6 +29725,11 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -28937,8 +29755,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { "version": "3.1.2", @@ -29010,8 +29827,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-posix": { "version": "1.0.0", @@ -32130,6 +32946,14 @@ } } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "recompose": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", @@ -32644,6 +33468,17 @@ "throttleit": "^1.0.0" } }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "request-promise-core": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", @@ -32715,7 +33550,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -32945,6 +33779,105 @@ } } }, + "sanitize-html": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", + "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", + "requires": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^6.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + }, + "dependencies": { + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + } + } + }, "saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -33324,6 +34257,23 @@ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "dependencies": { + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + } + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -33823,6 +34773,14 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, + "steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", + "requires": { + "graceful-fs": "^4.1.3" + } + }, "store2": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/store2/-/store2-2.12.0.tgz", @@ -35874,6 +36832,11 @@ } } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -36128,6 +37091,11 @@ "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", "dev": true }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "triplesec": { "version": "3.0.27", "resolved": "https://registry.npmjs.org/triplesec/-/triplesec-3.0.27.tgz", @@ -36813,6 +37781,11 @@ "xtend": "^4.0.0" } }, + "unhomoglyph": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", + "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -38068,6 +39041,78 @@ "bs58check": "<3.0.0" } }, + "winston": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.6.0.tgz", + "integrity": "sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "dependencies": { + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "winston-daily-rotate-file": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.6.1.tgz", + "integrity": "sha512-Ycch4LZmTycbhgiI2eQXBKI1pKcEQgAqmBjyq7/dC6Dk77nasdxvhLKraqTdCw7wNDSs8/M0jXaLATHquG7xYg==", + "requires": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 26d6de7bb25a..cd2764cd4e88 100644 --- a/package.json +++ b/package.json @@ -234,6 +234,7 @@ "exif-be-gone": "^1.2.0", "express": "^4.17.1", "express-rate-limit": "^5.2.6", + "fastq": "^1.13.0", "fflate": "^0.7.1", "fibers": "^5.0.1", "file-type": "^10.11.0", @@ -268,6 +269,7 @@ "lodash.get": "^4.4.2", "mailparser": "^3.4.0", "marked": "^0.7.0", + "matrix-appservice-bridge": "^3.2.0", "mem": "^8.1.1", "meteor-node-stubs": "^1.1.0", "mime-db": "^1.48.0", diff --git a/server/importPackages.ts b/server/importPackages.ts index 86938fc06980..930f7e103e6e 100644 --- a/server/importPackages.ts +++ b/server/importPackages.ts @@ -23,6 +23,7 @@ import '../app/emoji-custom/server'; import '../app/emoji-emojione/server'; import '../app/error-handler'; import '../app/federation/server'; +import '../app/federation-matrix/server'; import '../app/file'; import '../app/file-upload'; import '../app/github-enterprise/server'; @@ -62,6 +63,7 @@ import '../app/apps/server'; import '../app/slackbridge/server'; import '../app/slashcommands-archiveroom/server'; import '../app/slashcommand-asciiarts/server'; +import '../app/slashcommands-bridge/server'; import '../app/slashcommands-create/server'; import '../app/slashcommands-help'; import '../app/slashcommands-hide/server'; diff --git a/server/modules/watchers/publishFields.ts b/server/modules/watchers/publishFields.ts index 66c84a30df96..839d8198ade9 100644 --- a/server/modules/watchers/publishFields.ts +++ b/server/modules/watchers/publishFields.ts @@ -102,6 +102,9 @@ export const roomFields = { waitingResponse: 1, queuedAt: 1, + // Federation fields + bridged: 1, + // fields used by DMs usernames: 1, uids: 1, diff --git a/server/services/room/service.ts b/server/services/room/service.ts index b11d602068e4..86d319e4d7c2 100644 --- a/server/services/room/service.ts +++ b/server/services/room/service.ts @@ -34,7 +34,7 @@ export class RoomService extends ServiceClassInternal implements IRoomService { throw new Error('User not found'); } - // TODO convert `createRoom` function to "raw" and move to here + // TODO convert `createRoom.ts` function to "raw" and move to here return createRoom(type, name, user.username, members, readOnly, extraData, options) as unknown as IRoom; } diff --git a/tests/data/rooms.helper.js b/tests/data/rooms.helper.js index 1081d79cf402..60e2775c0e93 100644 --- a/tests/data/rooms.helper.js +++ b/tests/data/rooms.helper.js @@ -2,7 +2,7 @@ import { api, credentials, request } from './api-data'; export const createRoom = ({ name, type, username, token, agentId, members = [], credentials: customCredentials }) => { if (!type) { - throw new Error('"type" is required in "createRoom" test helper'); + throw new Error('"type" is required in "createRoom.ts" test helper'); } if (type === 'v') { /* Special handling for voip type of rooms. From 2bc023788baefc2cca445f6138f86a609421586d Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Wed, 30 Mar 2022 11:04:18 -0300 Subject: [PATCH 02/18] POC - initial commit --- app/federation-matrix/server/matrix-client/room.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/federation-matrix/server/matrix-client/room.ts b/app/federation-matrix/server/matrix-client/room.ts index f4a9ad4e821f..71b98d0e1ef2 100644 --- a/app/federation-matrix/server/matrix-client/room.ts +++ b/app/federation-matrix/server/matrix-client/room.ts @@ -1,7 +1,7 @@ -import { IRoom } from '/definition/IRoom'; -import { IUser } from '/definition/IUser'; -import { MatrixBridgedRoom, MatrixBridgedUser } from '/app/models'; -import { matrixBridge } from '/app/federation-matrix/server/bridge'; +import { IRoom } from '../../../../definition/IRoom'; +import { IUser } from '../../../../definition/IUser'; +import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; +import { matrixBridge } from '../bridge'; interface ICreateRoomResult { rid: string; From d9f46ac672f50c5b6fa3672fccb83955244f572c Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Fri, 1 Apr 2022 16:48:28 -0300 Subject: [PATCH 03/18] adding settings/better names --- app/federation-matrix/server/bridge.ts | 63 --------- app/federation-matrix/server/config.ts | 10 -- app/federation-matrix/server/index.ts | 3 - app/federation-v2/server/bridge.ts | 72 ++++++++++ app/federation-v2/server/config.ts | 24 ++++ .../server/data-interface/index.ts | 0 .../server/data-interface/message.ts | 0 .../server/data-interface/room.ts | 0 .../server/data-interface/user.ts | 0 .../server/definitions/IMatrixEvent.ts | 0 .../IMatrixEventContentAddMemberToRoom.ts | 0 .../IMatrixEventContentCreateRoom.ts | 0 .../IMatrixEventContentSendMessage.ts | 0 .../IMatrixEventContentSetRoomJoinRules.ts | 0 .../IMatrixEventContentSetRoomName.ts | 0 .../IMatrixEventContentSetRoomTopic.ts | 0 .../definitions/IMatrixEventContent/index.ts | 0 .../server/definitions/MatrixEventType.ts | 0 .../server/eventHandler.ts | 0 .../server/events/createRoom.ts | 0 .../server/events/index.ts | 0 .../server/events/roomMembership.ts | 0 .../server/events/sendMessage.ts | 0 .../server/events/setRoomJoinRules.ts | 0 .../server/events/setRoomName.ts | 0 .../server/events/setRoomTopic.ts | 0 app/federation-v2/server/index.ts | 18 +++ app/federation-v2/server/logger.ts | 6 + .../server/matrix-client/index.ts | 0 .../server/matrix-client/message.ts | 0 .../server/matrix-client/room.ts | 3 - .../server/matrix-client/user.ts | 9 +- .../server/methods/checkBridgedRoomExists.ts | 0 .../server/queue.ts | 0 app/federation-v2/server/settings.ts | 129 ++++++++++++++++++ app/federation-v2/server/tools.ts | 3 + app/lib/server/methods/sendMessage.js | 2 +- app/slashcommands-bridge/server/index.ts | 2 +- package-lock.json | 11 ++ package.json | 4 +- packages/rocketchat-i18n/i18n/en.i18n.json | 11 +- server/importPackages.ts | 2 +- 42 files changed, 285 insertions(+), 87 deletions(-) delete mode 100644 app/federation-matrix/server/bridge.ts delete mode 100644 app/federation-matrix/server/config.ts delete mode 100644 app/federation-matrix/server/index.ts create mode 100644 app/federation-v2/server/bridge.ts create mode 100644 app/federation-v2/server/config.ts rename app/{federation-matrix => federation-v2}/server/data-interface/index.ts (100%) rename app/{federation-matrix => federation-v2}/server/data-interface/message.ts (100%) rename app/{federation-matrix => federation-v2}/server/data-interface/room.ts (100%) rename app/{federation-matrix => federation-v2}/server/data-interface/user.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEvent.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/IMatrixEventContent/index.ts (100%) rename app/{federation-matrix => federation-v2}/server/definitions/MatrixEventType.ts (100%) rename app/{federation-matrix => federation-v2}/server/eventHandler.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/createRoom.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/index.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/roomMembership.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/sendMessage.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/setRoomJoinRules.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/setRoomName.ts (100%) rename app/{federation-matrix => federation-v2}/server/events/setRoomTopic.ts (100%) create mode 100644 app/federation-v2/server/index.ts create mode 100644 app/federation-v2/server/logger.ts rename app/{federation-matrix => federation-v2}/server/matrix-client/index.ts (100%) rename app/{federation-matrix => federation-v2}/server/matrix-client/message.ts (100%) rename app/{federation-matrix => federation-v2}/server/matrix-client/room.ts (94%) rename app/{federation-matrix => federation-v2}/server/matrix-client/user.ts (93%) rename app/{federation-matrix => federation-v2}/server/methods/checkBridgedRoomExists.ts (100%) rename app/{federation-matrix => federation-v2}/server/queue.ts (100%) create mode 100644 app/federation-v2/server/settings.ts create mode 100644 app/federation-v2/server/tools.ts diff --git a/app/federation-matrix/server/bridge.ts b/app/federation-matrix/server/bridge.ts deleted file mode 100644 index bc0ff690d167..000000000000 --- a/app/federation-matrix/server/bridge.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Bridge, AppServiceRegistration } from 'matrix-appservice-bridge'; - -import { IMatrixEvent } from './definitions/IMatrixEvent'; -import { MatrixEventType } from './definitions/MatrixEventType'; -import { addToQueue } from './queue'; -import { config } from './config'; - -/* eslint-disable @typescript-eslint/camelcase */ -const registrationConfig = AppServiceRegistration.fromObject({ - id: config.id, - hs_token: config.hsToken, - as_token: config.asToken, - namespaces: { - users: [ - { - exclusive: false, - // Reserve these MXID's (usernames) - regex: `.*`, - }, - ], - aliases: [ - { - exclusive: false, - // Reserve these room aliases - regex: `.*`, - }, - ], - rooms: [ - { - exclusive: false, - // This regex is used to define which rooms we listen to with the bridge. - // This does not reserve the rooms like the other namespaces. - regex: '.*', - }, - ], - }, - url: config.bridgeUrl, - sender_localpart: config.matrixBridgeMxidLocalpart, - rate_limited: false, - protocols: null, -}); -/* eslint-enable @typescript-eslint/camelcase */ - -export const matrixBridge = new Bridge({ - homeserverUrl: config.homeServerUrl, - domain: config.serverName, - registration: registrationConfig, - disableStores: true, - controller: { - onAliasQuery: (alias, matrixRoomId): void => { - console.log('onAliasQuery', alias, matrixRoomId); - }, - onEvent: async (request /* , context*/): Promise => { - // Get the event - const event = request.getData() as unknown as IMatrixEvent; - - addToQueue(event); - }, - onLog: async (line, isError): Promise => { - console.log(line, isError); - }, - }, -}); diff --git a/app/federation-matrix/server/config.ts b/app/federation-matrix/server/config.ts deleted file mode 100644 index f93d3def5010..000000000000 --- a/app/federation-matrix/server/config.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const config = { - id: 'rocketchat', - hsToken: 'c905a9a5b1c37288e82e17a5aa7af56fc1783368c285d9be7dbc8276ef5b6fe6', - asToken: 'f872e34bd8dad6d0d6d99897a085e0a7e8fb4c7aac7d8968c19d64fd650d5e82', - serverName: 'servera', - serverDomain: 'example.com', - bridgeUrl: 'http://host.docker.internal:3300', - matrixBridgeMxidLocalpart: 'rocket.cat', - homeServerUrl: 'http://localhost:8008', -}; diff --git a/app/federation-matrix/server/index.ts b/app/federation-matrix/server/index.ts deleted file mode 100644 index 3f319b0a0153..000000000000 --- a/app/federation-matrix/server/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { matrixBridge } from './bridge'; - -matrixBridge.run(3300); diff --git a/app/federation-v2/server/bridge.ts b/app/federation-v2/server/bridge.ts new file mode 100644 index 000000000000..984da71803e9 --- /dev/null +++ b/app/federation-v2/server/bridge.ts @@ -0,0 +1,72 @@ +import { Bridge, AppServiceRegistration } from 'matrix-appservice-bridge'; + +import { IMatrixEvent } from './definitions/IMatrixEvent'; +import { MatrixEventType } from './definitions/MatrixEventType'; +import { addToQueue } from './queue'; +import { isFederationV2Enabled } from './tools'; +import { settings } from '../../settings/server'; + +let bridge; + +((): void => { + if (!isFederationV2Enabled()) return; + + /* eslint-disable @typescript-eslint/camelcase */ + const registrationConfig = AppServiceRegistration.fromObject({ + id: settings.get('FederationV2_id') as string, + hs_token: settings.get('FederationV2_hs_token') as string, + as_token: settings.get('FederationV2_as_token') as string, + url: settings.get('FederationV2_bridge_url') as string, + sender_localpart: settings.get('FederationV2_bridge_localpart') as string, + namespaces: { + users: [ + { + exclusive: false, + // Reserve these MXID's (usernames) + regex: `.*`, + }, + ], + aliases: [ + { + exclusive: false, + // Reserve these room aliases + regex: `.*`, + }, + ], + rooms: [ + { + exclusive: false, + // This regex is used to define which rooms we listen to with the bridge. + // This does not reserve the rooms like the other namespaces. + regex: '.*', + }, + ], + }, + rate_limited: false, + protocols: null, + }); + /* eslint-enable @typescript-eslint/camelcase */ + + bridge = new Bridge({ + homeserverUrl: settings.get('FederationV2_homeserver_url') as string, + domain: settings.get('FederationV2_homeserver_domain') as string, + registration: registrationConfig, + disableStores: true, + controller: { + onAliasQuery: (alias, matrixRoomId): void => { + console.log('onAliasQuery', alias, matrixRoomId); + }, + onEvent: async (request /* , context*/): Promise => { + // Get the event + const event = request.getData() as unknown as IMatrixEvent; + + addToQueue(event); + }, + onLog: async (line, isError): Promise => { + console.log(line, isError); + }, + }, + }); +})(); + +export const matrixBridge = bridge; diff --git a/app/federation-v2/server/config.ts b/app/federation-v2/server/config.ts new file mode 100644 index 000000000000..e461984fb7a2 --- /dev/null +++ b/app/federation-v2/server/config.ts @@ -0,0 +1,24 @@ +import { settings } from '../../settings/server'; + +type bridgeUrlString = `${string}:${string}`; +export type bridgeUrlTuple = [string, number]; + +interface IBridgeConfig { + id: string; + hsToken: string; + asToken: string; + homeserverUrl: string; + homeserverDomain: string; + bridgeUrl: bridgeUrlString; + bridgeLocalpart: string; +} + +export const config: IBridgeConfig = { + id: settings.get('FederationV2_id') as string, + hsToken: settings.get('FederationV2_hs_token') as string, + asToken: settings.get('FederationV2_as_token') as string, + homeserverUrl: settings.get('FederationV2_homeserver_url') as string, + homeserverDomain: settings.get('FederationV2_homeserver_domain') as string, + bridgeUrl: settings.get('FederationV2_bridge_url') as bridgeUrlString, + bridgeLocalpart: settings.get('FederationV2_bridge_localpart') as string, +}; diff --git a/app/federation-matrix/server/data-interface/index.ts b/app/federation-v2/server/data-interface/index.ts similarity index 100% rename from app/federation-matrix/server/data-interface/index.ts rename to app/federation-v2/server/data-interface/index.ts diff --git a/app/federation-matrix/server/data-interface/message.ts b/app/federation-v2/server/data-interface/message.ts similarity index 100% rename from app/federation-matrix/server/data-interface/message.ts rename to app/federation-v2/server/data-interface/message.ts diff --git a/app/federation-matrix/server/data-interface/room.ts b/app/federation-v2/server/data-interface/room.ts similarity index 100% rename from app/federation-matrix/server/data-interface/room.ts rename to app/federation-v2/server/data-interface/room.ts diff --git a/app/federation-matrix/server/data-interface/user.ts b/app/federation-v2/server/data-interface/user.ts similarity index 100% rename from app/federation-matrix/server/data-interface/user.ts rename to app/federation-v2/server/data-interface/user.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEvent.ts b/app/federation-v2/server/definitions/IMatrixEvent.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEvent.ts rename to app/federation-v2/server/definitions/IMatrixEvent.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentCreateRoom.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSendMessage.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomName.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts b/app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/IMatrixEventContentSetRoomTopic.ts diff --git a/app/federation-matrix/server/definitions/IMatrixEventContent/index.ts b/app/federation-v2/server/definitions/IMatrixEventContent/index.ts similarity index 100% rename from app/federation-matrix/server/definitions/IMatrixEventContent/index.ts rename to app/federation-v2/server/definitions/IMatrixEventContent/index.ts diff --git a/app/federation-matrix/server/definitions/MatrixEventType.ts b/app/federation-v2/server/definitions/MatrixEventType.ts similarity index 100% rename from app/federation-matrix/server/definitions/MatrixEventType.ts rename to app/federation-v2/server/definitions/MatrixEventType.ts diff --git a/app/federation-matrix/server/eventHandler.ts b/app/federation-v2/server/eventHandler.ts similarity index 100% rename from app/federation-matrix/server/eventHandler.ts rename to app/federation-v2/server/eventHandler.ts diff --git a/app/federation-matrix/server/events/createRoom.ts b/app/federation-v2/server/events/createRoom.ts similarity index 100% rename from app/federation-matrix/server/events/createRoom.ts rename to app/federation-v2/server/events/createRoom.ts diff --git a/app/federation-matrix/server/events/index.ts b/app/federation-v2/server/events/index.ts similarity index 100% rename from app/federation-matrix/server/events/index.ts rename to app/federation-v2/server/events/index.ts diff --git a/app/federation-matrix/server/events/roomMembership.ts b/app/federation-v2/server/events/roomMembership.ts similarity index 100% rename from app/federation-matrix/server/events/roomMembership.ts rename to app/federation-v2/server/events/roomMembership.ts diff --git a/app/federation-matrix/server/events/sendMessage.ts b/app/federation-v2/server/events/sendMessage.ts similarity index 100% rename from app/federation-matrix/server/events/sendMessage.ts rename to app/federation-v2/server/events/sendMessage.ts diff --git a/app/federation-matrix/server/events/setRoomJoinRules.ts b/app/federation-v2/server/events/setRoomJoinRules.ts similarity index 100% rename from app/federation-matrix/server/events/setRoomJoinRules.ts rename to app/federation-v2/server/events/setRoomJoinRules.ts diff --git a/app/federation-matrix/server/events/setRoomName.ts b/app/federation-v2/server/events/setRoomName.ts similarity index 100% rename from app/federation-matrix/server/events/setRoomName.ts rename to app/federation-v2/server/events/setRoomName.ts diff --git a/app/federation-matrix/server/events/setRoomTopic.ts b/app/federation-v2/server/events/setRoomTopic.ts similarity index 100% rename from app/federation-matrix/server/events/setRoomTopic.ts rename to app/federation-v2/server/events/setRoomTopic.ts diff --git a/app/federation-v2/server/index.ts b/app/federation-v2/server/index.ts new file mode 100644 index 000000000000..cedc975b9139 --- /dev/null +++ b/app/federation-v2/server/index.ts @@ -0,0 +1,18 @@ +import { matrixBridge } from './bridge'; +import { bridgeUrlTuple, config } from './config'; +import { bridgeLogger } from './logger'; + +((): void => { + if (!matrixBridge) return; + + bridgeLogger.info(`Running Federation V2: + id: ${config.id} + bridgeUrl: ${config.bridgeUrl} + homeserverURL: ${config.homeserverUrl} + homeserverDomain: ${config.homeserverDomain} + `); + + const [, port] = config.bridgeUrl.split(':') as bridgeUrlTuple; + + matrixBridge?.run(port); +})(); diff --git a/app/federation-v2/server/logger.ts b/app/federation-v2/server/logger.ts new file mode 100644 index 000000000000..da7b17e3db07 --- /dev/null +++ b/app/federation-v2/server/logger.ts @@ -0,0 +1,6 @@ +import { Logger } from '../../logger/server'; + +const logger = new Logger('FederationV2'); + +export const bridgeLogger = logger.section('bridge'); +export const setupLogger = logger.section('setup'); diff --git a/app/federation-matrix/server/matrix-client/index.ts b/app/federation-v2/server/matrix-client/index.ts similarity index 100% rename from app/federation-matrix/server/matrix-client/index.ts rename to app/federation-v2/server/matrix-client/index.ts diff --git a/app/federation-matrix/server/matrix-client/message.ts b/app/federation-v2/server/matrix-client/message.ts similarity index 100% rename from app/federation-matrix/server/matrix-client/message.ts rename to app/federation-v2/server/matrix-client/message.ts diff --git a/app/federation-matrix/server/matrix-client/room.ts b/app/federation-v2/server/matrix-client/room.ts similarity index 94% rename from app/federation-matrix/server/matrix-client/room.ts rename to app/federation-v2/server/matrix-client/room.ts index 71b98d0e1ef2..40834f5afc64 100644 --- a/app/federation-matrix/server/matrix-client/room.ts +++ b/app/federation-v2/server/matrix-client/room.ts @@ -41,8 +41,5 @@ export const create = async (user: IUser, room: IRoom): Promise => { - const matrixUserId = `@${u.username?.toLowerCase()}:${config.serverDomain}`; + const matrixUserId = `@${u.username?.toLowerCase()}:${getConfig().homeserverDomain}`; console.log(`Creating remote user ${matrixUserId}...`); diff --git a/app/federation-matrix/server/methods/checkBridgedRoomExists.ts b/app/federation-v2/server/methods/checkBridgedRoomExists.ts similarity index 100% rename from app/federation-matrix/server/methods/checkBridgedRoomExists.ts rename to app/federation-v2/server/methods/checkBridgedRoomExists.ts diff --git a/app/federation-matrix/server/queue.ts b/app/federation-v2/server/queue.ts similarity index 100% rename from app/federation-matrix/server/queue.ts rename to app/federation-v2/server/queue.ts diff --git a/app/federation-v2/server/settings.ts b/app/federation-v2/server/settings.ts new file mode 100644 index 000000000000..8037333b84e1 --- /dev/null +++ b/app/federation-v2/server/settings.ts @@ -0,0 +1,129 @@ +import yaml from 'js-yaml'; +import { Meteor } from 'meteor/meteor'; +import { SHA256 } from 'meteor/sha'; + +import { settings, settingsRegistry } from '../../settings/server'; +import { Settings } from '../../models/server/raw'; +import { setupLogger } from './logger'; + +Meteor.startup(async function () { + const uniqueId = await settings.get('uniqueID'); + const hsToken = SHA256(`hs_${uniqueId}`); + const asToken = SHA256(`as_${uniqueId}`); + + settingsRegistry.addGroup('FederationV2', function () { + this.add('FederationV2_enabled', false, { + readonly: false, + type: 'boolean', + i18nLabel: 'FederationV2_enabled', + i18nDescription: 'FederationV2_enabled_desc', + }); + + this.add('FederationV2_id', `rocketchat_${uniqueId}`, { + readonly: true, + type: 'string', + i18nLabel: 'FederationV2_id', + i18nDescription: 'FederationV2_id_desc', + }); + + this.add('FederationV2_hs_token', hsToken, { + readonly: true, + type: 'string', + i18nLabel: 'FederationV2_hs_token', + i18nDescription: 'FederationV2_hs_token_desc', + }); + + this.add('FederationV2_as_token', asToken, { + readonly: true, + type: 'string', + i18nLabel: 'FederationV2_as_token', + i18nDescription: 'FederationV2_as_token_desc', + }); + + this.add('FederationV2_homeserver_url', 'http://localhost:8008', { + type: 'string', + i18nLabel: 'FederationV2_homeserver_url', + i18nDescription: 'FederationV2_homeserver_url_desc', + }); + + this.add('FederationV2_homeserver_domain', 'local.rocket.chat', { + type: 'string', + i18nLabel: 'FederationV2_homeserver_domain', + i18nDescription: 'FederationV2_homeserver_domain_desc', + }); + + this.add('FederationV2_bridge_url', 'http://host.docker.internal:3300', { + type: 'string', + i18nLabel: 'FederationV2_bridge_url', + i18nDescription: 'FederationV2_bridge_url_desc', + }); + + this.add('FederationV2_bridge_localpart', 'rocket.cat', { + type: 'string', + i18nLabel: 'FederationV2_bridge_localpart', + i18nDescription: 'FederationV2_bridge_localpart_desc', + }); + + this.add('FederationV2_registration_file', '', { + readonly: true, + type: 'code', + i18nLabel: 'FederationV2_registration_file', + i18nDescription: 'FederationV2_registration_file_desc', + }); + }); +}); + +let registrationFile = {}; + +const updateRegistrationFile = async function (): Promise { + let bridgeUrl = (await Settings.getValueById('FederationV2_bridge_url')) as string; + + if (!bridgeUrl.includes(':')) { + bridgeUrl = `${bridgeUrl}:3300`; + } + + /* eslint-disable @typescript-eslint/camelcase */ + registrationFile = { + id: await Settings.getValueById('FederationV2_id'), + hs_token: await Settings.getValueById('FederationV2_hs_token'), + as_token: await Settings.getValueById('FederationV2_as_token'), + url: bridgeUrl, + sender_localpart: await Settings.getValueById('FederationV2_bridge_localpart'), + namespaces: { + users: { + exclusive: false, + regex: '.*', + }, + rooms: { + exclusive: false, + regex: '.*', + }, + aliases: { + exclusive: false, + regex: '.*', + }, + }, + }; + /* eslint-enable @typescript-eslint/camelcase */ + + // Update the registration file + await Settings.updateValueById('FederationV2_registration_file', yaml.dump(registrationFile)); +}; + +// Add settings listeners +settings.watch('FederationV2_enabled', (value) => { + setupLogger.info(`Federation V2 is ${value ? 'enabled' : 'disabled'}`); +}); + +settings.watchMultiple( + [ + 'FederationV2_id', + 'FederationV2_hs_token', + 'FederationV2_as_token', + 'FederationV2_homeserver_url', + 'FederationV2_homeserver_domain', + 'FederationV2_bridge_url', + 'FederationV2_bridge_localpart', + ], + updateRegistrationFile, +); diff --git a/app/federation-v2/server/tools.ts b/app/federation-v2/server/tools.ts new file mode 100644 index 000000000000..9cd442da3a73 --- /dev/null +++ b/app/federation-v2/server/tools.ts @@ -0,0 +1,3 @@ +import { settings } from '../../settings/server'; + +export const isFederationV2Enabled = () => settings.get('FederationV2_enabled'); diff --git a/app/lib/server/methods/sendMessage.js b/app/lib/server/methods/sendMessage.js index 5d62200d8a7d..35def73ae372 100644 --- a/app/lib/server/methods/sendMessage.js +++ b/app/lib/server/methods/sendMessage.js @@ -13,7 +13,7 @@ import { RateLimiter } from '../lib'; import { canSendMessage } from '../../../authorization/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; import { api } from '../../../../server/sdk/api'; -import { matrixClient } from '../../../federation-matrix/server/matrix-client'; +import { matrixClient } from '../../../federation-v2/server/matrix-client'; export function executeSendMessage(uid, message) { if (message.tshow && !message.tmid) { diff --git a/app/slashcommands-bridge/server/index.ts b/app/slashcommands-bridge/server/index.ts index 5f677b984fb8..eccc2d61955d 100644 --- a/app/slashcommands-bridge/server/index.ts +++ b/app/slashcommands-bridge/server/index.ts @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Match } from 'meteor/check'; import { slashCommands } from '../../utils/lib/slashCommand'; -import { matrixClient } from '../../federation-matrix/server/matrix-client'; +import { matrixClient } from '../../federation-v2/server/matrix-client'; function Bridge(_command: 'bridge', stringParams: string, item: Record): void { if (_command !== 'bridge' || !Match.test(stringParams, String)) { diff --git a/package-lock.json b/package-lock.json index 886fd89039de..a4fb73f33a3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9951,6 +9951,12 @@ "@types/sizzle": "*" } }, + "@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, "@types/jsdom": { "version": "16.2.12", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.12.tgz", @@ -39448,6 +39454,11 @@ } } }, + "yarn": { + "version": "1.22.18", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.18.tgz", + "integrity": "sha512-oFffv6Jp2+BTUBItzx1Z0dpikTX+raRdqupfqzeMKnoh7WD6RuPAxcqDkMUy9vafJkrB0YaV708znpuMhEBKGQ==" + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index cd2764cd4e88..0c1791673c08 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "@types/fibers": "^3.1.1", "@types/google-libphonenumber": "^7.4.21", "@types/imap": "^0.8.35", + "@types/js-yaml": "^4.0.5", "@types/jsdom": "^16.2.12", "@types/jsdom-global": "^3.0.2", "@types/jsrsasign": "^9.0.3", @@ -329,7 +330,8 @@ "xml-encryption": "0.11.2", "xml2js": "0.4.23", "xmldom": "^0.6.0", - "yaqrcode": "^0.2.1" + "yaqrcode": "^0.2.1", + "yarn": "^1.22.18" }, "meteor": { "mainModule": { diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 9ff0e01cfc6a..0ca66f6ddaef 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1945,6 +1945,15 @@ "FEDERATION_Test_Setup_Success": "Your federation setup is working and other servers can find you!", "FEDERATION_Unique_Id": "Unique ID", "FEDERATION_Unique_Id_Description": "This is your federation unique ID, used to identify your peer on the mesh.", + "FederationV2": "Federation V2", + "FederationV2_enabled": "Enabled", + "FederationV2_id": "AppService ID", + "FederationV2_hs_token": "Homeserver Token", + "FederationV2_as_token": "AppService Token", + "FederationV2_homeserver_url": "Homeserver URL", + "FederationV2_homeserver_domain": "Homeserver Domain", + "FederationV2_bridge_url": "Bridge URL", + "FederationV2_bridge_localpart": "AppService User Localpart", "Field": "Field", "Field_removed": "Field removed", "Field_required": "Field required", @@ -4956,4 +4965,4 @@ "onboarding.form.standaloneServerForm.servicesUnavailable": "Some of the services will be unavailable or will require manual setup", "onboarding.form.standaloneServerForm.publishOwnApp": "In order to send push notitications you need to compile and publish your own app to Google Play and App Store", "onboarding.form.standaloneServerForm.manuallyIntegrate": "Need to manually integrate with external services" -} \ No newline at end of file +} diff --git a/server/importPackages.ts b/server/importPackages.ts index 930f7e103e6e..44ff3394678b 100644 --- a/server/importPackages.ts +++ b/server/importPackages.ts @@ -23,7 +23,7 @@ import '../app/emoji-custom/server'; import '../app/emoji-emojione/server'; import '../app/error-handler'; import '../app/federation/server'; -import '../app/federation-matrix/server'; +import '../app/federation-v2/server'; import '../app/file'; import '../app/file-upload'; import '../app/github-enterprise/server'; From 63e6965a2e5864241a3a5bcd6e5286e7fb5cf1a9 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Mon, 4 Apr 2022 13:05:14 -0500 Subject: [PATCH 04/18] a few patches to get it working --- .../server/matrix-client/room.ts | 2 +- .../server/matrix-client/user.ts | 62 ++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/app/federation-matrix/server/matrix-client/room.ts b/app/federation-matrix/server/matrix-client/room.ts index 71b98d0e1ef2..57bc911dba49 100644 --- a/app/federation-matrix/server/matrix-client/room.ts +++ b/app/federation-matrix/server/matrix-client/room.ts @@ -42,7 +42,7 @@ export const create = async (user: IUser, room: IRoom): Promise => { console.log(`[${inviterId}-${invitedId}-${roomId}] Inviting user ${invitedId} to ${roomId}...`); + // Find the inviter user + let inviterUser = MatrixBridgedUser.getById(inviterId); + // Get the user + const user = await dataInterface.user(inviterId); + + // The inviters user doesn't yet exist in matrix + if (!inviterUser) { + console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote inviter user...`); + + // Create the missing user + inviterUser = await matrixClient.user.createRemote(user); + + console.log(`[${inviterId}-${invitedId}-${roomId}] Inviter user created as ${inviterUser.mui}...`); + } + // Find the bridged room id let matrixRoomId = await MatrixBridgedRoom.getMatrixId(roomId); @@ -33,21 +49,6 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin console.log(`[${inviterId}-${invitedId}-${roomId}] Remote room created as ${matrixRoomId}...`); } - // Find the inviter user - let inviterUser = MatrixBridgedUser.getById(inviterId); - - if (!inviterUser) { - console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote inviter user...`); - - // Get the user - const user = await dataInterface.user(inviterId); - - // Create the missing user - inviterUser = await matrixClient.user.createRemote(user); - - console.log(`[${inviterId}-${invitedId}-${roomId}] Inviter user created as ${inviterUser.mui}...`); - } - // Determine if the user is local or remote let invitedUserMatrixId = invitedId; const invitedUserDomain = invitedId.includes(':') ? invitedId.split(':').pop() : ''; @@ -55,15 +56,22 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin console.log(invitedUserMatrixId, invitedUserDomain, invitedUserIsRemote); + // Find the invited user in Rocket.Chats users + let invitedUser = Users.findOneByUsername(invitedId.replace('@', '')); + + if (!invitedUser) { + // Create the invited user + invitedUser = await matrixClient.user.createLocal(invitedUserMatrixId); + } + // If the invited user is not remote, let's ensure it exists remotely if (!invitedUserIsRemote) { console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote invited user...`); - // Find the invited user - const invitedUser = Users.findOneByUsername(invitedId.replace('@', '')); + let existingMatrixId = false; // Check if we already have a matrix id for that user - const existingMatrixId = MatrixBridgedUser.getMatrixId(invitedUser._id); + existingMatrixId = MatrixBridgedUser.getMatrixId(invitedUser._id); if (!existingMatrixId) { const { mui } = await matrixClient.user.createRemote(invitedUser); @@ -76,17 +84,25 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin console.log(`[${inviterId}-${invitedId}-${roomId}] Invited user created as ${invitedUserMatrixId}...`); } - console.log(`[${inviterId}-${invitedId}-${roomId}] Inviting the user...`); + console.log(`[${inviterId}-${invitedId}-${roomId}] Inviting the user to the room...`); - // Invite the user - await matrixBridge.getIntent(inviterUser.mui).invite(matrixRoomId, invitedUserMatrixId); - - // Auto-join if the user is Rocket.Chat controlled + // Invite && Auto-join if the user is Rocket.Chat controlled if (!invitedUserIsRemote) { + + // Invite the user to the room + await matrixBridge.getIntent(inviterUser.mui).invite(matrixRoomId, invitedUserMatrixId); + console.log(`[${inviterId}-${invitedId}-${roomId}] Auto-join room...`); await matrixBridge.getIntent(invitedUserMatrixId).join(matrixRoomId); + } else { + // Invite the user to the room + matrixBridge.getIntent(inviterUser.mui).invite(matrixRoomId, invitedUserMatrixId); } + + // Add the matrix user to the invited room + addUserToRoom(roomId, invitedUser, user, false); + }; export const createRemote = async (u: IUser): Promise => { From 1cc421957cfad3741d56d1d27775deb488a9712a Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Wed, 6 Apr 2022 13:41:50 -0300 Subject: [PATCH 05/18] importing settings --- app/federation-v2/server/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/federation-v2/server/index.ts b/app/federation-v2/server/index.ts index cedc975b9139..049192308677 100644 --- a/app/federation-v2/server/index.ts +++ b/app/federation-v2/server/index.ts @@ -1,6 +1,7 @@ import { matrixBridge } from './bridge'; import { bridgeUrlTuple, config } from './config'; import { bridgeLogger } from './logger'; +import './settings'; ((): void => { if (!matrixBridge) return; From ffd9fce85f5b07d29106a6aae96783e7d44a17d9 Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Wed, 6 Apr 2022 14:09:22 -0300 Subject: [PATCH 06/18] fixing automatic generation for yaml file --- app/federation-v2/server/settings.ts | 30 +++++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/federation-v2/server/settings.ts b/app/federation-v2/server/settings.ts index 8037333b84e1..80bab3b8fba1 100644 --- a/app/federation-v2/server/settings.ts +++ b/app/federation-v2/server/settings.ts @@ -90,18 +90,24 @@ const updateRegistrationFile = async function (): Promise { url: bridgeUrl, sender_localpart: await Settings.getValueById('FederationV2_bridge_localpart'), namespaces: { - users: { - exclusive: false, - regex: '.*', - }, - rooms: { - exclusive: false, - regex: '.*', - }, - aliases: { - exclusive: false, - regex: '.*', - }, + users: [ + { + exclusive: false, + regex: '.*', + }, + ], + rooms: [ + { + exclusive: false, + regex: '.*', + }, + ], + aliases: [ + { + exclusive: false, + regex: '.*', + }, + ], }, }; /* eslint-enable @typescript-eslint/camelcase */ From 0eedbea9588afc94bf490e65c0f7cbac63aa1fad Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Thu, 7 Apr 2022 11:46:42 -0300 Subject: [PATCH 07/18] fixing config --- app/federation-v2/server/config.ts | 4 ++-- app/federation-v2/server/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/federation-v2/server/config.ts b/app/federation-v2/server/config.ts index e461984fb7a2..4fed417b4843 100644 --- a/app/federation-v2/server/config.ts +++ b/app/federation-v2/server/config.ts @@ -1,7 +1,7 @@ import { settings } from '../../settings/server'; -type bridgeUrlString = `${string}:${string}`; -export type bridgeUrlTuple = [string, number]; +type bridgeUrlString = `${string}://${string}:${string}`; +export type bridgeUrlTuple = [string, string, number]; interface IBridgeConfig { id: string; diff --git a/app/federation-v2/server/index.ts b/app/federation-v2/server/index.ts index 049192308677..19cb8d461a69 100644 --- a/app/federation-v2/server/index.ts +++ b/app/federation-v2/server/index.ts @@ -13,7 +13,7 @@ import './settings'; homeserverDomain: ${config.homeserverDomain} `); - const [, port] = config.bridgeUrl.split(':') as bridgeUrlTuple; + const [, , port] = config.bridgeUrl.split(':') as bridgeUrlTuple; matrixBridge?.run(port); })(); From 2fc10e12013d7411e182f259470305dd830c14ad Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Thu, 7 Apr 2022 14:29:20 -0300 Subject: [PATCH 08/18] fix: fix wrong reference --- app/federation-v2/server/matrix-client/user.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/federation-v2/server/matrix-client/user.ts b/app/federation-v2/server/matrix-client/user.ts index 2c1476cac412..6f78077aa5e8 100644 --- a/app/federation-v2/server/matrix-client/user.ts +++ b/app/federation-v2/server/matrix-client/user.ts @@ -52,7 +52,7 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin // Determine if the user is local or remote let invitedUserMatrixId = invitedId; const invitedUserDomain = invitedId.includes(':') ? invitedId.split(':').pop() : ''; - const invitedUserIsRemote = invitedUserDomain && invitedUserDomain !== getConfig().homeserverDomain; + const invitedUserIsRemote = invitedUserDomain && invitedUserDomain !== config.homeserverDomain; console.log(invitedUserMatrixId, invitedUserDomain, invitedUserIsRemote); @@ -106,7 +106,7 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin }; export const createRemote = async (u: IUser): Promise => { - const matrixUserId = `@${u.username?.toLowerCase()}:${getConfig().homeserverDomain}`; + const matrixUserId = `@${u.username?.toLowerCase()}:${config.homeserverDomain}`; console.log(`Creating remote user ${matrixUserId}...`); From cb9801bd4cd3f0d11db1ee4bf9de80ade6e46dd8 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Thu, 7 Apr 2022 17:18:05 -0300 Subject: [PATCH 09/18] fix: fix prettier and lint --- app/federation-v2/server/matrix-client/room.ts | 2 +- app/federation-v2/server/matrix-client/user.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/federation-v2/server/matrix-client/room.ts b/app/federation-v2/server/matrix-client/room.ts index d6ef1d19eed5..ef8ce92d427f 100644 --- a/app/federation-v2/server/matrix-client/room.ts +++ b/app/federation-v2/server/matrix-client/room.ts @@ -42,7 +42,7 @@ export const create = async (user: IUser, room: IRoom): Promise => { From 5ee790bf1c8b9d5e7e22ba9b7b0015d941d12ad0 Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Tue, 12 Apr 2022 09:42:49 -0300 Subject: [PATCH 10/18] better bridge setup --- app/federation-v2/server/bridge.ts | 111 ++++++++---------- app/federation-v2/server/index.ts | 5 +- .../server/matrix-client/user.ts | 6 +- app/federation-v2/server/tools.ts | 3 +- 4 files changed, 57 insertions(+), 68 deletions(-) diff --git a/app/federation-v2/server/bridge.ts b/app/federation-v2/server/bridge.ts index 984da71803e9..e1782aa8e051 100644 --- a/app/federation-v2/server/bridge.ts +++ b/app/federation-v2/server/bridge.ts @@ -3,70 +3,61 @@ import { Bridge, AppServiceRegistration } from 'matrix-appservice-bridge'; import { IMatrixEvent } from './definitions/IMatrixEvent'; import { MatrixEventType } from './definitions/MatrixEventType'; import { addToQueue } from './queue'; -import { isFederationV2Enabled } from './tools'; import { settings } from '../../settings/server'; -let bridge; - -((): void => { - if (!isFederationV2Enabled()) return; - - /* eslint-disable @typescript-eslint/camelcase */ - const registrationConfig = AppServiceRegistration.fromObject({ - id: settings.get('FederationV2_id') as string, - hs_token: settings.get('FederationV2_hs_token') as string, - as_token: settings.get('FederationV2_as_token') as string, - url: settings.get('FederationV2_bridge_url') as string, - sender_localpart: settings.get('FederationV2_bridge_localpart') as string, - namespaces: { - users: [ - { - exclusive: false, - // Reserve these MXID's (usernames) - regex: `.*`, - }, - ], - aliases: [ - { - exclusive: false, - // Reserve these room aliases - regex: `.*`, - }, - ], - rooms: [ - { - exclusive: false, - // This regex is used to define which rooms we listen to with the bridge. - // This does not reserve the rooms like the other namespaces. - regex: '.*', - }, - ], - }, - rate_limited: false, - protocols: null, - }); - /* eslint-enable @typescript-eslint/camelcase */ - - bridge = new Bridge({ - homeserverUrl: settings.get('FederationV2_homeserver_url') as string, - domain: settings.get('FederationV2_homeserver_domain') as string, - registration: registrationConfig, - disableStores: true, - controller: { - onAliasQuery: (alias, matrixRoomId): void => { - console.log('onAliasQuery', alias, matrixRoomId); +/* eslint-disable @typescript-eslint/camelcase */ +const registrationConfig = AppServiceRegistration.fromObject({ + id: settings.get('FederationV2_id') as string, + hs_token: settings.get('FederationV2_hs_token') as string, + as_token: settings.get('FederationV2_as_token') as string, + url: settings.get('FederationV2_bridge_url') as string, + sender_localpart: settings.get('FederationV2_bridge_localpart') as string, + namespaces: { + users: [ + { + exclusive: false, + // Reserve these MXID's (usernames) + regex: `.*`, }, - onEvent: async (request /* , context*/): Promise => { - // Get the event - const event = request.getData() as unknown as IMatrixEvent; - - addToQueue(event); + ], + aliases: [ + { + exclusive: false, + // Reserve these room aliases + regex: `.*`, }, - onLog: async (line, isError): Promise => { - console.log(line, isError); + ], + rooms: [ + { + exclusive: false, + // This regex is used to define which rooms we listen to with the bridge. + // This does not reserve the rooms like the other namespaces. + regex: '.*', }, + ], + }, + rate_limited: false, + protocols: null, +}); +/* eslint-enable @typescript-eslint/camelcase */ + +export const matrixBridge = new Bridge({ + homeserverUrl: settings.get('FederationV2_homeserver_url') as string, + domain: settings.get('FederationV2_homeserver_domain') as string, + registration: registrationConfig, + disableStores: true, + controller: { + onAliasQuery: (alias, matrixRoomId): void => { + console.log('onAliasQuery', alias, matrixRoomId); }, - }); -})(); + onEvent: async (request /* , context*/): Promise => { + // Get the event + const event = request.getData() as unknown as IMatrixEvent; -export const matrixBridge = bridge; + addToQueue(event); + }, + onLog: async (line, isError): Promise => { + console.log(line, isError); + }, + }, +}); diff --git a/app/federation-v2/server/index.ts b/app/federation-v2/server/index.ts index 19cb8d461a69..fe7f555a129e 100644 --- a/app/federation-v2/server/index.ts +++ b/app/federation-v2/server/index.ts @@ -2,9 +2,10 @@ import { matrixBridge } from './bridge'; import { bridgeUrlTuple, config } from './config'; import { bridgeLogger } from './logger'; import './settings'; +import { isFederationV2Enabled } from './tools'; ((): void => { - if (!matrixBridge) return; + if (!isFederationV2Enabled()) return; bridgeLogger.info(`Running Federation V2: id: ${config.id} @@ -15,5 +16,5 @@ import './settings'; const [, , port] = config.bridgeUrl.split(':') as bridgeUrlTuple; - matrixBridge?.run(port); + matrixBridge.run(port); })(); diff --git a/app/federation-v2/server/matrix-client/user.ts b/app/federation-v2/server/matrix-client/user.ts index 534add667a43..283170f21074 100644 --- a/app/federation-v2/server/matrix-client/user.ts +++ b/app/federation-v2/server/matrix-client/user.ts @@ -54,8 +54,6 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin const invitedUserDomain = invitedId.includes(':') ? invitedId.split(':').pop() : ''; const invitedUserIsRemote = invitedUserDomain && invitedUserDomain !== config.homeserverDomain; - console.log(invitedUserMatrixId, invitedUserDomain, invitedUserIsRemote); - // Find the invited user in Rocket.Chats users let invitedUser = Users.findOneByUsername(invitedId.replace('@', '')); @@ -68,10 +66,8 @@ export const invite = async (inviterId: string, roomId: string, invitedId: strin if (!invitedUserIsRemote) { console.log(`[${inviterId}-${invitedId}-${roomId}] Creating remote invited user...`); - let existingMatrixId = false; - // Check if we already have a matrix id for that user - existingMatrixId = MatrixBridgedUser.getMatrixId(invitedUser._id); + const existingMatrixId = MatrixBridgedUser.getMatrixId(invitedUser._id); if (!existingMatrixId) { const { mui } = await matrixClient.user.createRemote(invitedUser); diff --git a/app/federation-v2/server/tools.ts b/app/federation-v2/server/tools.ts index 9cd442da3a73..4250aede971e 100644 --- a/app/federation-v2/server/tools.ts +++ b/app/federation-v2/server/tools.ts @@ -1,3 +1,4 @@ import { settings } from '../../settings/server'; +import { matrixBridge } from './bridge'; -export const isFederationV2Enabled = () => settings.get('FederationV2_enabled'); +export const isFederationV2Enabled = () => settings.get('FederationV2_enabled') && matrixBridge; From 872f07e010461a8251113f10a8db70a5aecd2080 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Wed, 20 Apr 2022 18:54:23 -0500 Subject: [PATCH 11/18] clarify comment --- apps/meteor/app/lib/client/methods/sendMessage.js | 2 +- apps/meteor/app/lib/server/methods/sendMessage.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/meteor/app/lib/client/methods/sendMessage.js b/apps/meteor/app/lib/client/methods/sendMessage.js index dd81f9db359d..8dfafeeb5f94 100644 --- a/apps/meteor/app/lib/client/methods/sendMessage.js +++ b/apps/meteor/app/lib/client/methods/sendMessage.js @@ -32,7 +32,7 @@ Meteor.methods({ message.unread = true; } - // If the room is bridged, send the message to Synapse only + // If the room is bridged, send the message to matrix only const { bridged } = Rooms.findOne({ _id: message.rid }, { fields: { bridged: 1 } }); if (bridged) { return; diff --git a/apps/meteor/app/lib/server/methods/sendMessage.js b/apps/meteor/app/lib/server/methods/sendMessage.js index 35def73ae372..91e223322b36 100644 --- a/apps/meteor/app/lib/server/methods/sendMessage.js +++ b/apps/meteor/app/lib/server/methods/sendMessage.js @@ -106,7 +106,7 @@ Meteor.methods({ } try { - // If the room is bridged, send the message to Synapse only + // If the room is bridged, send the message to matrix only const { bridged } = Rooms.findOne({ _id: message.rid }, { fields: { bridged: 1 } }); if (bridged) { return matrixClient.message.send({ ...message, u: { _id: uid } }); From 42103002016f275a69b9a1d47e880100b7392d87 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 11:19:51 -0500 Subject: [PATCH 12/18] revised yarn lock with the matrix-bridge dependency --- yarn.lock | 627 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 592 insertions(+), 35 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9ea1ee76f4a5..268c9cde0f42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 6 cacheKey: 8 +"@alloc/quick-lru@npm:^5.2.0": + version: 5.2.0 + resolution: "@alloc/quick-lru@npm:5.2.0" + checksum: bdc35758b552bcf045733ac047fb7f9a07c4678b944c641adfbd41f798b4b91fffd0fdc0df2578d9b0afc7b4d636aa6e110ead5d6281a2adc1ab90efd7f057f8 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.1.0": version: 2.1.2 resolution: "@ampproject/remapping@npm:2.1.2" @@ -1770,6 +1777,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + "@cspotcode/source-map-consumer@npm:0.8.0": version: 0.8.0 resolution: "@cspotcode/source-map-consumer@npm:0.8.0" @@ -1822,6 +1836,17 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -2489,6 +2514,15 @@ __metadata: languageName: node linkType: hard +"@napi-rs/cli@npm:^2.2.0": + version: 2.6.2 + resolution: "@napi-rs/cli@npm:2.6.2" + bin: + napi: scripts/index.js + checksum: 3cc260aabbdb19f6354f7b24e423ce75f981b9ab4db9d7f0c5110791c72872fc24e8a16b5ac33bf3e9511a9e992dce46becd813155164d07fbe53601d27d775d + languageName: node + linkType: hard + "@napi-rs/pinyin-android-arm-eabi@npm:1.7.0": version: 1.7.0 resolution: "@napi-rs/pinyin-android-arm-eabi@npm:1.7.0" @@ -3747,6 +3781,7 @@ __metadata: "@types/fibers": ^3.1.1 "@types/google-libphonenumber": ^7.4.21 "@types/imap": ^0.8.35 + "@types/js-yaml": ^4.0.5 "@types/jsdom": ^16.2.12 "@types/jsdom-global": ^3.0.2 "@types/jsrsasign": ^9.0.3 @@ -3845,6 +3880,7 @@ __metadata: express: ^4.17.1 express-rate-limit: ^5.2.6 fast-glob: ^3.2.5 + fastq: ^1.13.0 fflate: ^0.7.1 fibers: ^5.0.1 file-type: ^10.11.0 @@ -3882,6 +3918,7 @@ __metadata: lodash.get: ^4.4.2 mailparser: ^3.4.0 marked: ^0.7.0 + matrix-appservice-bridge: ^3.2.0 mem: ^8.1.1 meteor-node-stubs: ^1.1.0 mime-db: ^1.48.0 @@ -5452,6 +5489,16 @@ __metadata: languageName: node linkType: hard +"@turt2live/matrix-sdk-crypto-nodejs@npm:^0.1.0-beta.10": + version: 0.1.0-beta.10 + resolution: "@turt2live/matrix-sdk-crypto-nodejs@npm:0.1.0-beta.10" + dependencies: + "@napi-rs/cli": ^2.2.0 + shelljs: ^0.8.4 + checksum: 0cd6d7237cbac5366c39ebe8c69619b467ab253067c48d5bfd7020895caf1afb290a917e03a0ee62c57307cd0f8c656590d9a9ce9b289ad1b7eb3f1cb89389cb + languageName: node + linkType: hard + "@types/adm-zip@npm:^0.4.34": version: 0.4.34 resolution: "@types/adm-zip@npm:0.4.34" @@ -5720,7 +5767,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.12, @types/express@npm:^4.17.13": +"@types/express@npm:*, @types/express@npm:^4.17.12, @types/express@npm:^4.17.13, @types/express@npm:^4.17.8": version: 4.17.13 resolution: "@types/express@npm:4.17.13" dependencies: @@ -5868,6 +5915,13 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4.0.5": + version: 4.0.5 + resolution: "@types/js-yaml@npm:4.0.5" + checksum: 7dcac8c50fec31643cc9d6444b5503239a861414cdfaa7ae9a38bc22597c4d850c4b8cec3d82d73b3fbca408348ce223b0408d598b32e094470dfffc6d486b4d + languageName: node + linkType: hard + "@types/jsdom-global@npm:^3.0.2": version: 3.0.2 resolution: "@types/jsdom-global@npm:3.0.2" @@ -7356,6 +7410,13 @@ __metadata: languageName: node linkType: hard +"another-json@npm:^0.2.0": + version: 0.2.0 + resolution: "another-json@npm:0.2.0" + checksum: b1d27bd5d7a35364ff2e8eb66e65ef9a53f3ab84f7a4ae38495bf14ba0b346654f107487b4f2f247dbe6a22a8fb4ca2a94330738176516b78494e641fce05178 + languageName: node + linkType: hard + "ansi-align@npm:^3.0.0": version: 3.0.1 resolution: "ansi-align@npm:3.0.1" @@ -7923,6 +7984,13 @@ __metadata: languageName: node linkType: hard +"async@npm:0.2.10": + version: 0.2.10 + resolution: "async@npm:0.2.10" + checksum: 9ea83419ba67dc4ecf42d4eb0d93ce0ac80a67cabb612f160ed096aef5d001e3184ec9e9be5d4dc39b2c51a34e2ae16f9b21d737068b0f615fccb4eea16d0138 + languageName: node + linkType: hard + "async@npm:2.6.0": version: 2.6.0 resolution: "async@npm:2.6.0" @@ -7941,7 +8009,7 @@ __metadata: languageName: node linkType: hard -"async@npm:^3.2.0, async@npm:~3.2.0": +"async@npm:^3.2.0, async@npm:^3.2.3, async@npm:~3.2.0": version: 3.2.3 resolution: "async@npm:3.2.3" checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1 @@ -8451,6 +8519,15 @@ __metadata: languageName: node linkType: hard +"basic-auth@npm:~2.0.1": + version: 2.0.1 + resolution: "basic-auth@npm:2.0.1" + dependencies: + safe-buffer: 5.1.2 + checksum: 3419b805d5dfc518f3a05dcf42aa53aa9ce820e50b6df5097f9e186322e1bc733c36722b624802cd37e791035aa73b828ed814d8362333d42d7f5cd04d7a5e48 + languageName: node + linkType: hard + "batch-processor@npm:1.0.0": version: 1.0.0 resolution: "batch-processor@npm:1.0.0" @@ -8535,6 +8612,15 @@ __metadata: languageName: node linkType: hard +"binary-search-tree@npm:0.2.5": + version: 0.2.5 + resolution: "binary-search-tree@npm:0.2.5" + dependencies: + underscore: ~1.4.4 + checksum: 04d2fbdce33ecbaafab9cd58ea286ecbadbc4ead0262bc0489a7d1a1eeef03109fd17f16a5de92b7113c08f31ac0083ab86b283a961b661d4f5f0d7e81d88586 + languageName: node + linkType: hard + "bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -8697,7 +8783,7 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:^3.1.5, bluebird@npm:^3.3.5, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": +"bluebird@npm:^3.1.5, bluebird@npm:^3.3.5, bluebird@npm:^3.5.0, bluebird@npm:^3.5.5, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef @@ -8743,7 +8829,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:^1.20.0": +"body-parser@npm:^1.19.0, body-parser@npm:^1.20.0": version: 1.20.0 resolution: "body-parser@npm:1.20.0" dependencies: @@ -8880,6 +8966,13 @@ __metadata: languageName: node linkType: hard +"browser-request@npm:^0.3.3": + version: 0.3.3 + resolution: "browser-request@npm:0.3.3" + checksum: 8f8db4f95aa33341ffa8d83dd069033310144f439d90bf5aafd4ec0a9495f4cc3fc1515a7d3e15d6968552169f72b7dd90b62efa3647adc4ce9e8be91f907240 + languageName: node + linkType: hard + "browser-stdout@npm:1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" @@ -8984,7 +9077,7 @@ __metadata: languageName: node linkType: hard -"bs58@npm:^4.0.0": +"bs58@npm:^4.0.0, bs58@npm:^4.0.1": version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: @@ -9504,7 +9597,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": +"chalk@npm:^4, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -10008,7 +10101,7 @@ __metadata: languageName: node linkType: hard -"color-string@npm:^1.9.0": +"color-string@npm:^1.6.0, color-string@npm:^1.9.0": version: 1.9.0 resolution: "color-string@npm:1.9.0" dependencies: @@ -10027,6 +10120,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + "color@npm:^4.0.1": version: 4.2.3 resolution: "color@npm:4.2.3" @@ -10058,6 +10161,16 @@ __metadata: languageName: node linkType: hard +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.5, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -10285,7 +10398,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:^1.0.4, content-type@npm:~1.0.4": version: 1.0.4 resolution: "content-type@npm:1.0.4" checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 @@ -11416,7 +11529,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -12049,6 +12162,13 @@ __metadata: languageName: node linkType: hard +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -12806,7 +12926,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.7": +"eventemitter3@npm:^4.0.4, eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -12985,7 +13105,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.3": +"express@npm:^4.17.1, express@npm:^4.17.2, express@npm:^4.17.3": version: 4.17.3 resolution: "express@npm:4.17.3" dependencies: @@ -13229,7 +13349,7 @@ __metadata: languageName: node linkType: hard -"fastq@npm:^1.6.0": +"fastq@npm:^1.13.0, fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" dependencies: @@ -13287,6 +13407,13 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + "fflate@npm:^0.7.1": version: 0.7.3 resolution: "fflate@npm:0.7.3" @@ -13349,6 +13476,15 @@ __metadata: languageName: node linkType: hard +"file-stream-rotator@npm:^0.6.1": + version: 0.6.1 + resolution: "file-stream-rotator@npm:0.6.1" + dependencies: + moment: ^2.29.1 + checksum: ebdf6a9e7ca886a50f4dafb2284d4569cefd5bdf4e4451ead25f4d68b7f9776b2620a3d110d534edd40935d1e17f37d818e2129303201870ff89c71b19b49ac1 + languageName: node + linkType: hard + "file-system-cache@npm:^1.0.5": version: 1.0.5 resolution: "file-system-cache@npm:1.0.5" @@ -13584,6 +13720,13 @@ __metadata: languageName: node linkType: hard +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + "focus-visible@npm:^5.2.0": version: 5.2.0 resolution: "focus-visible@npm:5.2.0" @@ -14098,6 +14241,24 @@ __metadata: languageName: node linkType: hard +"generate-function@npm:^2.0.0": + version: 2.3.1 + resolution: "generate-function@npm:2.3.1" + dependencies: + is-property: ^1.0.2 + checksum: 652f083de206ead2bae4caf9c7eeb465e8d98c0b8ed2a29c6afc538cef0785b5c6eea10548f1e13cc586d3afd796c13c830c2cb3dc612ec2457b2aadda5f57c9 + languageName: node + linkType: hard + +"generate-object-property@npm:^1.1.0": + version: 1.2.0 + resolution: "generate-object-property@npm:1.2.0" + dependencies: + is-property: ^1.0.0 + checksum: 5141ca5fd545f0aabd24fd13f9f3ecf9cfea2255db00d46e282d65141d691d560c70b6361c3c0c4982f86f600361925bfd4773e0350c66d0210e6129ae553a09 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.1, gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -14327,7 +14488,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.2.0, glob@npm:^7.0.3, glob@npm:^7.0.5, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": +"glob@npm:7.2.0, glob@npm:^7.0.0, glob@npm:^7.0.3, glob@npm:^7.0.5, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.0 resolution: "glob@npm:7.2.0" dependencies: @@ -14624,7 +14785,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da @@ -14850,7 +15011,7 @@ __metadata: languageName: node linkType: hard -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": version: 1.1.7 resolution: "hash.js@npm:1.1.7" dependencies: @@ -15178,6 +15339,22 @@ __metadata: languageName: node linkType: hard +"html-to-text@npm:^8.1.0": + version: 8.2.0 + resolution: "html-to-text@npm:8.2.0" + dependencies: + "@selderee/plugin-htmlparser2": ^0.6.0 + deepmerge: ^4.2.2 + he: ^1.2.0 + htmlparser2: ^6.1.0 + minimist: ^1.2.6 + selderee: ^0.6.0 + bin: + html-to-text: bin/cli.js + checksum: 98df25eb6963cc5ac2de52a9b3e1c7f1ac156bfd5d0134e8b4356c980c6c0ecf671e1490f331d1af56b610d707904b45f88033a38577b7d25702f2188c462765 + languageName: node + linkType: hard + "html-void-elements@npm:^1.0.0": version: 1.0.5 resolution: "html-void-elements@npm:1.0.5" @@ -15204,6 +15381,13 @@ __metadata: languageName: node linkType: hard +"htmlencode@npm:^0.0.4": + version: 0.0.4 + resolution: "htmlencode@npm:0.0.4" + checksum: b5c5a280213569f59807d22ae2d68c77360f6337b6936cdfa4e2aeaa12e3a69bb36b426ad18ed9333a7fb3f7d55c14ea3b46040d3271af7a586f262aaf4092ad + languageName: node + linkType: hard + "htmlparser2@npm:^3.10.0, htmlparser2@npm:^3.9.1": version: 3.10.1 resolution: "htmlparser2@npm:3.10.1" @@ -15230,7 +15414,7 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^6.1.0": +"htmlparser2@npm:^6.0.0, htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" dependencies: @@ -15727,6 +15911,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 + languageName: node + linkType: hard + "interpret@npm:^2.2.0": version: 2.2.0 resolution: "interpret@npm:2.2.0" @@ -16121,6 +16312,26 @@ __metadata: languageName: node linkType: hard +"is-my-ip-valid@npm:^1.0.0": + version: 1.0.1 + resolution: "is-my-ip-valid@npm:1.0.1" + checksum: 0a50180a9c0842503a2199ca0ba03888069e7c093f71236c65632e9b0f496ea57536856e1ad3d1635010cb5959c551496ea84cfc56088a8e7879fe30b9d71943 + languageName: node + linkType: hard + +"is-my-json-valid@npm:^2.20.5": + version: 2.20.6 + resolution: "is-my-json-valid@npm:2.20.6" + dependencies: + generate-function: ^2.0.0 + generate-object-property: ^1.1.0 + is-my-ip-valid: ^1.0.0 + jsonpointer: ^5.0.0 + xtend: ^4.0.0 + checksum: d3519e18e6a0f4c777d5a2027b5c80d05abd0949179b94795bd2aa6c54e8f44c23b8789cb7d44332015b86cfd73dca57331e7fa53202b28e40aa4620e7f61166 + languageName: node + linkType: hard + "is-nan@npm:^1.2.1": version: 1.3.2 resolution: "is-nan@npm:1.3.2" @@ -16198,7 +16409,7 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:5.0.0": +"is-plain-object@npm:5.0.0, is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c @@ -16221,6 +16432,20 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^2.1.0": + version: 2.2.2 + resolution: "is-promise@npm:2.2.2" + checksum: 18bf7d1c59953e0ad82a1ed963fb3dc0d135c8f299a14f89a17af312fc918373136e56028e8831700e1933519630cc2fd4179a777030330fde20d34e96f40c78 + languageName: node + linkType: hard + +"is-property@npm:^1.0.0, is-property@npm:^1.0.2": + version: 1.0.2 + resolution: "is-property@npm:1.0.2" + checksum: 33b661a3690bcc88f7e47bb0a21b9e3187e76a317541ea7ec5e8096d954f441b77a46d8930c785f7fbf4ef8dfd624c25495221e026e50f74c9048fe501773be5 + languageName: node + linkType: hard + "is-regex@npm:^1.1.2, is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -17182,7 +17407,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -17467,6 +17692,13 @@ __metadata: languageName: node linkType: hard +"jsonpointer@npm:^5.0.0": + version: 5.0.0 + resolution: "jsonpointer@npm:5.0.0" + checksum: c7ec0b6bb596b81de687bc12945586bbcdc80dfb54919656d2690d76334f796a936270067ee9f1b5bbc2d9ecc551afb366ac35e6685aa61f07b5b68d1e5e857d + languageName: node + linkType: hard + "jsontokens@npm:^2.0.2": version: 2.0.2 resolution: "jsontokens@npm:2.0.2" @@ -17699,6 +17931,13 @@ __metadata: languageName: node linkType: hard +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + "lamejs@git+https://github.com/zhuker/lamejs.git": version: 1.2.1 resolution: "lamejs@https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" @@ -18020,7 +18259,7 @@ __metadata: languageName: node linkType: hard -"localforage@npm:^1.9.0": +"localforage@npm:^1.3.0, localforage@npm:^1.9.0": version: 1.10.0 resolution: "localforage@npm:1.10.0" dependencies: @@ -18305,6 +18544,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:4, lodash@npm:^4.14.0, lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "lodash@npm:^3.2.0": version: 3.10.1 resolution: "lodash@npm:3.10.1" @@ -18312,13 +18558,6 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.14.0, lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - "log-driver@npm:^1.2.7": version: 1.2.7 resolution: "log-driver@npm:1.2.7" @@ -18348,6 +18587,26 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.3.2, logform@npm:^2.4.0": + version: 2.4.0 + resolution: "logform@npm:2.4.0" + dependencies: + "@colors/colors": 1.5.0 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: e75ccccc1a2664612ade3c7f3d3185787198b4028e54ea2795df87901f28b3881eddd8d7e73ce03f4420dca638a1cbe6d42254179685ab2075e4ac38a71ffb6c + languageName: node + linkType: hard + +"loglevel@npm:^1.7.1": + version: 1.8.0 + resolution: "loglevel@npm:1.8.0" + checksum: 41aeea17de24aba8dba68084a31fe9189648bce4f39c1277e021bb276c3c53a75b0d337395919cf271068ad40ecefabad0e4fdeb4a8f11908beee532b898f4a7 + languageName: node + linkType: hard + "long@npm:^2.4.0": version: 2.4.0 resolution: "long@npm:2.4.0" @@ -18396,6 +18655,19 @@ __metadata: languageName: node linkType: hard +"lowdb@npm:^1": + version: 1.0.0 + resolution: "lowdb@npm:1.0.0" + dependencies: + graceful-fs: ^4.1.3 + is-promise: ^2.1.0 + lodash: 4 + pify: ^3.0.0 + steno: ^0.4.1 + checksum: 7ae89e3d6e00963129f72c4d4e1fe8e4cda5c08a46b4f4e525109483147e799df90c07d95aeced1c270cc10f4a24c6660fe1601cc4b3a6e2c3f922ad64517eab + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -18658,6 +18930,83 @@ __metadata: languageName: node linkType: hard +"matrix-appservice-bridge@npm:^3.2.0": + version: 3.2.0 + resolution: "matrix-appservice-bridge@npm:3.2.0" + dependencies: + "@alloc/quick-lru": ^5.2.0 + chalk: ^4.1.0 + extend: ^3.0.2 + is-my-json-valid: ^2.20.5 + js-yaml: ^4.0.0 + matrix-appservice: ^0.10.0 + matrix-bot-sdk: ^0.6.0-beta.2 + matrix-js-sdk: ^12.4.1 + nedb: ^1.8.0 + nopt: ^5.0.0 + p-queue: ^6.6.2 + prom-client: ^14.0.0 + winston: ^3.3.3 + winston-daily-rotate-file: ^4.5.1 + checksum: c5209600008c7e4c3c556b3762b2df9c15b7631ba528dbe3d72bc420086424a3d552e2b9b7c5447607e6e71ad8c20e2531280789139867819657f4061bdbde57 + languageName: node + linkType: hard + +"matrix-appservice@npm:^0.10.0": + version: 0.10.0 + resolution: "matrix-appservice@npm:0.10.0" + dependencies: + "@types/express": ^4.17.8 + body-parser: ^1.19.0 + express: ^4.17.1 + js-yaml: ^4.1.0 + morgan: ^1.10.0 + checksum: 09eac24253744dd257f5529666bd02aa2b8cd655410ed4a008eb709d229a65f2bc3e23078af229da3509e13d918bbb0919e02ccb1b8a0ca4281ed1e2956feb25 + languageName: node + linkType: hard + +"matrix-bot-sdk@npm:^0.6.0-beta.2": + version: 0.6.0-beta.7 + resolution: "matrix-bot-sdk@npm:0.6.0-beta.7" + dependencies: + "@turt2live/matrix-sdk-crypto-nodejs": ^0.1.0-beta.10 + "@types/express": ^4.17.13 + another-json: ^0.2.0 + chalk: ^4 + express: ^4.17.2 + glob-to-regexp: ^0.4.1 + hash.js: ^1.1.7 + html-to-text: ^8.1.0 + htmlencode: ^0.0.4 + lowdb: ^1 + lru-cache: ^6.0.0 + mkdirp: ^1.0.4 + morgan: ^1.10.0 + request: ^2.88.2 + request-promise: ^4.2.6 + sanitize-html: ^2.6.1 + checksum: 12f5a03f26a8c70ba5b95fbc6feb811586d36730870bcbb3471513c11f17f2c5ec475ce387377f2924e4114217b1b1810a7f58d13b085f02081f957c91e7b44d + languageName: node + linkType: hard + +"matrix-js-sdk@npm:^12.4.1": + version: 12.5.0 + resolution: "matrix-js-sdk@npm:12.5.0" + dependencies: + "@babel/runtime": ^7.12.5 + another-json: ^0.2.0 + browser-request: ^0.3.3 + bs58: ^4.0.1 + content-type: ^1.0.4 + loglevel: ^1.7.1 + p-retry: ^4.5.0 + qs: ^6.9.6 + request: ^2.88.2 + unhomoglyph: ^1.0.6 + checksum: 31caa2a539f293ba277e85b998320f9d2cd391e0ac4d2499a99a84dad7ff569e3ae83fbd1869675b6cca67a62ac1471d3814b5da63cfce688be1ff1bb3f420e9 + languageName: node + linkType: hard + "md5-file@npm:^5.0.0": version: 5.0.0 resolution: "md5-file@npm:5.0.0" @@ -19385,7 +19734,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.5": +"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -19677,6 +20026,19 @@ __metadata: languageName: node linkType: hard +"morgan@npm:^1.10.0": + version: 1.10.0 + resolution: "morgan@npm:1.10.0" + dependencies: + basic-auth: ~2.0.1 + debug: 2.6.9 + depd: ~2.0.0 + on-finished: ~2.3.0 + on-headers: ~1.0.2 + checksum: fb41e226ab5a1abf7e8909e486b387076534716d60207e361acfb5df78b84d703a7b7ea58f3046a9fd0b83d3c94bfabde32323341a1f1b26ce50680abd2ea5dd + languageName: node + linkType: hard + "move-concurrently@npm:^1.0.1": version: 1.0.1 resolution: "move-concurrently@npm:1.0.1" @@ -19835,6 +20197,19 @@ __metadata: languageName: node linkType: hard +"nedb@npm:^1.8.0": + version: 1.8.0 + resolution: "nedb@npm:1.8.0" + dependencies: + async: 0.2.10 + binary-search-tree: 0.2.5 + localforage: ^1.3.0 + mkdirp: ~0.5.1 + underscore: ~1.4.4 + checksum: bcce49eca940dd5cc7012dc95071e550979da7c5e08045909876c78a80183756fc0921c07dc58f56ce443272271b870fe24a4b8e9e1079eddc39f190a6ccf690 + languageName: node + linkType: hard + "needle@npm:2.4.0": version: 2.4.0 resolution: "needle@npm:2.4.0" @@ -20390,6 +20765,13 @@ __metadata: languageName: node linkType: hard +"object-hash@npm:^2.0.1": + version: 2.2.0 + resolution: "object-hash@npm:2.2.0" + checksum: 55ba841e3adce9c4f1b9b46b41983eda40f854e0d01af2802d3ae18a7085a17168d6b81731d43fdf1d6bcbb3c9f9c56d22c8fea992203ad90a38d7d919bc28f1 + languageName: node + linkType: hard + "object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": version: 1.12.0 resolution: "object-inspect@npm:1.12.0" @@ -20560,6 +20942,15 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + "onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -20869,6 +21260,16 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: ^4.0.4 + p-timeout: ^3.2.0 + checksum: 832642fcc4ab6477b43e6d7c30209ab10952969ed211c6d6f2931be8a4f9935e3578c72e8cce053dc34f2eb6941a408a2c516a54904e989851a1a209cf19761c + languageName: node + linkType: hard + "p-retry@npm:*": version: 5.1.0 resolution: "p-retry@npm:5.1.0" @@ -20888,7 +21289,17 @@ __metadata: languageName: node linkType: hard -"p-timeout@npm:^3.1.0": +"p-retry@npm:^4.5.0": + version: 4.6.1 + resolution: "p-retry@npm:4.6.1" + dependencies: + "@types/retry": ^0.12.0 + retry: ^0.13.1 + checksum: e6d540413bb3d0b96e0db44f74a7af1dce41f5005e6e84d617960110b148348c86a3987be07797749e3ddd55817dd3a8ffd6eae3428758bc2994d987e48c3a70 + languageName: node + linkType: hard + +"p-timeout@npm:^3.1.0, p-timeout@npm:^3.2.0": version: 3.2.0 resolution: "p-timeout@npm:3.2.0" dependencies: @@ -21022,6 +21433,13 @@ __metadata: languageName: node linkType: hard +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf + languageName: node + linkType: hard + "parse5-htmlparser2-tree-adapter@npm:^6.0.1": version: 6.0.1 resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" @@ -21961,7 +22379,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:~8": +"postcss@npm:^8.3.11, postcss@npm:~8": version: 8.4.12 resolution: "postcss@npm:8.4.12" dependencies: @@ -22175,6 +22593,15 @@ __metadata: languageName: node linkType: hard +"prom-client@npm:^14.0.0": + version: 14.0.1 + resolution: "prom-client@npm:14.0.1" + dependencies: + tdigest: ^0.1.1 + checksum: 864c19b7086eda8fae652385bc8b8aeb155f85922e58672d07a64918a603341e120e65e08f9d77ccab546518dc18930284da8743c2aac3c968f626d7063d6bba + languageName: node + linkType: hard + "prometheus-gc-stats@npm:^0.6.3": version: 0.6.3 resolution: "prometheus-gc-stats@npm:0.6.3" @@ -22464,7 +22891,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.10.3, qs@npm:^6.10.0, qs@npm:^6.10.1, qs@npm:^6.5.1, qs@npm:^6.9.4": +"qs@npm:6.10.3, qs@npm:^6.10.0, qs@npm:^6.10.1, qs@npm:^6.5.1, qs@npm:^6.9.4, qs@npm:^6.9.6": version: 6.10.3 resolution: "qs@npm:6.10.3" dependencies: @@ -23274,6 +23701,15 @@ __metadata: languageName: node linkType: hard +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" + dependencies: + resolve: ^1.1.6 + checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b + languageName: node + linkType: hard + "recompose@npm:^0.30.0": version: 0.30.0 resolution: "recompose@npm:0.30.0" @@ -23645,6 +24081,20 @@ __metadata: languageName: node linkType: hard +"request-promise@npm:^4.2.6": + version: 4.2.6 + resolution: "request-promise@npm:4.2.6" + dependencies: + bluebird: ^3.5.0 + request-promise-core: 1.1.4 + stealthy-require: ^1.1.1 + tough-cookie: ^2.3.3 + peerDependencies: + request: ^2.34 + checksum: 1856c718cb4b888db8b6a206537ecac47390ea4fbdaef00da9a6169a03dd66a95c38493713f927f78a19bfeb28dcb28f5d20f6ab927d644d9e0626847d808f9f + languageName: node + linkType: hard + "request@npm:2.85.0": version: 2.85.0 resolution: "request@npm:2.85.0" @@ -23675,7 +24125,7 @@ __metadata: languageName: node linkType: hard -"request@npm:^2.51.0, request@npm:^2.68.0, request@npm:^2.87.0, request@npm:^2.88.0": +"request@npm:^2.51.0, request@npm:^2.68.0, request@npm:^2.87.0, request@npm:^2.88.0, request@npm:^2.88.2": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -23803,7 +24253,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.3.2": +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.3.2": version: 1.22.0 resolution: "resolve@npm:1.22.0" dependencies: @@ -23826,7 +24276,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.12.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.3.2#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.12.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.3.2#~builtin": version: 1.22.0 resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=07638b" dependencies: @@ -24117,7 +24567,7 @@ __metadata: languageName: node linkType: hard -"safe-stable-stringify@npm:^2.1.0": +"safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": version: 2.3.1 resolution: "safe-stable-stringify@npm:2.3.1" checksum: a0a0bad0294c3e2a9d1bf3cf2b1096dfb83c162d09a5e4891e488cce082120bd69161d2a92aae7fc48255290f17700decae9c89a07fe139794e61b5c8b411377 @@ -24150,6 +24600,20 @@ __metadata: languageName: node linkType: hard +"sanitize-html@npm:^2.6.1": + version: 2.7.0 + resolution: "sanitize-html@npm:2.7.0" + dependencies: + deepmerge: ^4.2.2 + escape-string-regexp: ^4.0.0 + htmlparser2: ^6.0.0 + is-plain-object: ^5.0.0 + parse-srcset: ^1.0.2 + postcss: ^8.3.11 + checksum: 73a4d66f69578bace3506519ca0734279b7117e15c33c7e4d075cdb483b1586261a18acd35934f6c6109f3b2a4a82f82c242171a94d5dc23fba5b09b01ea5b22 + languageName: node + linkType: hard + "saslprep@npm:^1.0.0, saslprep@npm:^1.0.3": version: 1.0.3 resolution: "saslprep@npm:1.0.3" @@ -24536,6 +25000,19 @@ __metadata: languageName: node linkType: hard +"shelljs@npm:^0.8.4": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" + dependencies: + glob: ^7.0.0 + interpret: ^1.0.0 + rechoir: ^0.6.2 + bin: + shjs: bin/shjs + checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 + languageName: node + linkType: hard + "shimmer@npm:^1.1.0, shimmer@npm:^1.2.0": version: 1.2.1 resolution: "shimmer@npm:1.2.1" @@ -25076,7 +25553,7 @@ __metadata: languageName: node linkType: hard -"stack-trace@npm:0.0.10": +"stack-trace@npm:0.0.10, stack-trace@npm:0.0.x": version: 0.0.10 resolution: "stack-trace@npm:0.0.10" checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 @@ -25137,6 +25614,15 @@ __metadata: languageName: node linkType: hard +"steno@npm:^0.4.1": + version: 0.4.4 + resolution: "steno@npm:0.4.4" + dependencies: + graceful-fs: ^4.1.3 + checksum: 87df4121cf8159fceb3dc925111aff1e237bdea2d37f6684eabbcdea63bfcff79b3234f2a61ffe8de5cf17fcb97e2cf09075a2a98993251f79e2868fe0d5ba1e + languageName: node + linkType: hard + "store2@npm:^2.12.0": version: 2.13.2 resolution: "store2@npm:2.13.2" @@ -26045,6 +26531,13 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -26417,6 +26910,13 @@ __metadata: languageName: node linkType: hard +"triple-beam@npm:^1.3.0": + version: 1.3.0 + resolution: "triple-beam@npm:1.3.0" + checksum: 7d7b77d8625fb252c126c24984a68de462b538a8fcd1de2abd0a26421629cf3527d48e23b3c2264f08f4a6c3bc40a478a722176f4d7b6a1acc154cb70c359f2b + languageName: node + linkType: hard + "triplesec@npm:^3.0.26": version: 3.0.27 resolution: "triplesec@npm:3.0.27" @@ -26986,6 +27486,13 @@ __metadata: languageName: node linkType: hard +"underscore@npm:~1.4.4": + version: 1.4.4 + resolution: "underscore@npm:1.4.4" + checksum: d9d731fe7ef51fbf8cf3d1b72659a9d0da51d655a67ed866ee33d563d7ce474df37086fa9f37a2fddf85750aee5b9bf5297e80bf41024eeb447fd5e11add83ba + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -27003,6 +27510,13 @@ __metadata: languageName: node linkType: hard +"unhomoglyph@npm:^1.0.6": + version: 1.0.6 + resolution: "unhomoglyph@npm:1.0.6" + checksum: 2401fa3f8129fb1093d9ae59680b1dc8e395016e48401f9e706861a6edd28cafc60b0ac7e001cc127ee544942ed16236881b969afd856c28ebfe5d77afa1f0c2 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -28129,6 +28643,49 @@ __metadata: languageName: node linkType: hard +"winston-daily-rotate-file@npm:^4.5.1": + version: 4.6.1 + resolution: "winston-daily-rotate-file@npm:4.6.1" + dependencies: + file-stream-rotator: ^0.6.1 + object-hash: ^2.0.1 + triple-beam: ^1.3.0 + winston-transport: ^4.4.0 + peerDependencies: + winston: ^3 + checksum: b58f41d98794524f2046b08fd5e7dd4acce01ee7ca6e3a5ef03d329edd1c7a392e979d3b61bf03466977f9366fb92a08028278b45fcb044169cc78a395f5d616 + languageName: node + linkType: hard + +"winston-transport@npm:^4.4.0, winston-transport@npm:^4.5.0": + version: 4.5.0 + resolution: "winston-transport@npm:4.5.0" + dependencies: + logform: ^2.3.2 + readable-stream: ^3.6.0 + triple-beam: ^1.3.0 + checksum: a56e5678a80b88a73e77ed998fc6e19d0db19c989a356b137ec236782f2bf58ae4511b11c29163f99391fa4dc12102c7bc5738dcb6543f28877fa2819adc3ee9 + languageName: node + linkType: hard + +"winston@npm:^3.3.3": + version: 3.7.2 + resolution: "winston@npm:3.7.2" + dependencies: + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.4.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.5.0 + checksum: f1f1a860d2fa228b50880b20aaa6cc121085907791fe0d814ff9c062640f6b65da321726322094e7667eb63088b3bb67e7b4e219d998f29efcc6f583185a1cd3 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" From 49feb378d7292fc2033e1e1a0fbce660b508660b Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 13:43:51 -0500 Subject: [PATCH 13/18] Fix typescript issues. Rename settings. Move to Federation section. Added alpha alert --- .../meteor/app/federation-v2/server/bridge.ts | 16 +- .../meteor/app/federation-v2/server/config.ts | 24 ++- .../server/data-interface/message.ts | 7 +- .../server/data-interface/room.ts | 3 +- .../server/data-interface/user.ts | 3 +- apps/meteor/app/federation-v2/server/index.ts | 4 +- .../meteor/app/federation-v2/server/logger.ts | 2 +- .../server/matrix-client/message.ts | 2 +- .../server/matrix-client/room.ts | 3 +- .../server/matrix-client/user.ts | 2 +- .../app/federation-v2/server/settings.ts | 153 +++++++++--------- apps/meteor/app/federation-v2/server/tools.ts | 2 +- .../app/federation/server/startup/settings.ts | 103 ++++++------ .../rocketchat-i18n/i18n/en.i18n.json | 19 +-- 14 files changed, 182 insertions(+), 161 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index e1782aa8e051..1bf4045efd07 100644 --- a/apps/meteor/app/federation-v2/server/bridge.ts +++ b/apps/meteor/app/federation-v2/server/bridge.ts @@ -3,15 +3,15 @@ import { Bridge, AppServiceRegistration } from 'matrix-appservice-bridge'; import { IMatrixEvent } from './definitions/IMatrixEvent'; import { MatrixEventType } from './definitions/MatrixEventType'; import { addToQueue } from './queue'; -import { settings } from '../../settings/server'; +import { config } from './config'; /* eslint-disable @typescript-eslint/camelcase */ const registrationConfig = AppServiceRegistration.fromObject({ - id: settings.get('FederationV2_id') as string, - hs_token: settings.get('FederationV2_hs_token') as string, - as_token: settings.get('FederationV2_as_token') as string, - url: settings.get('FederationV2_bridge_url') as string, - sender_localpart: settings.get('FederationV2_bridge_localpart') as string, + id: config.id, + hs_token: config.hsToken, + as_token: config.asToken, + url: config.bridgeUrl, + sender_localpart: config.bridgeLocalpart, namespaces: { users: [ { @@ -42,8 +42,8 @@ const registrationConfig = AppServiceRegistration.fromObject({ /* eslint-enable @typescript-eslint/camelcase */ export const matrixBridge = new Bridge({ - homeserverUrl: settings.get('FederationV2_homeserver_url') as string, - domain: settings.get('FederationV2_homeserver_domain') as string, + homeserverUrl: config.homeserverUrl, + domain: config.homeserverDomain, registration: registrationConfig, disableStores: true, controller: { diff --git a/apps/meteor/app/federation-v2/server/config.ts b/apps/meteor/app/federation-v2/server/config.ts index 4fed417b4843..a4ade6ae0fff 100644 --- a/apps/meteor/app/federation-v2/server/config.ts +++ b/apps/meteor/app/federation-v2/server/config.ts @@ -13,12 +13,20 @@ interface IBridgeConfig { bridgeLocalpart: string; } -export const config: IBridgeConfig = { - id: settings.get('FederationV2_id') as string, - hsToken: settings.get('FederationV2_hs_token') as string, - asToken: settings.get('FederationV2_as_token') as string, - homeserverUrl: settings.get('FederationV2_homeserver_url') as string, - homeserverDomain: settings.get('FederationV2_homeserver_domain') as string, - bridgeUrl: settings.get('FederationV2_bridge_url') as bridgeUrlString, - bridgeLocalpart: settings.get('FederationV2_bridge_localpart') as string, +function _getConfig(): IBridgeConfig { + return { + id: settings.get('Federation_Matrix_id') as string, + hsToken: settings.get('Federation_Matrix_hs_token') as string, + asToken: settings.get('Federation_Matrix_as_token') as string, + homeserverUrl: settings.get('Federation_Matrix_homeserver_url') as string, + homeserverDomain: settings.get('Federation_Matrix_homeserver_domain') as string, + bridgeUrl: settings.get('Federation_Matrix_bridge_url') as bridgeUrlString, + bridgeLocalpart: settings.get('Federation_Matrix_bridge_localpart') as string, + } as IBridgeConfig; +}; + +export let config: IBridgeConfig = _getConfig(); + +export function getConfig() { + config = _getConfig(); }; diff --git a/apps/meteor/app/federation-v2/server/data-interface/message.ts b/apps/meteor/app/federation-v2/server/data-interface/message.ts index 364ba03ce3ac..0950dadaf6d3 100644 --- a/apps/meteor/app/federation-v2/server/data-interface/message.ts +++ b/apps/meteor/app/federation-v2/server/data-interface/message.ts @@ -1,9 +1,8 @@ -import { IMessage } from '../../../../definition/IMessage'; -import { IUser } from '../../../../definition/IUser'; +import { IMessage, IUser } from '@rocket.chat/core-typings'; import { dataInterface } from '.'; interface INormalizedMessage extends IMessage { - u: IUser; + u: Required>; } export const normalize = async (message: IMessage): Promise => { @@ -11,7 +10,7 @@ export const normalize = async (message: IMessage): Promise const normalizedMessage: INormalizedMessage = message as INormalizedMessage; // Normalize the user - normalizedMessage.u = await dataInterface.user(message.u._id); + normalizedMessage.u = await dataInterface.user(message.u._id) as Required>; return normalizedMessage; }; diff --git a/apps/meteor/app/federation-v2/server/data-interface/room.ts b/apps/meteor/app/federation-v2/server/data-interface/room.ts index 7787ab1b8c61..df1d2163badf 100644 --- a/apps/meteor/app/federation-v2/server/data-interface/room.ts +++ b/apps/meteor/app/federation-v2/server/data-interface/room.ts @@ -1,4 +1,5 @@ -import { IRoom } from '../../../../definition/IRoom'; +import { IRoom } from '@rocket.chat/core-typings'; + import { Rooms } from '../../../models/server'; export const normalize = async (roomId: string): Promise => { diff --git a/apps/meteor/app/federation-v2/server/data-interface/user.ts b/apps/meteor/app/federation-v2/server/data-interface/user.ts index 0a0f532afc45..15fb48843428 100644 --- a/apps/meteor/app/federation-v2/server/data-interface/user.ts +++ b/apps/meteor/app/federation-v2/server/data-interface/user.ts @@ -1,4 +1,5 @@ -import { IUser } from '../../../../definition/IUser'; +import { IUser } from '@rocket.chat/core-typings'; + import { Users } from '../../../models/server'; export const normalize = async (userId: string): Promise => { diff --git a/apps/meteor/app/federation-v2/server/index.ts b/apps/meteor/app/federation-v2/server/index.ts index fe7f555a129e..7048ad628513 100644 --- a/apps/meteor/app/federation-v2/server/index.ts +++ b/apps/meteor/app/federation-v2/server/index.ts @@ -2,10 +2,10 @@ import { matrixBridge } from './bridge'; import { bridgeUrlTuple, config } from './config'; import { bridgeLogger } from './logger'; import './settings'; -import { isFederationV2Enabled } from './tools'; +import { isFederation_MatrixEnabled } from './tools'; ((): void => { - if (!isFederationV2Enabled()) return; + if (!isFederation_MatrixEnabled()) return; bridgeLogger.info(`Running Federation V2: id: ${config.id} diff --git a/apps/meteor/app/federation-v2/server/logger.ts b/apps/meteor/app/federation-v2/server/logger.ts index da7b17e3db07..0b88f48bfde6 100644 --- a/apps/meteor/app/federation-v2/server/logger.ts +++ b/apps/meteor/app/federation-v2/server/logger.ts @@ -1,6 +1,6 @@ import { Logger } from '../../logger/server'; -const logger = new Logger('FederationV2'); +const logger = new Logger('Federation_Matrix'); export const bridgeLogger = logger.section('bridge'); export const setupLogger = logger.section('setup'); diff --git a/apps/meteor/app/federation-v2/server/matrix-client/message.ts b/apps/meteor/app/federation-v2/server/matrix-client/message.ts index 073e4ad380bf..dd9ac68a3eb9 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/message.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/message.ts @@ -1,5 +1,5 @@ import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; -import { IMessage } from '../../../../definition/IMessage'; +import { IMessage } from '@rocket.chat/core-typings'; import { matrixBridge } from '../bridge'; export const send = async (message: IMessage): Promise => { diff --git a/apps/meteor/app/federation-v2/server/matrix-client/room.ts b/apps/meteor/app/federation-v2/server/matrix-client/room.ts index ef8ce92d427f..4bbe0fa4ae11 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/room.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/room.ts @@ -1,5 +1,4 @@ -import { IRoom } from '../../../../definition/IRoom'; -import { IUser } from '../../../../definition/IUser'; +import { IRoom, IUser } from '@rocket.chat/core-typings'; import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; import { matrixBridge } from '../bridge'; diff --git a/apps/meteor/app/federation-v2/server/matrix-client/user.ts b/apps/meteor/app/federation-v2/server/matrix-client/user.ts index 283170f21074..27d22727944d 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/user.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/user.ts @@ -1,6 +1,6 @@ import { MatrixProfileInfo } from 'matrix-bot-sdk'; -import { IUser } from '../../../../definition/IUser'; +import { IUser } from '@rocket.chat/core-typings'; import { matrixBridge } from '../bridge'; import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '../../../models/server'; import { addUserToRoom } from '../../../lib/server/functions'; diff --git a/apps/meteor/app/federation-v2/server/settings.ts b/apps/meteor/app/federation-v2/server/settings.ts index 80bab3b8fba1..6b6472030e41 100644 --- a/apps/meteor/app/federation-v2/server/settings.ts +++ b/apps/meteor/app/federation-v2/server/settings.ts @@ -5,78 +5,86 @@ import { SHA256 } from 'meteor/sha'; import { settings, settingsRegistry } from '../../settings/server'; import { Settings } from '../../models/server/raw'; import { setupLogger } from './logger'; +import { getConfig, config } from './config'; Meteor.startup(async function () { const uniqueId = await settings.get('uniqueID'); const hsToken = SHA256(`hs_${uniqueId}`); const asToken = SHA256(`as_${uniqueId}`); - settingsRegistry.addGroup('FederationV2', function () { - this.add('FederationV2_enabled', false, { - readonly: false, - type: 'boolean', - i18nLabel: 'FederationV2_enabled', - i18nDescription: 'FederationV2_enabled_desc', + settingsRegistry.addGroup('Federation', function () { + this.section('Matrix Bridge', function () { + this.add('Federation_Matrix_enabled', false, { + readonly: false, + type: 'boolean', + i18nLabel: 'Federation_Matrix_enabled', + i18nDescription: 'Federation_Matrix_enabled_desc', + alert: 'Federation_Matrix_Enabled_Alert', + }); + + this.add('Federation_Matrix_id', `rocketchat_${uniqueId}`, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_id', + i18nDescription: 'Federation_Matrix_id_desc', + }); + + this.add('Federation_Matrix_hs_token', hsToken, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_hs_token', + i18nDescription: 'Federation_Matrix_hs_token_desc', + }); + + this.add('Federation_Matrix_as_token', asToken, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_as_token', + i18nDescription: 'Federation_Matrix_as_token_desc', + }); + + this.add('Federation_Matrix_homeserver_url', 'http://localhost:8008', { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_url', + i18nDescription: 'Federation_Matrix_homeserver_url_desc', + }); + + this.add('Federation_Matrix_homeserver_domain', 'local.rocket.chat', { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_domain', + i18nDescription: 'Federation_Matrix_homeserver_domain_desc', + }); + + this.add('Federation_Matrix_bridge_url', 'http://host.docker.internal:3300', { + type: 'string', + i18nLabel: 'Federation_Matrix_bridge_url', + i18nDescription: 'Federation_Matrix_bridge_url_desc', + }); + + this.add('Federation_Matrix_bridge_localpart', 'rocket.cat', { + type: 'string', + i18nLabel: 'Federation_Matrix_bridge_localpart', + i18nDescription: 'Federation_Matrix_bridge_localpart_desc', + }); + + this.add('Federation_Matrix_registration_file', '', { + readonly: true, + type: 'code', + i18nLabel: 'Federation_Matrix_registration_file', + i18nDescription: 'Federation_Matrix_registration_file_desc', + }); }); - this.add('FederationV2_id', `rocketchat_${uniqueId}`, { - readonly: true, - type: 'string', - i18nLabel: 'FederationV2_id', - i18nDescription: 'FederationV2_id_desc', - }); - - this.add('FederationV2_hs_token', hsToken, { - readonly: true, - type: 'string', - i18nLabel: 'FederationV2_hs_token', - i18nDescription: 'FederationV2_hs_token_desc', - }); - - this.add('FederationV2_as_token', asToken, { - readonly: true, - type: 'string', - i18nLabel: 'FederationV2_as_token', - i18nDescription: 'FederationV2_as_token_desc', - }); - - this.add('FederationV2_homeserver_url', 'http://localhost:8008', { - type: 'string', - i18nLabel: 'FederationV2_homeserver_url', - i18nDescription: 'FederationV2_homeserver_url_desc', - }); - - this.add('FederationV2_homeserver_domain', 'local.rocket.chat', { - type: 'string', - i18nLabel: 'FederationV2_homeserver_domain', - i18nDescription: 'FederationV2_homeserver_domain_desc', - }); - - this.add('FederationV2_bridge_url', 'http://host.docker.internal:3300', { - type: 'string', - i18nLabel: 'FederationV2_bridge_url', - i18nDescription: 'FederationV2_bridge_url_desc', - }); - - this.add('FederationV2_bridge_localpart', 'rocket.cat', { - type: 'string', - i18nLabel: 'FederationV2_bridge_localpart', - i18nDescription: 'FederationV2_bridge_localpart_desc', - }); - - this.add('FederationV2_registration_file', '', { - readonly: true, - type: 'code', - i18nLabel: 'FederationV2_registration_file', - i18nDescription: 'FederationV2_registration_file_desc', - }); }); }); let registrationFile = {}; const updateRegistrationFile = async function (): Promise { - let bridgeUrl = (await Settings.getValueById('FederationV2_bridge_url')) as string; + // Refresh config + getConfig(); + + let bridgeUrl = config.bridgeUrl; if (!bridgeUrl.includes(':')) { bridgeUrl = `${bridgeUrl}:3300`; @@ -84,11 +92,11 @@ const updateRegistrationFile = async function (): Promise { /* eslint-disable @typescript-eslint/camelcase */ registrationFile = { - id: await Settings.getValueById('FederationV2_id'), - hs_token: await Settings.getValueById('FederationV2_hs_token'), - as_token: await Settings.getValueById('FederationV2_as_token'), + id: config.id, + hs_token: config.hsToken, + as_token: config.asToken, url: bridgeUrl, - sender_localpart: await Settings.getValueById('FederationV2_bridge_localpart'), + sender_localpart: config.bridgeLocalpart, namespaces: { users: [ { @@ -113,23 +121,24 @@ const updateRegistrationFile = async function (): Promise { /* eslint-enable @typescript-eslint/camelcase */ // Update the registration file - await Settings.updateValueById('FederationV2_registration_file', yaml.dump(registrationFile)); + await Settings.updateValueById('Federation_Matrix_registration_file', yaml.dump(registrationFile)); }; +// TODO: Changes here should re-initialize the bridge instead of needing a restart // Add settings listeners -settings.watch('FederationV2_enabled', (value) => { - setupLogger.info(`Federation V2 is ${value ? 'enabled' : 'disabled'}`); +settings.watch('Federation_Matrix_enabled', (value) => { + setupLogger.info(`Federation Matrix is ${value ? 'enabled' : 'disabled'}`); }); settings.watchMultiple( [ - 'FederationV2_id', - 'FederationV2_hs_token', - 'FederationV2_as_token', - 'FederationV2_homeserver_url', - 'FederationV2_homeserver_domain', - 'FederationV2_bridge_url', - 'FederationV2_bridge_localpart', + 'Federation_Matrix_id', + 'Federation_Matrix_hs_token', + 'Federation_Matrix_as_token', + 'Federation_Matrix_homeserver_url', + 'Federation_Matrix_homeserver_domain', + 'Federation_Matrix_bridge_url', + 'Federation_Matrix_bridge_localpart', ], updateRegistrationFile, ); diff --git a/apps/meteor/app/federation-v2/server/tools.ts b/apps/meteor/app/federation-v2/server/tools.ts index 4250aede971e..c5b122d6a490 100644 --- a/apps/meteor/app/federation-v2/server/tools.ts +++ b/apps/meteor/app/federation-v2/server/tools.ts @@ -1,4 +1,4 @@ import { settings } from '../../settings/server'; import { matrixBridge } from './bridge'; -export const isFederationV2Enabled = () => settings.get('FederationV2_enabled') && matrixBridge; +export const isFederation_MatrixEnabled = () => settings.get('Federation_Matrix_enabled') && matrixBridge; diff --git a/apps/meteor/app/federation/server/startup/settings.ts b/apps/meteor/app/federation/server/startup/settings.ts index 317aabd6d9af..9201d10609ac 100644 --- a/apps/meteor/app/federation/server/startup/settings.ts +++ b/apps/meteor/app/federation/server/startup/settings.ts @@ -14,56 +14,59 @@ Meteor.startup(async function () { const federationPublicKey = await FederationKeys.getPublicKeyString(); settingsRegistry.addGroup('Federation', function () { - this.add('FEDERATION_Enabled', false, { - type: 'boolean', - i18nLabel: 'Enabled', - i18nDescription: 'FEDERATION_Enabled', - alert: 'FEDERATION_Enabled_Alert', - public: true, - }); - - this.add('FEDERATION_Status', 'Disabled', { - readonly: true, - type: 'string', - i18nLabel: 'FEDERATION_Status', - }); - - this.add('FEDERATION_Domain', '', { - type: 'string', - i18nLabel: 'FEDERATION_Domain', - i18nDescription: 'FEDERATION_Domain_Description', - alert: 'FEDERATION_Domain_Alert', - // disableReset: true, - }); - - this.add('FEDERATION_Public_Key', federationPublicKey || '', { - readonly: true, - type: 'string', - multiline: true, - i18nLabel: 'FEDERATION_Public_Key', - i18nDescription: 'FEDERATION_Public_Key_Description', - }); - - this.add('FEDERATION_Discovery_Method', 'dns', { - type: 'select', - values: [ - { - key: 'dns', - i18nLabel: 'DNS', - }, - { - key: 'hub', - i18nLabel: 'Hub', - }, - ], - i18nLabel: 'FEDERATION_Discovery_Method', - i18nDescription: 'FEDERATION_Discovery_Method_Description', - public: true, - }); - - this.add('FEDERATION_Test_Setup', 'FEDERATION_Test_Setup', { - type: 'action', - actionText: 'FEDERATION_Test_Setup', + this.section('Rocket.Chat Federation', function() { + + this.add('FEDERATION_Enabled', false, { + type: 'boolean', + i18nLabel: 'Enabled', + i18nDescription: 'FEDERATION_Enabled', + alert: 'FEDERATION_Enabled_Alert', + public: true, + }); + + this.add('FEDERATION_Status', 'Disabled', { + readonly: true, + type: 'string', + i18nLabel: 'FEDERATION_Status', + }); + + this.add('FEDERATION_Domain', '', { + type: 'string', + i18nLabel: 'FEDERATION_Domain', + i18nDescription: 'FEDERATION_Domain_Description', + alert: 'FEDERATION_Domain_Alert', + // disableReset: true, + }); + + this.add('FEDERATION_Public_Key', federationPublicKey || '', { + readonly: true, + type: 'string', + multiline: true, + i18nLabel: 'FEDERATION_Public_Key', + i18nDescription: 'FEDERATION_Public_Key_Description', + }); + + this.add('FEDERATION_Discovery_Method', 'dns', { + type: 'select', + values: [ + { + key: 'dns', + i18nLabel: 'DNS', + }, + { + key: 'hub', + i18nLabel: 'Hub', + }, + ], + i18nLabel: 'FEDERATION_Discovery_Method', + i18nDescription: 'FEDERATION_Discovery_Method_Description', + public: true, + }); + + this.add('FEDERATION_Test_Setup', 'FEDERATION_Test_Setup', { + type: 'action', + actionText: 'FEDERATION_Test_Setup', + }); }); }); }); diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 11228f75e0a4..3ed029c84a6f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1954,15 +1954,16 @@ "FEDERATION_Test_Setup_Success": "Your federation setup is working and other servers can find you!", "FEDERATION_Unique_Id": "Unique ID", "FEDERATION_Unique_Id_Description": "This is your federation unique ID, used to identify your peer on the mesh.", - "FederationV2": "Federation V2", - "FederationV2_enabled": "Enabled", - "FederationV2_id": "AppService ID", - "FederationV2_hs_token": "Homeserver Token", - "FederationV2_as_token": "AppService Token", - "FederationV2_homeserver_url": "Homeserver URL", - "FederationV2_homeserver_domain": "Homeserver Domain", - "FederationV2_bridge_url": "Bridge URL", - "FederationV2_bridge_localpart": "AppService User Localpart", + "Federation_Matrix": "Federation V2", + "Federation_Matrix_enabled": "Enabled", + "Federation_Matrix_Enabled_Alert": "Matrix Federation Support is in alpha. Use on a production system is not recommended at this time. RESTART CURRENTLY REQUIRED AFTER ALL SETTING CHANGES. More Information about Matrix Federation support can be found here", + "Federation_Matrix_id": "AppService ID", + "Federation_Matrix_hs_token": "Homeserver Token", + "Federation_Matrix_as_token": "AppService Token", + "Federation_Matrix_homeserver_url": "Homeserver URL", + "Federation_Matrix_homeserver_domain": "Homeserver Domain", + "Federation_Matrix_bridge_url": "Bridge URL", + "Federation_Matrix_bridge_localpart": "AppService User Localpart", "Field": "Field", "Field_removed": "Field removed", "Field_required": "Field required", From ee82669e65fea957a6de86bd09bee01791366e9f Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 14:09:09 -0500 Subject: [PATCH 14/18] Fix remaining linting errors --- apps/meteor/app/federation-v2/server/config.ts | 4 ++-- .../app/federation-v2/server/data-interface/message.ts | 5 +++-- apps/meteor/app/federation-v2/server/index.ts | 4 ++-- .../meteor/app/federation-v2/server/matrix-client/message.ts | 3 ++- apps/meteor/app/federation-v2/server/matrix-client/room.ts | 1 + apps/meteor/app/federation-v2/server/matrix-client/user.ts | 2 +- apps/meteor/app/federation-v2/server/settings.ts | 3 +-- apps/meteor/app/federation-v2/server/tools.ts | 2 +- apps/meteor/app/federation/server/startup/settings.ts | 3 +-- 9 files changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/config.ts b/apps/meteor/app/federation-v2/server/config.ts index a4ade6ae0fff..37898a31bc0c 100644 --- a/apps/meteor/app/federation-v2/server/config.ts +++ b/apps/meteor/app/federation-v2/server/config.ts @@ -23,10 +23,10 @@ function _getConfig(): IBridgeConfig { bridgeUrl: settings.get('Federation_Matrix_bridge_url') as bridgeUrlString, bridgeLocalpart: settings.get('Federation_Matrix_bridge_localpart') as string, } as IBridgeConfig; -}; +} export let config: IBridgeConfig = _getConfig(); export function getConfig() { config = _getConfig(); -}; +} diff --git a/apps/meteor/app/federation-v2/server/data-interface/message.ts b/apps/meteor/app/federation-v2/server/data-interface/message.ts index 0950dadaf6d3..7d27732f93e6 100644 --- a/apps/meteor/app/federation-v2/server/data-interface/message.ts +++ b/apps/meteor/app/federation-v2/server/data-interface/message.ts @@ -1,8 +1,9 @@ import { IMessage, IUser } from '@rocket.chat/core-typings'; + import { dataInterface } from '.'; interface INormalizedMessage extends IMessage { - u: Required>; + u: Required>; } export const normalize = async (message: IMessage): Promise => { @@ -10,7 +11,7 @@ export const normalize = async (message: IMessage): Promise const normalizedMessage: INormalizedMessage = message as INormalizedMessage; // Normalize the user - normalizedMessage.u = await dataInterface.user(message.u._id) as Required>; + normalizedMessage.u = (await dataInterface.user(message.u._id)) as Required>; return normalizedMessage; }; diff --git a/apps/meteor/app/federation-v2/server/index.ts b/apps/meteor/app/federation-v2/server/index.ts index 7048ad628513..e0acacb01f94 100644 --- a/apps/meteor/app/federation-v2/server/index.ts +++ b/apps/meteor/app/federation-v2/server/index.ts @@ -2,10 +2,10 @@ import { matrixBridge } from './bridge'; import { bridgeUrlTuple, config } from './config'; import { bridgeLogger } from './logger'; import './settings'; -import { isFederation_MatrixEnabled } from './tools'; +import { isFederationMatrixEnabled } from './tools'; ((): void => { - if (!isFederation_MatrixEnabled()) return; + if (!isFederationMatrixEnabled()) return; bridgeLogger.info(`Running Federation V2: id: ${config.id} diff --git a/apps/meteor/app/federation-v2/server/matrix-client/message.ts b/apps/meteor/app/federation-v2/server/matrix-client/message.ts index dd9ac68a3eb9..ef48ba607ecd 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/message.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/message.ts @@ -1,5 +1,6 @@ -import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; import { IMessage } from '@rocket.chat/core-typings'; + +import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; import { matrixBridge } from '../bridge'; export const send = async (message: IMessage): Promise => { diff --git a/apps/meteor/app/federation-v2/server/matrix-client/room.ts b/apps/meteor/app/federation-v2/server/matrix-client/room.ts index 4bbe0fa4ae11..820e1e77b6cd 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/room.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/room.ts @@ -1,4 +1,5 @@ import { IRoom, IUser } from '@rocket.chat/core-typings'; + import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models/server'; import { matrixBridge } from '../bridge'; diff --git a/apps/meteor/app/federation-v2/server/matrix-client/user.ts b/apps/meteor/app/federation-v2/server/matrix-client/user.ts index 27d22727944d..8620a524d233 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/user.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/user.ts @@ -1,6 +1,6 @@ import { MatrixProfileInfo } from 'matrix-bot-sdk'; - import { IUser } from '@rocket.chat/core-typings'; + import { matrixBridge } from '../bridge'; import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '../../../models/server'; import { addUserToRoom } from '../../../lib/server/functions'; diff --git a/apps/meteor/app/federation-v2/server/settings.ts b/apps/meteor/app/federation-v2/server/settings.ts index 6b6472030e41..3b5c6b2aaca7 100644 --- a/apps/meteor/app/federation-v2/server/settings.ts +++ b/apps/meteor/app/federation-v2/server/settings.ts @@ -74,7 +74,6 @@ Meteor.startup(async function () { i18nDescription: 'Federation_Matrix_registration_file_desc', }); }); - }); }); @@ -84,7 +83,7 @@ const updateRegistrationFile = async function (): Promise { // Refresh config getConfig(); - let bridgeUrl = config.bridgeUrl; + let { bridgeUrl } = config; if (!bridgeUrl.includes(':')) { bridgeUrl = `${bridgeUrl}:3300`; diff --git a/apps/meteor/app/federation-v2/server/tools.ts b/apps/meteor/app/federation-v2/server/tools.ts index c5b122d6a490..d961bf0becba 100644 --- a/apps/meteor/app/federation-v2/server/tools.ts +++ b/apps/meteor/app/federation-v2/server/tools.ts @@ -1,4 +1,4 @@ import { settings } from '../../settings/server'; import { matrixBridge } from './bridge'; -export const isFederation_MatrixEnabled = () => settings.get('Federation_Matrix_enabled') && matrixBridge; +export const isFederationMatrixEnabled = () => settings.get('Federation_Matrix_enabled') && matrixBridge; diff --git a/apps/meteor/app/federation/server/startup/settings.ts b/apps/meteor/app/federation/server/startup/settings.ts index 9201d10609ac..6b6da09e412d 100644 --- a/apps/meteor/app/federation/server/startup/settings.ts +++ b/apps/meteor/app/federation/server/startup/settings.ts @@ -14,8 +14,7 @@ Meteor.startup(async function () { const federationPublicKey = await FederationKeys.getPublicKeyString(); settingsRegistry.addGroup('Federation', function () { - this.section('Rocket.Chat Federation', function() { - + this.section('Rocket.Chat Federation', function () { this.add('FEDERATION_Enabled', false, { type: 'boolean', i18nLabel: 'Enabled', From 5aabad2fc775e303ebc46d73b12dbc38fe2b1571 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 14:27:08 -0500 Subject: [PATCH 15/18] fix slashcommand definition for ts typescript check --- .../app/slashcommands-bridge/client/index.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/meteor/app/slashcommands-bridge/client/index.ts b/apps/meteor/app/slashcommands-bridge/client/index.ts index df2ed311ad8e..d7beb4be531e 100644 --- a/apps/meteor/app/slashcommands-bridge/client/index.ts +++ b/apps/meteor/app/slashcommands-bridge/client/index.ts @@ -1,3 +1,14 @@ -import { slashCommands } from '../../utils'; +import { slashCommands } from '../../utils/lib/slashCommand'; -slashCommands.add('bridge', undefined); +slashCommands.add( + 'bridge', + undefined, + { + description: 'Invites_an_user_to_a_bridged_room', + params: '#command #user', + }, + undefined, + false, + undefined, + undefined, +); From 302e176f5dcec4b7a5aa38e866ef57fe42371508 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 16:16:06 -0500 Subject: [PATCH 16/18] add migration to put settings into the Rocket.Chat Federation section --- apps/meteor/server/startup/migrations/v261.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/meteor/server/startup/migrations/v261.ts diff --git a/apps/meteor/server/startup/migrations/v261.ts b/apps/meteor/server/startup/migrations/v261.ts new file mode 100644 index 000000000000..8f6ea781b5ea --- /dev/null +++ b/apps/meteor/server/startup/migrations/v261.ts @@ -0,0 +1,26 @@ +import { addMigration } from '../../lib/migrations'; +import { Settings } from '../../../app/models/server/raw'; + +addMigration({ + version: 261, + async up() { + const settingsToFix = [ + 'FEDERATION_Enabled', + 'FEDERATION_Status', + 'FEDERATION_Domain', + 'FEDERATION_Public_Key', + 'FEDERATION_Discovery_Method', + 'FEDERATION_Test_Setup', + ]; + + const query = { + _id: { $in: settingsToFix }, + }; + + await Settings.updateMany(query, { + $set: { + section: 'Rocket.Chat Federation', + }, + }); + }, +}); From dbab8ab890a0c5ee94e83ad30e813021177efda8 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 21 Apr 2022 17:21:36 -0500 Subject: [PATCH 17/18] remove migration. Its not needed --- apps/meteor/server/startup/migrations/v261.ts | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 apps/meteor/server/startup/migrations/v261.ts diff --git a/apps/meteor/server/startup/migrations/v261.ts b/apps/meteor/server/startup/migrations/v261.ts deleted file mode 100644 index 8f6ea781b5ea..000000000000 --- a/apps/meteor/server/startup/migrations/v261.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { addMigration } from '../../lib/migrations'; -import { Settings } from '../../../app/models/server/raw'; - -addMigration({ - version: 261, - async up() { - const settingsToFix = [ - 'FEDERATION_Enabled', - 'FEDERATION_Status', - 'FEDERATION_Domain', - 'FEDERATION_Public_Key', - 'FEDERATION_Discovery_Method', - 'FEDERATION_Test_Setup', - ]; - - const query = { - _id: { $in: settingsToFix }, - }; - - await Settings.updateMany(query, { - $set: { - section: 'Rocket.Chat Federation', - }, - }); - }, -}); From bad68f15f3dcd81a0635bb7649f87eb8e15ad1e8 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Thu, 21 Apr 2022 19:23:01 -0300 Subject: [PATCH 18/18] Remove unneeded Meteor.startup wrappers for settings registration --- .../app/federation-v2/server/settings.ts | 131 +++++++++--------- .../app/federation/server/startup/settings.ts | 112 ++++++++------- 2 files changed, 118 insertions(+), 125 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/settings.ts b/apps/meteor/app/federation-v2/server/settings.ts index 3b5c6b2aaca7..c32257f39f64 100644 --- a/apps/meteor/app/federation-v2/server/settings.ts +++ b/apps/meteor/app/federation-v2/server/settings.ts @@ -1,5 +1,4 @@ import yaml from 'js-yaml'; -import { Meteor } from 'meteor/meteor'; import { SHA256 } from 'meteor/sha'; import { settings, settingsRegistry } from '../../settings/server'; @@ -7,72 +6,70 @@ import { Settings } from '../../models/server/raw'; import { setupLogger } from './logger'; import { getConfig, config } from './config'; -Meteor.startup(async function () { - const uniqueId = await settings.get('uniqueID'); - const hsToken = SHA256(`hs_${uniqueId}`); - const asToken = SHA256(`as_${uniqueId}`); - - settingsRegistry.addGroup('Federation', function () { - this.section('Matrix Bridge', function () { - this.add('Federation_Matrix_enabled', false, { - readonly: false, - type: 'boolean', - i18nLabel: 'Federation_Matrix_enabled', - i18nDescription: 'Federation_Matrix_enabled_desc', - alert: 'Federation_Matrix_Enabled_Alert', - }); - - this.add('Federation_Matrix_id', `rocketchat_${uniqueId}`, { - readonly: true, - type: 'string', - i18nLabel: 'Federation_Matrix_id', - i18nDescription: 'Federation_Matrix_id_desc', - }); - - this.add('Federation_Matrix_hs_token', hsToken, { - readonly: true, - type: 'string', - i18nLabel: 'Federation_Matrix_hs_token', - i18nDescription: 'Federation_Matrix_hs_token_desc', - }); - - this.add('Federation_Matrix_as_token', asToken, { - readonly: true, - type: 'string', - i18nLabel: 'Federation_Matrix_as_token', - i18nDescription: 'Federation_Matrix_as_token_desc', - }); - - this.add('Federation_Matrix_homeserver_url', 'http://localhost:8008', { - type: 'string', - i18nLabel: 'Federation_Matrix_homeserver_url', - i18nDescription: 'Federation_Matrix_homeserver_url_desc', - }); - - this.add('Federation_Matrix_homeserver_domain', 'local.rocket.chat', { - type: 'string', - i18nLabel: 'Federation_Matrix_homeserver_domain', - i18nDescription: 'Federation_Matrix_homeserver_domain_desc', - }); - - this.add('Federation_Matrix_bridge_url', 'http://host.docker.internal:3300', { - type: 'string', - i18nLabel: 'Federation_Matrix_bridge_url', - i18nDescription: 'Federation_Matrix_bridge_url_desc', - }); - - this.add('Federation_Matrix_bridge_localpart', 'rocket.cat', { - type: 'string', - i18nLabel: 'Federation_Matrix_bridge_localpart', - i18nDescription: 'Federation_Matrix_bridge_localpart_desc', - }); - - this.add('Federation_Matrix_registration_file', '', { - readonly: true, - type: 'code', - i18nLabel: 'Federation_Matrix_registration_file', - i18nDescription: 'Federation_Matrix_registration_file_desc', - }); +settingsRegistry.addGroup('Federation', function () { + this.section('Matrix Bridge', async function () { + this.add('Federation_Matrix_enabled', false, { + readonly: false, + type: 'boolean', + i18nLabel: 'Federation_Matrix_enabled', + i18nDescription: 'Federation_Matrix_enabled_desc', + alert: 'Federation_Matrix_Enabled_Alert', + }); + + const uniqueId = await settings.get('uniqueID'); + const hsToken = SHA256(`hs_${uniqueId}`); + const asToken = SHA256(`as_${uniqueId}`); + + this.add('Federation_Matrix_id', `rocketchat_${uniqueId}`, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_id', + i18nDescription: 'Federation_Matrix_id_desc', + }); + + this.add('Federation_Matrix_hs_token', hsToken, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_hs_token', + i18nDescription: 'Federation_Matrix_hs_token_desc', + }); + + this.add('Federation_Matrix_as_token', asToken, { + readonly: true, + type: 'string', + i18nLabel: 'Federation_Matrix_as_token', + i18nDescription: 'Federation_Matrix_as_token_desc', + }); + + this.add('Federation_Matrix_homeserver_url', 'http://localhost:8008', { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_url', + i18nDescription: 'Federation_Matrix_homeserver_url_desc', + }); + + this.add('Federation_Matrix_homeserver_domain', 'local.rocket.chat', { + type: 'string', + i18nLabel: 'Federation_Matrix_homeserver_domain', + i18nDescription: 'Federation_Matrix_homeserver_domain_desc', + }); + + this.add('Federation_Matrix_bridge_url', 'http://host.docker.internal:3300', { + type: 'string', + i18nLabel: 'Federation_Matrix_bridge_url', + i18nDescription: 'Federation_Matrix_bridge_url_desc', + }); + + this.add('Federation_Matrix_bridge_localpart', 'rocket.cat', { + type: 'string', + i18nLabel: 'Federation_Matrix_bridge_localpart', + i18nDescription: 'Federation_Matrix_bridge_localpart_desc', + }); + + this.add('Federation_Matrix_registration_file', '', { + readonly: true, + type: 'code', + i18nLabel: 'Federation_Matrix_registration_file', + i18nDescription: 'Federation_Matrix_registration_file_desc', }); }); }); diff --git a/apps/meteor/app/federation/server/startup/settings.ts b/apps/meteor/app/federation/server/startup/settings.ts index 6b6da09e412d..746a2b5e694b 100644 --- a/apps/meteor/app/federation/server/startup/settings.ts +++ b/apps/meteor/app/federation/server/startup/settings.ts @@ -1,5 +1,3 @@ -import { Meteor } from 'meteor/meteor'; - import { settingsRegistry, settings } from '../../../settings/server'; import { updateStatus, updateEnabled, isRegisteringOrEnabled } from '../functions/helpers'; import { getFederationDomain } from '../lib/getFederationDomain'; @@ -10,62 +8,60 @@ import { setupLogger } from '../lib/logger'; import { FederationKeys } from '../../../models/server/raw'; import { STATUS_ENABLED, STATUS_REGISTERING, STATUS_ERROR_REGISTERING, STATUS_DISABLED } from '../constants'; -Meteor.startup(async function () { - const federationPublicKey = await FederationKeys.getPublicKeyString(); - - settingsRegistry.addGroup('Federation', function () { - this.section('Rocket.Chat Federation', function () { - this.add('FEDERATION_Enabled', false, { - type: 'boolean', - i18nLabel: 'Enabled', - i18nDescription: 'FEDERATION_Enabled', - alert: 'FEDERATION_Enabled_Alert', - public: true, - }); - - this.add('FEDERATION_Status', 'Disabled', { - readonly: true, - type: 'string', - i18nLabel: 'FEDERATION_Status', - }); - - this.add('FEDERATION_Domain', '', { - type: 'string', - i18nLabel: 'FEDERATION_Domain', - i18nDescription: 'FEDERATION_Domain_Description', - alert: 'FEDERATION_Domain_Alert', - // disableReset: true, - }); - - this.add('FEDERATION_Public_Key', federationPublicKey || '', { - readonly: true, - type: 'string', - multiline: true, - i18nLabel: 'FEDERATION_Public_Key', - i18nDescription: 'FEDERATION_Public_Key_Description', - }); - - this.add('FEDERATION_Discovery_Method', 'dns', { - type: 'select', - values: [ - { - key: 'dns', - i18nLabel: 'DNS', - }, - { - key: 'hub', - i18nLabel: 'Hub', - }, - ], - i18nLabel: 'FEDERATION_Discovery_Method', - i18nDescription: 'FEDERATION_Discovery_Method_Description', - public: true, - }); - - this.add('FEDERATION_Test_Setup', 'FEDERATION_Test_Setup', { - type: 'action', - actionText: 'FEDERATION_Test_Setup', - }); +settingsRegistry.addGroup('Federation', function () { + this.section('Rocket.Chat Federation', async function () { + this.add('FEDERATION_Enabled', false, { + type: 'boolean', + i18nLabel: 'Enabled', + i18nDescription: 'FEDERATION_Enabled', + alert: 'FEDERATION_Enabled_Alert', + public: true, + }); + + this.add('FEDERATION_Status', 'Disabled', { + readonly: true, + type: 'string', + i18nLabel: 'FEDERATION_Status', + }); + + this.add('FEDERATION_Domain', '', { + type: 'string', + i18nLabel: 'FEDERATION_Domain', + i18nDescription: 'FEDERATION_Domain_Description', + alert: 'FEDERATION_Domain_Alert', + // disableReset: true, + }); + + const federationPublicKey = await FederationKeys.getPublicKeyString(); + + this.add('FEDERATION_Public_Key', federationPublicKey || '', { + readonly: true, + type: 'string', + multiline: true, + i18nLabel: 'FEDERATION_Public_Key', + i18nDescription: 'FEDERATION_Public_Key_Description', + }); + + this.add('FEDERATION_Discovery_Method', 'dns', { + type: 'select', + values: [ + { + key: 'dns', + i18nLabel: 'DNS', + }, + { + key: 'hub', + i18nLabel: 'Hub', + }, + ], + i18nLabel: 'FEDERATION_Discovery_Method', + i18nDescription: 'FEDERATION_Discovery_Method_Description', + public: true, + }); + + this.add('FEDERATION_Test_Setup', 'FEDERATION_Test_Setup', { + type: 'action', + actionText: 'FEDERATION_Test_Setup', }); }); });