From b67f0c8c1a1e679c5f7ae91f0ca5fc5afbc79192 Mon Sep 17 00:00:00 2001 From: Alan Sikora Date: Thu, 18 Nov 2021 16:17:06 -0300 Subject: [PATCH] wip --- app/federation-legacy/server/lib/callbacks.js | 3 + .../IMatrixEventContentAddMemberToRoom.ts | 6 +- .../IMatrixEventContentSetRoomJoinRules.ts | 3 +- .../server/bridge/addMemberToRoom.ts | 86 +++++++++++--- app/federation/server/bridge/bridge.ts | 108 ++++++++++-------- app/federation/server/bridge/createRoom.ts | 33 ++---- .../server/bridge/setRoomJoinRules.ts | 4 +- .../server/callbacks/afterAddedToRoom.ts | 14 +-- .../server/callbacks/afterCreateRoom.ts | 28 ++--- .../server/callbacks/afterSaveMessage.ts | 11 +- app/federation/server/callbacks/index.ts | 7 +- .../server/definitions/IMatrixEvent.ts | 1 + .../server/definitions/MatrixEventType.ts | 1 + app/federation/server/index.ts | 5 +- app/federation/server/methods/index.ts | 36 ++++++ app/federation/server/servers.ts | 6 +- app/slashcommands-invite/server/server.js | 11 ++ package-lock.json | 10 +- package.json | 1 + private/matrix/rocketchat-registration-a.yaml | 12 +- private/matrix/rocketchat-registration-b.yaml | 10 +- 21 files changed, 256 insertions(+), 140 deletions(-) create mode 100644 app/federation/server/methods/index.ts diff --git a/app/federation-legacy/server/lib/callbacks.js b/app/federation-legacy/server/lib/callbacks.js index 3d843554749e0..3234a72b54a62 100644 --- a/app/federation-legacy/server/lib/callbacks.js +++ b/app/federation-legacy/server/lib/callbacks.js @@ -8,6 +8,9 @@ function enableCallback(definition) { } export function registerCallback(callbackDefinition) { + // Prefix with legacy + callbackDefinition.id = `legacy-${ callbackDefinition.id }`; + callbackDefinitions.push(callbackDefinition); if (settings.get('FEDERATION_Enabled')) { diff --git a/app/federation/server/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts b/app/federation/server/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts index d767a30c9e04a..2accfbffbc8b7 100644 --- a/app/federation/server/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts +++ b/app/federation/server/IMatrixEventContent/IMatrixEventContentAddMemberToRoom.ts @@ -1,5 +1,7 @@ -enum AddMemberToRoomMembership { - JOIN = 'join' +export enum AddMemberToRoomMembership { + JOIN = 'join', + INVITE = 'invite', + LEAVE = 'leave', } export interface IMatrixEventContentAddMemberToRoom { diff --git a/app/federation/server/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts b/app/federation/server/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts index 4aae36bb2b95e..921ef3b1df49c 100644 --- a/app/federation/server/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts +++ b/app/federation/server/IMatrixEventContent/IMatrixEventContentSetRoomJoinRules.ts @@ -1,5 +1,6 @@ export enum SetRoomJoinRules { - JOIN = 'public' + JOIN = 'public', + INVITE = 'invite' } export interface IMatrixEventContentSetRoomJoinRules { join_rule: SetRoomJoinRules; diff --git a/app/federation/server/bridge/addMemberToRoom.ts b/app/federation/server/bridge/addMemberToRoom.ts index 9965e8f1d1272..72a7f97bba6dd 100644 --- a/app/federation/server/bridge/addMemberToRoom.ts +++ b/app/federation/server/bridge/addMemberToRoom.ts @@ -1,29 +1,85 @@ // @ts-ignore -import { MatrixBridgedUser, MatrixBridgedRoom, Rooms, Users } from '../../../models'; +import { MatrixBridgedUser, MatrixBridgedRoom, Users } from '../../../models'; +// @ts-ignore +import { addUserToRoom, createRoom, removeUserFromRoom } from '../../../lib'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; +import { AddMemberToRoomMembership } from '../IMatrixEventContent/IMatrixEventContentAddMemberToRoom'; +import { SetRoomJoinRules } from '../IMatrixEventContent/IMatrixEventContentSetRoomJoinRules'; +import { currentServer, SERVER, servers } from '../servers'; +import { createUser } from '../methods'; +import { matrixEventQueue } from './bridge'; export const handleAddMemberToRoom = async ( event: IMatrixEvent, ): Promise => { - const { room_id: matrixRoomId, sender } = event; + const { + room_id: matrixRoomId, + sender: senderMatrixUserId, + state_key: affectedMatrixUserId, + content: { displayname: displayName, membership }, + invite_room_state: inviteRoomState, + } = event; - // Find the bridged user id - const userId = await MatrixBridgedUser.getId(sender); + console.log(JSON.stringify(event, null, 2)); - // Find the user - const user = await Users.findOneById(userId); + // // We ignore the bot + // if (affectedMatrixUserId.startsWith(`@rc_bot:`)) { + // return; + // } // Find the bridged room id const roomId = await MatrixBridgedRoom.getId(matrixRoomId); - Rooms.update({ _id: roomId }, { - $inc: { usersCount: 1 }, - $set: { - u: { - _id: user._id, - username: user.username, - }, - }, - }); + // Find the bridged user id + const senderUserId = await MatrixBridgedUser.getId(senderMatrixUserId); + const affectedUserId = await MatrixBridgedUser.getId(affectedMatrixUserId); + + // Find the user + const senderUser = await Users.findOneById(senderUserId); + const affectedUser = await Users.findOneById(affectedUserId); + + switch (membership) { + case AddMemberToRoomMembership.JOIN: + addUserToRoom(roomId, affectedUser); + break; + case AddMemberToRoomMembership.INVITE: + // // If the sender user does not exist, it means we need to create it + // let creatorUser = senderUser; + // if (!creatorUser) { + // creatorUser = createUser(senderMatrixUserId, senderMatrixUserId); + // } + // + // // If the invited user does not exist, it means we need to create it + // let invitedUser = affectedUser; + // if (!invitedUser) { + // invitedUser = createUser(affectedMatrixUserId, displayName); + // } + + // // Create the room if necessary + // const destinationRoomId = roomId; + + if (!roomId && inviteRoomState) { + // // Ensure we run all the room events first + // for (const event of inviteRoomState) { + // // TODO: Handle error + // matrixEventQueue.push(event).catch((err) => console.error(err)); + // } + // + // // Re-add the current event to the queue + // // TODO: Handle error + // matrixEventQueue.push(event).catch((err) => console.error(err)); + + // Stop + return; + } + + addUserToRoom(roomId, affectedUser, senderUser); + break; + case AddMemberToRoomMembership.LEAVE: + removeUserFromRoom(roomId, affectedUser, { + byUser: senderUser, + }); + break; + } }; diff --git a/app/federation/server/bridge/bridge.ts b/app/federation/server/bridge/bridge.ts index 5d10e4d090bc8..f543004a48d53 100644 --- a/app/federation/server/bridge/bridge.ts +++ b/app/federation/server/bridge/bridge.ts @@ -1,5 +1,6 @@ -// @ts-ignore import yaml from 'js-yaml'; +import * as fastq from 'fastq'; +import type { queueAsPromised } from 'fastq'; import { AppServiceRegistration, Bridge } from 'matrix-appservice-bridge'; import { currentServer } from '../servers'; @@ -16,63 +17,78 @@ const registration: AppServiceRegistration = yaml.load( currentServer.registrationFile, ); +// Define the event handler +const eventHandler = async (event: IMatrixEvent): Promise => { + switch (event.type) { + case MatrixEventType.CREATE_ROOM: { + await handleCreateRoom(event as IMatrixEvent); + + break; + } + case MatrixEventType.ADD_MEMBER_TO_ROOM: { + await handleAddMemberToRoom(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); + } +}; + +// Create the queue +export const matrixEventQueue: queueAsPromised> = fastq.promise(eventHandler, 1); + export const bridge = new Bridge({ homeserverUrl: currentServer.homeserverUrl, domain: 'localhost', registration, - suppressEcho: false, + suppressEcho: true, disableStores: true, controller: { - // onUserQuery(queriedUser) { - // return {}; // auto-provision users with no additional data - // }, + onUserQuery(queriedUser): Record { + console.log('=================================================================='); + console.log('onUserQuery', queriedUser); + console.log('=================================================================='); + return {}; // auto-provision users with no additional data + }, async onEvent(request/* , context*/): Promise { // Get the event const event = request.getData() as unknown as IMatrixEvent; - switch (event.type) { - case MatrixEventType.CREATE_ROOM: { - await handleCreateRoom(event as IMatrixEvent); - - break; - } - case MatrixEventType.ADD_MEMBER_TO_ROOM: { - await handleAddMemberToRoom(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: { - console.log(`Ignoring ${ event.type }`); - - break; - } - default: - console.log(`Could not find handler for ${ event.type }`, event); - } + console.log(`Queueing ${ event.type }...`, event); + + // TODO: Handle error + matrixEventQueue.push(event).catch((err) => console.error(err)); }, }, }); diff --git a/app/federation/server/bridge/createRoom.ts b/app/federation/server/bridge/createRoom.ts index 98f4833a1d17a..0a9db517fad6b 100644 --- a/app/federation/server/bridge/createRoom.ts +++ b/app/federation/server/bridge/createRoom.ts @@ -1,5 +1,7 @@ // @ts-ignore -import { MatrixBridgedRoom, MatrixBridgedUser, Rooms, Subscriptions, Users } from '../../../models'; +import { MatrixBridgedRoom, MatrixBridgedUser, Users } from '../../../models'; +// @ts-ignore +import { createRoom } from '../../../lib'; import { IMatrixEvent } from '../definitions/IMatrixEvent'; import { MatrixEventType } from '../definitions/MatrixEventType'; @@ -14,31 +16,10 @@ export const handleCreateRoom = async ( // Find the user const user = await Users.findOneById(userId); - const roomId = Rooms.insert({ - description: '', - broadcast: false, - encrypted: false, - usersCount: 1, - u: { - _id: user._id, - username: user.username, - }, - ts: new Date(), - _updatedAt: new Date(), - }); + // Create temp room name + const roomName = `Federation-${ matrixRoomId.split(':')[0].replace('!', '') }`; - MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); + const { rid: roomId } = createRoom('c', roomName, user.username); - Subscriptions.insert({ - open: true, - alert: false, - ts: new Date(), - rid: roomId, - u: { - _id: user._id, - name: user.name, - username: user.username, - }, - _updatedAt: new Date(), - }); + MatrixBridgedRoom.insert({ rid: roomId, mri: matrixRoomId }); }; diff --git a/app/federation/server/bridge/setRoomJoinRules.ts b/app/federation/server/bridge/setRoomJoinRules.ts index 9abf00b36a309..2335c9a221933 100644 --- a/app/federation/server/bridge/setRoomJoinRules.ts +++ b/app/federation/server/bridge/setRoomJoinRules.ts @@ -15,13 +15,15 @@ export const setRoomJoinRules = async ( let type; switch (joinRule) { + case SetRoomJoinRules.INVITE: + type = 'p'; + break; case SetRoomJoinRules.JOIN: default: type = 'c'; } Rooms.update({ _id: roomId }, { - $inc: { usersCount: 1 }, $set: { t: type, }, diff --git a/app/federation/server/callbacks/afterAddedToRoom.ts b/app/federation/server/callbacks/afterAddedToRoom.ts index 4e4e6dc074d19..58b2715c8d117 100644 --- a/app/federation/server/callbacks/afterAddedToRoom.ts +++ b/app/federation/server/callbacks/afterAddedToRoom.ts @@ -4,11 +4,11 @@ import { IRoom } from '../../../../definition/IRoom'; import { bridge } from '../bridge'; export async function afterAddedToRoom(_: any, room: IRoom): Promise { - const intent = bridge.getIntent(); - - // Retrieve the matrix room - const roomMatrixId = MatrixBridgedRoom.getMatrixId(room._id); - - // Add the user - await intent.invite(roomMatrixId, '@rocketchat_userb:b.rc.allskar.com'); + // const intent = bridge.getIntent(); + // + // // Retrieve the matrix room + // const roomMatrixId = MatrixBridgedRoom.getMatrixId(room._id); + // + // // Add the user + // await intent.invite(roomMatrixId, '@rocketchat_userb:b.rc.allskar.com'); } diff --git a/app/federation/server/callbacks/afterCreateRoom.ts b/app/federation/server/callbacks/afterCreateRoom.ts index 7674d20bca961..616804fcbf51d 100644 --- a/app/federation/server/callbacks/afterCreateRoom.ts +++ b/app/federation/server/callbacks/afterCreateRoom.ts @@ -5,9 +5,16 @@ import { IRoom } from '../../../../definition/IRoom'; import { bridge } from '../bridge'; export async function afterCreateRoom(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; + } + const intent = bridge.getIntent(); - const roomName = `@rocketchat_${ room.name }`; + const roomName = `@rc_${ room.name }`; // Create the matrix room const matrixRoom = await intent.createRoom({ @@ -15,28 +22,17 @@ export async function afterCreateRoom(user: IUser, room: IRoom): Promise { options: { name: roomName, topic: room.topic, - visibility: 'public', - preset: 'public_chat', + visibility: room.t === 'p' ? 'invite' : 'public', + preset: room.t === 'p' ? 'private_chat' : 'public_chat', }, }); // Retrieve the matrix user - const matrixId = MatrixBridgedUser.getMatrixId(user._id); + const userMatrixId = MatrixBridgedUser.getMatrixId(user._id); // Add to the map MatrixBridgedRoom.insert({ rid: room._id, mri: matrixRoom.room_id }); - // Set room visibility - const roomDirectoryVisibility = await intent - .getClient() - .getRoomDirectoryVisibility(matrixRoom.room_id); - - if (roomDirectoryVisibility !== 'public') { - await intent - .getClient() - .setRoomDirectoryVisibility(matrixRoom.room_id, 'public'); - } - // Add our user - await intent.invite(matrixRoom.room_id, matrixId); + await intent.invite(matrixRoom.room_id, userMatrixId); } diff --git a/app/federation/server/callbacks/afterSaveMessage.ts b/app/federation/server/callbacks/afterSaveMessage.ts index 62da9bc1c32fc..ab8d01bfdf620 100644 --- a/app/federation/server/callbacks/afterSaveMessage.ts +++ b/app/federation/server/callbacks/afterSaveMessage.ts @@ -1,15 +1,20 @@ // @ts-ignore import { MatrixBridgedRoom, MatrixBridgedUser } from '../../../models'; import { bridge } from '../bridge'; +import { IMessage } from '../../../../definition/IMessage'; +import { IRoom } from '../../../../definition/IRoom'; -export async function afterSaveMessage(message, room) { +export async function afterSaveMessage(message: IMessage, room: IRoom): Promise { // Retrieve the matrix user - const matrixId = MatrixBridgedUser.getMatrixId(message.u._id); + const userMatrixId = MatrixBridgedUser.getMatrixId(message.u._id); // Retrieve the matrix room const roomMatrixId = MatrixBridgedRoom.getMatrixId(room._id); - const intent = bridge.getIntent(matrixId); + console.log(message, userMatrixId); + console.log(roomMatrixId); + + const intent = bridge.getIntent(userMatrixId); await intent.sendText(roomMatrixId, message.msg || '...not-supported...'); return message; diff --git a/app/federation/server/callbacks/index.ts b/app/federation/server/callbacks/index.ts index 010c288f71c48..91af0a6c99ed1 100644 --- a/app/federation/server/callbacks/index.ts +++ b/app/federation/server/callbacks/index.ts @@ -1,22 +1,23 @@ import { callbacks } from '../../../callbacks/server'; import { IUser } from '../../../../definition/IUser'; import { IRoom } from '../../../../definition/IRoom'; +import { IMessage } from '../../../../definition/IMessage'; import { afterSaveMessage } from './afterSaveMessage'; import { afterCreateRoom } from './afterCreateRoom'; import { afterAddedToRoom } from './afterAddedToRoom'; callbacks.add( 'afterSaveMessage', - (message, room) => Promise.await(afterSaveMessage(message, room)), + (message: IMessage, room: IRoom) => Promise.await(afterSaveMessage(message, room)), callbacks.priority.LOW, - 'federation-v2-after-save-message', + 'federation-after-save-message', ); callbacks.add( 'afterCreateRoom', (user: IUser, room: IRoom) => Promise.await(afterCreateRoom(user, room)), callbacks.priority.LOW, - 'matrix-after-create-room', + 'federation-after-create-room', ); callbacks.add( diff --git a/app/federation/server/definitions/IMatrixEvent.ts b/app/federation/server/definitions/IMatrixEvent.ts index a7a168566fd67..3eb842eea2526 100644 --- a/app/federation/server/definitions/IMatrixEvent.ts +++ b/app/federation/server/definitions/IMatrixEvent.ts @@ -4,6 +4,7 @@ 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; diff --git a/app/federation/server/definitions/MatrixEventType.ts b/app/federation/server/definitions/MatrixEventType.ts index 78c9f2af8e8de..b77d382eb2956 100644 --- a/app/federation/server/definitions/MatrixEventType.ts +++ b/app/federation/server/definitions/MatrixEventType.ts @@ -5,6 +5,7 @@ export enum MatrixEventType { 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/server/index.ts b/app/federation/server/index.ts index 33b31c1b78ce0..b205245a3bd51 100644 --- a/app/federation/server/index.ts +++ b/app/federation/server/index.ts @@ -7,8 +7,11 @@ import { IMatrixBridgedUser } from '../../models/server/models/MatrixBridgedUser import { bridge } from './bridge'; import { currentServer } from './servers'; +// Register callbacks +import './callbacks'; + async function upsertBridgedUser(u: IUser): Promise { - const matrixUserId = `@rocketchat_${ u.username?.toLowerCase() }:${ + const matrixUserId = `@rc_${ u.username?.toLowerCase() }:${ currentServer.domain }`; diff --git a/app/federation/server/methods/index.ts b/app/federation/server/methods/index.ts new file mode 100644 index 0000000000000..c68b2515ecf56 --- /dev/null +++ b/app/federation/server/methods/index.ts @@ -0,0 +1,36 @@ +import { IUser } from '../../../../definition/IUser'; +// @ts-ignore +import { MatrixBridgedRoom, MatrixBridgedUser, Users } from '../../../models'; +import { bridge } from '../bridge'; + +export const createUser = async (matrixUserId: string, displayName: string): Promise => { + const userId = Users.create({ + username: matrixUserId, + type: 'user', + status: 'online', + active: true, + roles: ['user'], + name: displayName, + requirePasswordChange: false, + }); + + // Add the user to the bridge + MatrixBridgedUser.insert({ uid: userId, mui: matrixUserId }); + + return Users.findOneById(userId); +}; + +export const inviteFederatedUser = async (roomId: string, matrixUserId: string): Promise => { + // Check if the user already exists locally + const existingUserId = await MatrixBridgedUser.getId(matrixUserId); + + if (!existingUserId) { + await createUser(matrixUserId, matrixUserId); + } + + // Find the bridged room id + const matrixRoomId = await MatrixBridgedRoom.getMatrixId(roomId); + + // Add our user + await bridge.getIntent().invite(matrixRoomId, matrixUserId); +}; diff --git a/app/federation/server/servers.ts b/app/federation/server/servers.ts index c018e4599c485..6363442f079a5 100644 --- a/app/federation/server/servers.ts +++ b/app/federation/server/servers.ts @@ -1,10 +1,11 @@ -enum SERVER { +export enum SERVER { A = 'A', B = 'B', } -const servers = { +export const servers = { [SERVER.A]: { + prefix: 'rc_a', homeserverUrl: 'https://a.rc.allskar.com', domain: 'a.rc.allskar.com', registrationFile: Assets.absoluteFilePath( @@ -13,6 +14,7 @@ const servers = { port: 9000, }, [SERVER.B]: { + prefix: 'rc_b', homeserverUrl: 'https://b.rc.allskar.com', domain: 'b.rc.allskar.com', registrationFile: Assets.absoluteFilePath( diff --git a/app/slashcommands-invite/server/server.js b/app/slashcommands-invite/server/server.js index 7c3a953abb5a0..26283f1ce7f26 100644 --- a/app/slashcommands-invite/server/server.js +++ b/app/slashcommands-invite/server/server.js @@ -5,6 +5,7 @@ import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; import { slashCommands } from '../../utils'; import { Subscriptions } from '../../models'; import { api } from '../../../server/sdk/api'; +import { inviteFederatedUser } from '../../federation/server/methods'; /* * Invite is a named function that will replace /invite commands @@ -21,6 +22,16 @@ function Invite(command, params, item) { if (usernames.length === 0) { return; } + + // Check if it is a federation invite + // /invite fed:@rc_b_alan:b.rc.allskar.com + if (usernames[0].startsWith('fed:')) { + // Fix the username + usernames[0] = usernames[0].replace('fed:', ''); + + Promise.await(inviteFederatedUser(item.rid, usernames[0])); + } + let users = Meteor.users.find({ username: { $in: usernames, diff --git a/package-lock.json b/package-lock.json index f407218ae5008..ea066c33f8d66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20795,10 +20795,9 @@ "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, + "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" } @@ -34724,8 +34723,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rewire": { "version": "5.0.0", diff --git a/package.json b/package.json index e87892caa0ced..938d073f18063 100644 --- a/package.json +++ b/package.json @@ -207,6 +207,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": "4.0.3", "file-type": "^10.11.0", diff --git a/private/matrix/rocketchat-registration-a.yaml b/private/matrix/rocketchat-registration-a.yaml index 69a880c3fa017..5430e15697491 100644 --- a/private/matrix/rocketchat-registration-a.yaml +++ b/private/matrix/rocketchat-registration-a.yaml @@ -1,12 +1,12 @@ id: rocketchat hs_token: afe7e2d6f965b6d16c33b70e27492f072bb20dd6b19033950a5d4eae1c504142 as_token: 784e89060d205cd5531046210731718586411761caca31ddda738cf28d2d4e13 -url: 'https://556c-2804-2984-55c-6000-00-1012.ngrok.io' -sender_localpart: 'rocketchat_bot' +url: 'https://43f0-2804-2984-55c-6000-00-1006.ngrok.io' +sender_localpart: 'rc_a_bot' namespaces: users: - - exclusive: true - regex: '@rocketchat_.*' + - exclusive: false + regex: '@rc_.*' rooms: - - exclusive: true - regex: '@rocketchat_.*' + - exclusive: false + regex: '@rc_.*' diff --git a/private/matrix/rocketchat-registration-b.yaml b/private/matrix/rocketchat-registration-b.yaml index da45b791fdbdd..373c5eb4b8c7f 100644 --- a/private/matrix/rocketchat-registration-b.yaml +++ b/private/matrix/rocketchat-registration-b.yaml @@ -2,11 +2,11 @@ id: rocketchat hs_token: afe7e2d6f965b6d16c33b70e27492f072bb20dd6b19033950a5d4eae1c504142 as_token: 784e89060d205cd5531046210731718586411761caca31ddda738cf28d2d4e13 url: 'https://b8e9-2804-2984-55c-6000-00-1012.ngrok.io' -sender_localpart: 'rocketchat_bot' +sender_localpart: 'rc_b_bot' namespaces: users: - - exclusive: true - regex: '@rocketchat_.*' + - exclusive: false + regex: '@rc_.*' rooms: - - exclusive: true - regex: '@rocketchat_.*' + - exclusive: false + regex: '@rc_.*'