diff --git a/packages/base/matrix-event.gts b/packages/base/matrix-event.gts index dcc8a5ae0f..d8e4d6b724 100644 --- a/packages/base/matrix-event.gts +++ b/packages/base/matrix-event.gts @@ -386,9 +386,12 @@ export interface RealmEvent extends BaseMatrixEvent { content: RealmEventContent; } -export type RealmEventContent = +export type RealmEventContent = ( | IndexRealmEventContent - | UpdateRealmEventContent; + | UpdateRealmEventContent +) & { + realmURL?: string; +}; export type IndexRealmEventContent = | IncrementalIndexEventContent diff --git a/packages/host/app/services/matrix-service.ts b/packages/host/app/services/matrix-service.ts index 7545d24b56..0757f48218 100644 --- a/packages/host/app/services/matrix-service.ts +++ b/packages/host/app/services/matrix-service.ts @@ -1895,28 +1895,17 @@ export default class MatrixService extends Service { return; } - let realmResourceForEvent = this.realm.realmForSessionRoomId( - event.room_id!, - ); - if (!realmResourceForEvent) { + const content = event.content as RealmEventContent; + if (!content.realmURL) { realmEventsLogger.debug( - 'Ignoring realm event because no realm found', + 'Ignoring realm event because no realm URL was provided', event, ); - } else { - if (realmResourceForEvent.info?.realmUserId !== event.sender) { - realmEventsLogger.warn( - `Realm event sender ${event.sender} is not the realm user ${realmResourceForEvent.info?.realmUserId}`, - event, - ); - } - - (event.content as any).origin_server_ts = event.origin_server_ts; - this.messageService.relayRealmEvent( - realmResourceForEvent.url, - event.content as RealmEventContent, - ); + return; } + + (content as any).origin_server_ts = event.origin_server_ts; + this.messageService.relayRealmEvent(content); } } diff --git a/packages/host/app/services/message-service.ts b/packages/host/app/services/message-service.ts index 52e41ae8e2..85c2df8168 100644 --- a/packages/host/app/services/message-service.ts +++ b/packages/host/app/services/message-service.ts @@ -44,7 +44,11 @@ export default class MessageService extends Service { } } - relayRealmEvent(realmURL: string, event: RealmEventContent) { + relayRealmEvent(event: RealmEventContent) { + const realmURL = event.realmURL; + if (!realmURL) { + return; + } this.listenerCallbacks.get(realmURL)?.forEach((cb) => { cb(event); }); diff --git a/packages/host/config/schema/1769504850011_schema.sql b/packages/host/config/schema/1770648743000_schema.sql similarity index 94% rename from packages/host/config/schema/1769504850011_schema.sql rename to packages/host/config/schema/1770648743000_schema.sql index 56d3fa5dc7..7fd8ff7367 100644 --- a/packages/host/config/schema/1769504850011_schema.sql +++ b/packages/host/config/schema/1770648743000_schema.sql @@ -1,6 +1,13 @@ -- This is auto-generated by packages/realm-server/scripts/convert-to-sqlite.ts -- Please don't directly modify this file + CREATE TABLE IF NOT EXISTS bot_registrations ( + id NOT NULL, + username TEXT NOT NULL, + created_at NOT NULL, + PRIMARY KEY ( id ) +); + CREATE TABLE IF NOT EXISTS boxel_index ( url TEXT NOT NULL, file_alias TEXT NOT NULL, diff --git a/packages/host/tests/helpers/adapter.ts b/packages/host/tests/helpers/adapter.ts index 8d3fa14b57..ab4f3d4e18 100644 --- a/packages/host/tests/helpers/adapter.ts +++ b/packages/host/tests/helpers/adapter.ts @@ -128,8 +128,13 @@ export class TestRealmAdapter implements RealmAdapter { rid.replace('test-session-room-realm-', '').startsWith(realmUrl), ); + const eventWithRealmURL: RealmEventContent = { + ...event, + realmURL: realmUrl, + }; + for (let roomId of targetRoomIds) { - simulateRemoteMessage(roomId, realmMatrixUsername, event, { + simulateRemoteMessage(roomId, realmMatrixUsername, eventWithRealmURL, { type: APP_BOXEL_REALM_EVENT_TYPE, }); } diff --git a/packages/host/tests/helpers/index.gts b/packages/host/tests/helpers/index.gts index a5a56aec04..7d5d3dce74 100644 --- a/packages/host/tests/helpers/index.gts +++ b/packages/host/tests/helpers/index.gts @@ -787,15 +787,11 @@ async function setupTestRealm({ realm = new Realm({ url: realmURL, adapter, - matrix: { - ...baseTestMatrix, - username: testRealmURLToUsername(realmURL), - }, secretSeed: testRealmSecretSeed, virtualNetwork, dbAdapter, queue, - realmServerMatrixClient: new MatrixClient({ + matrixClient: new MatrixClient({ matrixURL: baseTestMatrix.url, username: testRealmServerMatrixUsername, seed: testRealmSecretSeed, diff --git a/packages/host/tests/integration/message-service-subscription-test.gts b/packages/host/tests/integration/message-service-subscription-test.gts index c5879533ff..7d60c7783c 100644 --- a/packages/host/tests/integration/message-service-subscription-test.gts +++ b/packages/host/tests/integration/message-service-subscription-test.gts @@ -107,6 +107,7 @@ module('Integration | message service subscription', function (hooks) { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: 'index.json', + realmURL: testRealmURL, }, }); diff --git a/packages/matrix/helpers/index.ts b/packages/matrix/helpers/index.ts index 6338cf08ee..cc9a5e0ddc 100644 --- a/packages/matrix/helpers/index.ts +++ b/packages/matrix/helpers/index.ts @@ -120,31 +120,6 @@ export async function setRealmRedirects(page: Page) { } export async function registerRealmUsers(synapse: SynapseInstance) { - await registerUser( - synapse, - 'base_realm', - await realmPassword('base_realm', realmSecretSeed), - ); - await registerUser( - synapse, - 'experiments_realm', - await realmPassword('experiments_realm', realmSecretSeed), - ); - await registerUser( - synapse, - 'catalog_realm', - await realmPassword('catalog_realm', realmSecretSeed), - ); - await registerUser( - synapse, - 'skills_realm', - await realmPassword('skills_realm', realmSecretSeed), - ); - await registerUser( - synapse, - 'test_realm', - await realmPassword('test_realm', realmSecretSeed), - ); await registerUser( synapse, 'node-test_realm', diff --git a/packages/matrix/tests/messages.spec.ts b/packages/matrix/tests/messages.spec.ts index 84ca57e62f..87a69cc655 100644 --- a/packages/matrix/tests/messages.spec.ts +++ b/packages/matrix/tests/messages.spec.ts @@ -359,7 +359,7 @@ test.describe('Room messages', () => { await expect( page.locator(`[data-test-attached-card="${appURL}/hassan"]`), ).toHaveCount(1); - await expect(page.locator(`[data-test-attached-file]`)).toHaveCount(1); + await expect(page.locator(`[data-test-attached-file]`)).toHaveCount(2); await expect( page.locator(`[data-test-attached-file="${appURL}/person.gts"]`), ).toHaveCount(1); diff --git a/packages/postgres/migrations/1770648743000_add-realm-user-id-to-session-rooms.js b/packages/postgres/migrations/1770648743000_add-realm-user-id-to-session-rooms.js new file mode 100644 index 0000000000..f28057745f --- /dev/null +++ b/packages/postgres/migrations/1770648743000_add-realm-user-id-to-session-rooms.js @@ -0,0 +1,9 @@ +exports.up = (pgm) => { + pgm.addColumns('session_rooms', { + realm_user_id: { type: 'varchar' }, + }); +}; + +exports.down = (pgm) => { + pgm.dropColumns('session_rooms', ['realm_user_id']); +}; diff --git a/packages/realm-server/handlers/handle-create-session.ts b/packages/realm-server/handlers/handle-create-session.ts index 8bd1c49d87..1fb6b14706 100644 --- a/packages/realm-server/handlers/handle-create-session.ts +++ b/packages/realm-server/handlers/handle-create-session.ts @@ -1,7 +1,6 @@ import { fetchSessionRoom, logger, - REALM_SERVER_REALM, SupportedMimeType, upsertSessionRoom, } from '@cardstack/runtime-common'; @@ -42,9 +41,15 @@ export default function handleCreateSessionRequest({ createJWT: async (user: string, sessionRoom: string) => createJWT({ user, sessionRoom }, realmSecretSeed), ensureSessionRoom: async (userId: string) => { + const realmServerUserId = matrixClient.getUserId(); + if (!realmServerUserId) { + throw new Error( + 'Realm server Matrix user ID is not available, unable to create session room', + ); + } let sessionRoom = await fetchSessionRoom( dbAdapter, - REALM_SERVER_REALM, + realmServerUserId, userId, ); @@ -52,7 +57,7 @@ export default function handleCreateSessionRequest({ sessionRoom = await matrixClient.createDM(userId); await upsertSessionRoom( dbAdapter, - REALM_SERVER_REALM, + realmServerUserId, userId, sessionRoom, ); diff --git a/packages/realm-server/handlers/handle-publish-realm.ts b/packages/realm-server/handlers/handle-publish-realm.ts index f7467c5852..5f7529e821 100644 --- a/packages/realm-server/handlers/handle-publish-realm.ts +++ b/packages/realm-server/handlers/handle-publish-realm.ts @@ -30,8 +30,6 @@ import { import { createJWT } from '../jwt'; import type { CreateRoutesArgs } from '../routes'; import type { RealmServerTokenClaim } from '../utils/jwt'; -import { registerUser } from '../synapse'; -import { passwordFromSeed } from '@cardstack/runtime-common/matrix-client'; const log = logger('handle-publish'); @@ -128,13 +126,11 @@ function rewriteHostHomeForPublishedRealm( export default function handlePublishRealm({ dbAdapter, - matrixClient, realmSecretSeed, serverURL, virtualNetwork, realms, realmsRootPath, - getMatrixRegistrationSecret, createAndMountRealm, domainsForPublishedRealms, }: CreateRoutesArgs): (ctxt: Koa.Context, next: Koa.Next) => Promise { @@ -284,7 +280,6 @@ export default function handlePublishRealm({ ); let userId; - let realmUsername; let publishedRealmData: PublishedRealmTable | undefined; if (existingPublishedRealm) { let results = (await query(dbAdapter, [ @@ -299,7 +294,6 @@ export default function handlePublishRealm({ | 'last_published_at' >[]; publishedRealmData = results[0]; - realmUsername = `realm/${PUBLISHED_DIRECTORY_NAME}_${publishedRealmData.id}`; let lastPublishedAt = Date.now().toString(); await query(dbAdapter, [ @@ -311,10 +305,9 @@ export default function handlePublishRealm({ publishedRealmData.last_published_at = lastPublishedAt; } else { let publishedRealmId = uuidv4(); - realmUsername = `realm/${PUBLISHED_DIRECTORY_NAME}_${publishedRealmId}`; let { valueExpressions, nameExpressions } = asExpressions({ id: publishedRealmId, - owner_username: realmUsername, + owner_username: 'NONE', source_realm_url: sourceRealmURL, published_realm_url: publishedRealmURL, last_published_at: Date.now().toString(), @@ -332,18 +325,7 @@ export default function handlePublishRealm({ | 'last_published_at' >[]; publishedRealmData = results[0]; - - let { userId: newUserId } = await registerUser({ - matrixURL: matrixClient.matrixURL, - displayname: realmUsername, - username: realmUsername, - password: await passwordFromSeed(realmUsername, realmSecretSeed), - registrationSecret: await getMatrixRegistrationSecret(), - }); - userId = newUserId; - await insertPermissions(dbAdapter, new URL(publishedRealmURL), { - [userId]: ['read', 'realm-owner'], [ownerUserId]: ['read', 'realm-owner'], '*': ['read'], }); @@ -388,7 +370,6 @@ export default function handlePublishRealm({ let realm = createAndMountRealm( publishedRealmPath, publishedRealmURL, - realmUsername, new URL(sourceRealmURL), false, ); diff --git a/packages/realm-server/main.ts b/packages/realm-server/main.ts index e16b4e8413..2e0b2744f7 100644 --- a/packages/realm-server/main.ts +++ b/packages/realm-server/main.ts @@ -236,7 +236,7 @@ const getIndexHTML = async () => { await waitForWorkerManager(workerManagerPort); } - let realmServerMatrixClient = new MatrixClient({ + let matrixClient = new MatrixClient({ matrixURL: new URL(MATRIX_URL), username: REALM_SERVER_MATRIX_USERNAME, seed: REALM_SECRET_SEED, @@ -272,12 +272,11 @@ const getIndexHTML = async () => { { url, adapter: realmAdapter, - matrix: { url: new URL(matrixURL), username }, secretSeed: REALM_SECRET_SEED, virtualNetwork, dbAdapter, queue, - realmServerMatrixClient, + matrixClient, realmServerURL: serverURL, definitionLookup, cardSizeLimitBytes: Number( @@ -319,7 +318,7 @@ const getIndexHTML = async () => { let server = new RealmServer({ realms, virtualNetwork, - matrixClient: realmServerMatrixClient, + matrixClient, realmsRootPath, realmServerSecretSeed: REALM_SERVER_SECRET_SEED, realmSecretSeed: REALM_SECRET_SEED, diff --git a/packages/realm-server/node-realm.ts b/packages/realm-server/node-realm.ts index 825f69da4c..cecb13e0bb 100644 --- a/packages/realm-server/node-realm.ts +++ b/packages/realm-server/node-realm.ts @@ -241,7 +241,11 @@ export class NodeAdapter implements RealmAdapter { dbAdapter: DBAdapter, ): Promise { realmEventsLog.debug('Broadcasting realm event', event); - + const eventWithRealmURL: RealmEventContent = { + ...event, + realmURL: realmUrl, + }; + let realmUserId; if (dbAdapter.isClosed) { realmEventsLog.warn( `Database adapter is closed, skipping sending realm event`, @@ -250,19 +254,35 @@ export class NodeAdapter implements RealmAdapter { } try { await matrixClient.login(); + realmUserId = matrixClient.getUserId(); + if (!realmUserId) { + realmEventsLog.error( + 'Matrix client has no user ID after login, unable to broadcast realm event', + event, + ); + return; + } } catch (e) { realmEventsLog.error('Error logging into matrix. Skipping broadcast', e); return; } - let dmRooms = await this.waitForSessionRooms(dbAdapter, realmUrl); + let dmRooms = await this.waitForSessionRooms( + dbAdapter, + realmUrl, + realmUserId, + ); realmEventsLog.debug('Sending to dm rooms', Object.values(dmRooms)); for (let userId of Object.keys(dmRooms)) { let roomId = dmRooms[userId]; try { - await matrixClient.sendEvent(roomId, APP_BOXEL_REALM_EVENT_TYPE, event); + await matrixClient.sendEvent( + roomId, + APP_BOXEL_REALM_EVENT_TYPE, + eventWithRealmURL, + ); } catch (e) { realmEventsLog.error( `Unable to send event in room ${roomId} for user ${userId}`, @@ -276,6 +296,7 @@ export class NodeAdapter implements RealmAdapter { private async waitForSessionRooms( dbAdapter: DBAdapter, realmUrl: string, + realmUserId: string, attempts = 3, delayMs = 50, ): Promise> { @@ -285,7 +306,7 @@ export class NodeAdapter implements RealmAdapter { let dmRooms: Record = {}; try { - dmRooms = await fetchAllSessionRooms(dbAdapter, realmUrl); + dmRooms = await fetchAllSessionRooms(dbAdapter, realmUrl, realmUserId); } catch (e) { realmEventsLog.error('Error getting account data', e); return {}; // bail immediately on errors instead of retrying @@ -303,6 +324,7 @@ export class NodeAdapter implements RealmAdapter { return await this.waitForSessionRooms( dbAdapter, realmUrl, + realmUserId, attempts - 1, delayMs, ); diff --git a/packages/realm-server/routes.ts b/packages/realm-server/routes.ts index 03e52ecb8f..690c9b8ca9 100644 --- a/packages/realm-server/routes.ts +++ b/packages/realm-server/routes.ts @@ -65,7 +65,6 @@ export type CreateRoutesArgs = { createAndMountRealm: ( path: string, url: string, - username: string, copiedFromRealm?: URL, enableFileWatcher?: boolean, fromScratchIndexPriority?: number, diff --git a/packages/realm-server/server.ts b/packages/realm-server/server.ts index b4d3fd3850..2b37d53bc2 100644 --- a/packages/realm-server/server.ts +++ b/packages/realm-server/server.ts @@ -37,7 +37,6 @@ import { fetchRequestFromContext, methodOverrideSupport, } from './middleware'; -import { registerUser } from './synapse'; import convertAcceptHeaderQueryParam from './middleware/convert-accept-header-qp'; import convertAuthHeaderQueryParam from './middleware/convert-auth-header-qp'; import { NodeAdapter } from './node-realm'; @@ -47,10 +46,7 @@ import merge from 'lodash/merge'; import { extractSupportedMimeType } from '@cardstack/runtime-common/router'; import * as Sentry from '@sentry/node'; import type { MatrixClient } from '@cardstack/runtime-common/matrix-client'; -import { - passwordFromSeed, - getMatrixUsername, -} from '@cardstack/runtime-common/matrix-client'; +import { getMatrixUsername } from '@cardstack/runtime-common/matrix-client'; import { createRoutes } from './routes'; import { APP_BOXEL_REALM_SERVER_EVENT_MSGTYPE } from '@cardstack/runtime-common/matrix-constants'; import type { Prerenderer } from '@cardstack/runtime-common'; @@ -690,18 +686,7 @@ export class RealmServer { let realmPath = resolve(join(this.realmsRootPath, ownerUsername, endpoint)); ensureDirSync(realmPath); - let username = `realm/${ownerUsername}_${endpoint}`; - let { userId } = await registerUser({ - matrixURL: this.matrixClient.matrixURL, - displayname: username, - username, - password: await passwordFromSeed(username, this.realmSecretSeed), - registrationSecret: await this.getMatrixRegistrationSecret(), - }); - this.log.debug(`created realm bot user '${userId}' for new realm ${url}`); - await insertPermissions(this.dbAdapter, new URL(url), { - [userId]: DEFAULT_PERMISSIONS, [ownerUserId]: DEFAULT_PERMISSIONS, }); @@ -745,12 +730,10 @@ export class RealmServer { let realm = this.createAndMountRealm( realmPath, url, - username, undefined, undefined, userInitiatedPriority, ); - await realm.ensureSessionRoom(ownerUserId); return { realm, @@ -761,7 +744,6 @@ export class RealmServer { private createAndMountRealm = ( path: string, url: string, - username: string, copiedFromRealm?: URL, enableFileWatcher?: boolean, fromScratchIndexPriority?: number, @@ -788,11 +770,7 @@ export class RealmServer { virtualNetwork: this.virtualNetwork, dbAdapter: this.dbAdapter, queue: this.queue, - matrix: { - url: new URL(this.matrixClient.matrixURL), - username, - }, - realmServerMatrixClient: this.matrixClient, + matrixClient: this.matrixClient, realmServerURL: this.serverURL.href, definitionLookup: this.definitionLookup, cardSizeLimitBytes: this.cardSizeLimitBytes, @@ -850,7 +828,6 @@ export class RealmServer { continue; } let adapter = new NodeAdapter(realmPath, this.enableFileWatcher); - let username = `realm/${owner}_${realmName}`; let realm = new Realm({ url, adapter, @@ -858,11 +835,7 @@ export class RealmServer { virtualNetwork: this.virtualNetwork, dbAdapter: this.dbAdapter, queue: this.queue, - matrix: { - url: this.matrixClient.matrixURL, - username, - }, - realmServerMatrixClient: this.matrixClient, + matrixClient: this.matrixClient, realmServerURL: this.serverURL.href, definitionLookup: this.definitionLookup, cardSizeLimitBytes: this.cardSizeLimitBytes, @@ -980,7 +953,6 @@ export class RealmServer { } let adapter = new NodeAdapter(realmPath, this.enableFileWatcher); - let username = publishedRealmRow.owner_username; let realm = new Realm({ url: publishedRealmUrl, @@ -989,11 +961,7 @@ export class RealmServer { virtualNetwork: this.virtualNetwork, dbAdapter: this.dbAdapter, queue: this.queue, - matrix: { - url: this.matrixClient.matrixURL, - username, - }, - realmServerMatrixClient: this.matrixClient, + matrixClient: this.matrixClient, realmServerURL: this.serverURL.href, definitionLookup: this.definitionLookup, cardSizeLimitBytes: this.cardSizeLimitBytes, @@ -1038,11 +1006,11 @@ export class RealmServer { eventType: string, data?: Record, ) => { - let roomId = await fetchSessionRoom( - this.dbAdapter, - REALM_SERVER_REALM, - user, - ); + if (!this.matrixClient.isLoggedIn()) { + await this.matrixClient.login(); + } + let realmUserId = this.matrixClient.getUserId()!; + let roomId = await fetchSessionRoom(this.dbAdapter, realmUserId, user); if (!roomId) { console.error( `Failed to send event: ${eventType}, cannot find session room for user: ${user}`, diff --git a/packages/realm-server/tests/card-dependencies-endpoint-test.ts b/packages/realm-server/tests/card-dependencies-endpoint-test.ts index 8650a5fcc5..67472566f3 100644 --- a/packages/realm-server/tests/card-dependencies-endpoint-test.ts +++ b/packages/realm-server/tests/card-dependencies-endpoint-test.ts @@ -90,6 +90,7 @@ module(basename(__filename), function () { setupPermissionedRealm(hooks, { permissions: { john: ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/card-endpoints-test.ts b/packages/realm-server/tests/card-endpoints-test.ts index 169320be2d..2a3e7c26fe 100644 --- a/packages/realm-server/tests/card-endpoints-test.ts +++ b/packages/realm-server/tests/card-endpoints-test.ts @@ -87,6 +87,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -138,11 +139,7 @@ module(basename(__filename), function () { module: `./person`, name: 'Person', }, - // FIXME see elsewhere… global fix? - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -538,6 +535,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, published: true, @@ -587,10 +585,7 @@ module(basename(__filename), function () { module: `./person`, name: 'Person', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, relationships: { @@ -613,6 +608,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -793,6 +789,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -1160,10 +1157,7 @@ module(basename(__filename), function () { name: 'Friend', module: 'http://localhost:4202/node-test/friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -1350,10 +1344,7 @@ module(basename(__filename), function () { name: 'Friend', module: 'http://localhost:4202/node-test/friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -1476,10 +1467,7 @@ module(basename(__filename), function () { name: 'Friend', module: 'http://localhost:4202/node-test/friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo realmURL: testRealmHref, }, links: { @@ -1531,10 +1519,7 @@ module(basename(__filename), function () { name: 'Friend', module: 'http://localhost:4202/node-test/friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo realmURL: testRealmHref, }, links: { @@ -1748,10 +1733,7 @@ module(basename(__filename), function () { name: 'Friend', module: 'http://localhost:4202/node-test/friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -1844,6 +1826,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -2432,10 +2415,7 @@ module(basename(__filename), function () { name: 'Friend', module: './friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -2622,10 +2602,7 @@ module(basename(__filename), function () { name: 'Friend', module: '../friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -2748,10 +2725,7 @@ module(basename(__filename), function () { name: 'Friend', module: '../friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo realmURL: testRealmHref, }, links: { @@ -2803,10 +2777,7 @@ module(basename(__filename), function () { name: 'Friend', module: '../friend', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo realmURL: testRealmHref, }, links: { @@ -3008,10 +2979,7 @@ module(basename(__filename), function () { module: 'http://localhost:4202/node-test/friend-with-used-link', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -3106,10 +3074,7 @@ module(basename(__filename), function () { module: 'http://localhost:4202/node-test/friend-with-used-link', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -3264,6 +3229,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, cardSizeLimitBytes: 512, onRealmSetup, @@ -3382,6 +3348,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -3534,6 +3501,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, fileSystem: { 'greeting.txt': 'hello', @@ -3600,6 +3568,7 @@ module(basename(__filename), function () { realmURL: providerRealmURL, permissions: { '*': ['read', 'write', 'realm-owner'], + '@node-test_realm:localhost': ['read'], }, fileSystem: { 'person.gts': ` @@ -3629,6 +3598,7 @@ module(basename(__filename), function () { realmURL: consumerRealmURL, permissions: { '*': ['read', 'write', 'realm-owner'], + '@node-test_realm:localhost': ['read'], }, fileSystem: { 'favorite-finder.gts': ` diff --git a/packages/realm-server/tests/card-source-endpoints-test.ts b/packages/realm-server/tests/card-source-endpoints-test.ts index 5450943b72..2b8b351979 100644 --- a/packages/realm-server/tests/card-source-endpoints-test.ts +++ b/packages/realm-server/tests/card-source-endpoints-test.ts @@ -73,6 +73,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -353,6 +354,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { john: ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -402,6 +404,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -475,6 +478,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -547,6 +551,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -588,6 +593,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -918,6 +924,7 @@ module(basename(__filename), function () { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: `${testRealmURL}test-card.gts`, + realmURL: testRealmURL.href, }, }, { @@ -927,6 +934,7 @@ module(basename(__filename), function () { indexType: 'incremental', invalidations: [`${testRealmURL}test-card.gts`], clientRequestId: null, + realmURL: testRealmURL.href, }, }, { @@ -935,6 +943,7 @@ module(basename(__filename), function () { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: `${testRealmURL}test-card.gts`, + realmURL: testRealmURL.href, }, }, { @@ -944,6 +953,7 @@ module(basename(__filename), function () { indexType: 'incremental', invalidations: [`${testRealmURL}test-card.gts`, id], clientRequestId: null, + realmURL: testRealmURL.href, }, }, { @@ -952,6 +962,7 @@ module(basename(__filename), function () { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: `${id}.json`, + realmURL: testRealmURL.href, }, }, { @@ -961,6 +972,7 @@ module(basename(__filename), function () { indexType: 'incremental', invalidations: [id], clientRequestId: null, + realmURL: testRealmURL.href, }, }, ]; @@ -982,6 +994,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, cardSizeLimitBytes: 512, onRealmSetup, @@ -1016,6 +1029,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -1069,6 +1083,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -1182,6 +1197,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, cardSizeLimitBytes: 512, onRealmSetup, @@ -1208,6 +1224,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/file-watcher-events-test.ts b/packages/realm-server/tests/file-watcher-events-test.ts index 5057b1b6ae..7ea7583510 100644 --- a/packages/realm-server/tests/file-watcher-events-test.ts +++ b/packages/realm-server/tests/file-watcher-events-test.ts @@ -59,6 +59,7 @@ module(basename(__filename), function () { setupPermissionedRealmAtURL(hooks, realmURL, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, subscribeToRealmEvents: true, onRealmSetup, @@ -186,6 +187,7 @@ module(basename(__filename), function () { assert.deepEqual(updateEvent.content, { eventName: 'update', added: basename(newFilePath), + realmURL: realmURL.href, }); }); @@ -221,6 +223,7 @@ module(basename(__filename), function () { assert.deepEqual(updateEvent.content, { eventName: 'update', updated: basename(updatedFilePath), + realmURL: realmURL.href, }); }); @@ -244,6 +247,7 @@ module(basename(__filename), function () { assert.deepEqual(updateEvent.content, { eventName: 'update', removed: basename(deletedFilePath), + realmURL: realmURL.href, }); }); diff --git a/packages/realm-server/tests/helpers/index.ts b/packages/realm-server/tests/helpers/index.ts index 16b8903826..afb80a174f 100644 --- a/packages/realm-server/tests/helpers/index.ts +++ b/packages/realm-server/tests/helpers/index.ts @@ -34,7 +34,6 @@ import { PUBLISHED_DIRECTORY_NAME, DEFAULT_CARD_SIZE_LIMIT_BYTES, clearSessionRooms, - upsertSessionRoom, type MatrixConfig, type QueuePublisher, type QueueRunner, @@ -161,7 +160,7 @@ export const testRealmInfo = { interactHome: null, hostHome: null, visibility: 'public', - realmUserId: testMatrix.username, + realmUserId: testRealmServerMatrixUserId, publishable: null, lastPublishedAt: null, }; @@ -449,7 +448,6 @@ export async function createRealm({ runner, publisher, dbAdapter, - matrixConfig = testMatrix, withWorker, enableFileWatcher = false, cardSizeLimitBytes, @@ -494,14 +492,14 @@ export async function createRealm({ dbAdapter, queuePublisher: publisher, virtualNetwork, - matrixURL: matrixConfig.url, + matrixURL: realmServerTestMatrix.url, secretSeed: realmSecretSeed, realmServerMatrixUsername: testRealmServerMatrixUsername, prerenderer, createPrerenderAuth: testCreatePrerenderAuth, }); } - let realmServerMatrixClient = new MatrixClient({ + let matrixClient = new MatrixClient({ matrixURL: realmServerTestMatrix.url, username: realmServerTestMatrix.username, seed: realmSecretSeed, @@ -509,12 +507,11 @@ export async function createRealm({ let realm = new Realm({ url: realmURL, adapter, - matrix: matrixConfig, secretSeed: realmSecretSeed, virtualNetwork, dbAdapter, queue: publisher, - realmServerMatrixClient, + matrixClient, realmServerURL: new URL(new URL(realmURL).origin).href, definitionLookup, cardSizeLimitBytes: @@ -793,7 +790,6 @@ export function setupPermissionedRealms( // We want 2 different realm users to test authorization between them - these // names are selected because they are already available in the test // environment (via register-realm-users.ts) - let matrixUsers = ['test_realm', 'node-test_realm']; let realms: { realm: Realm; realmPath: string; @@ -808,7 +804,7 @@ export function setupPermissionedRealms( runner: QueueRunner, ) => { _dbAdapter = dbAdapter; - for (let [i, realmArg] of realmsArg.entries()) { + for (let realmArg of realmsArg.values()) { let { testRealmDir: realmPath, testRealm: realm, @@ -822,10 +818,6 @@ export function setupPermissionedRealms( fileSystem: realmArg.fileSystem, permissions: realmArg.permissions, matrixURL, - matrixConfig: { - url: matrixURL, - username: matrixUsers[i] ?? matrixUsers[0], - }, dbAdapter, publisher, runner, @@ -1047,13 +1039,6 @@ export function setupMatrixRoom( } testAuthRoomId = payload.sessionRoom; - - await upsertSessionRoom( - realmSetup.dbAdapter, - realmSetup.testRealm.url, - userId, - payload.sessionRoom, - ); }); return { diff --git a/packages/realm-server/tests/helpers/indexing.ts b/packages/realm-server/tests/helpers/indexing.ts index 972b2be34c..26648c881f 100644 --- a/packages/realm-server/tests/helpers/indexing.ts +++ b/packages/realm-server/tests/helpers/indexing.ts @@ -88,12 +88,14 @@ export async function expectIncrementalIndexEvent( eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: targetUrl, + realmURL: realm, }); let expectedIncrementalContent: any = { eventName: 'index', indexType: 'incremental', invalidations: [invalidation], + realmURL: realm, }; let actualContent = { ...incrementalEventContent }; diff --git a/packages/realm-server/tests/indexing-test.ts b/packages/realm-server/tests/indexing-test.ts index 5a8a485620..6c6b7ff5ee 100644 --- a/packages/realm-server/tests/indexing-test.ts +++ b/packages/realm-server/tests/indexing-test.ts @@ -2051,6 +2051,7 @@ module(basename(__filename), function () { }, consumer: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, }); diff --git a/packages/realm-server/tests/realm-auth-test.ts b/packages/realm-server/tests/realm-auth-test.ts index 94a6629558..e3cea76122 100644 --- a/packages/realm-server/tests/realm-auth-test.ts +++ b/packages/realm-server/tests/realm-auth-test.ts @@ -12,6 +12,7 @@ import { insertUser, realmSecretSeed, testRealmHref, + testRealmServerMatrixUserId, } from './helpers'; import { createJWT as createRealmServerJWT } from '../utils/jwt'; @@ -25,6 +26,7 @@ module(basename(__filename), function () { permissions: { '*': ['read'], [matrixUserId]: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup: ({ dbAdapter: adapter, request: req }) => { dbAdapter = adapter; @@ -53,7 +55,7 @@ module(basename(__filename), function () { let existingRoom = await fetchSessionRoom( dbAdapter, - testRealmHref, + testRealmServerMatrixUserId, matrixUserId, ); assert.strictEqual( @@ -88,7 +90,7 @@ module(basename(__filename), function () { let sessionRoom = await fetchSessionRoom( dbAdapter, - testRealmHref, + testRealmServerMatrixUserId, matrixUserId, ); assert.strictEqual( diff --git a/packages/realm-server/tests/realm-endpoints-test.ts b/packages/realm-server/tests/realm-endpoints-test.ts index ec261bf94f..1aaf3f0f13 100644 --- a/packages/realm-server/tests/realm-endpoints-test.ts +++ b/packages/realm-server/tests/realm-endpoints-test.ts @@ -113,6 +113,7 @@ module(basename(__filename), function () { '*': ['read', 'write'], user: ['read', 'write', 'realm-owner'], carol: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, realmURL, onRealmSetup, @@ -337,7 +338,6 @@ module(basename(__filename), function () { type: 'realm-config', attributes: { ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', backgroundURL: 'new-bg', }, }, @@ -934,7 +934,7 @@ module(basename(__filename), function () { assert.strictEqual(response.status, 200, 'HTTP 200 status'); }); - test('can index a newly added file', async function (assert) { + test.only('can index a newly added file', async function (assert) { let realmEventTimestampStart = Date.now(); let postResponse = await request @@ -988,6 +988,7 @@ module(basename(__filename), function () { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: `${newCardId}.json`, + realmURL: testRealmHref, }); assert.deepEqual(incrementalEvent?.content, { @@ -995,6 +996,7 @@ module(basename(__filename), function () { indexType: 'incremental', invalidations: [newCardId], clientRequestId: null, + realmURL: testRealmHref, }); { @@ -1032,10 +1034,7 @@ module(basename(__filename), function () { module: '../person', name: 'Person', }, - realmInfo: { - ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', - }, + realmInfo: testRealmInfo, realmURL: testRealmHref, }, links: { @@ -1152,12 +1151,14 @@ module(basename(__filename), function () { eventName: 'index', indexType: 'incremental-index-initiation', updatedFile: `${testRealmHref}person-1.json`, + realmURL: testRealmHref, }); assert.deepEqual(incrementalEvent?.content, { eventName: 'index', indexType: 'incremental', invalidations: [`${testRealmHref}person-1`], + realmURL: testRealmHref, }); { diff --git a/packages/realm-server/tests/realm-endpoints/directory-test.ts b/packages/realm-server/tests/realm-endpoints/directory-test.ts index 5c146758bc..6782d6a341 100644 --- a/packages/realm-server/tests/realm-endpoints/directory-test.ts +++ b/packages/realm-server/tests/realm-endpoints/directory-test.ts @@ -100,6 +100,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/realm-endpoints/info-test.ts b/packages/realm-server/tests/realm-endpoints/info-test.ts index 94fffd24a7..d77aed49d3 100644 --- a/packages/realm-server/tests/realm-endpoints/info-test.ts +++ b/packages/realm-server/tests/realm-endpoints/info-test.ts @@ -80,7 +80,6 @@ module(`realm-endpoints/${basename(__filename)}`, function () { type: 'realm-info', attributes: { ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', }, }, }, @@ -93,6 +92,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, realmURL, onRealmSetup, @@ -151,7 +151,6 @@ module(`realm-endpoints/${basename(__filename)}`, function () { attributes: { ...testRealmInfo, visibility: 'private', - realmUserId: '@node-test_realm:localhost', }, }, }, @@ -166,6 +165,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { users: ['read'], + '@node-test_realm:localhost': ['read'], }, realmURL, onRealmSetup, @@ -193,7 +193,6 @@ module(`realm-endpoints/${basename(__filename)}`, function () { attributes: { ...testRealmInfo, visibility: 'shared', - realmUserId: '@node-test_realm:localhost', }, }, }, @@ -209,6 +208,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { bob: ['read'], jane: ['read'], john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, realmURL, onRealmSetup, @@ -236,7 +236,6 @@ module(`realm-endpoints/${basename(__filename)}`, function () { attributes: { ...testRealmInfo, visibility: 'shared', - realmUserId: '@node-test_realm:localhost', }, }, }, diff --git a/packages/realm-server/tests/realm-endpoints/lint-test.ts b/packages/realm-server/tests/realm-endpoints/lint-test.ts index f7e42bbefd..b5700c13f5 100644 --- a/packages/realm-server/tests/realm-endpoints/lint-test.ts +++ b/packages/realm-server/tests/realm-endpoints/lint-test.ts @@ -28,6 +28,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/realm-endpoints/mtimes-test.ts b/packages/realm-server/tests/realm-endpoints/mtimes-test.ts index 0ef403c5a0..ba09a520d4 100644 --- a/packages/realm-server/tests/realm-endpoints/mtimes-test.ts +++ b/packages/realm-server/tests/realm-endpoints/mtimes-test.ts @@ -30,6 +30,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { mary: ['read'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/realm-endpoints/permissions-test.ts b/packages/realm-server/tests/realm-endpoints/permissions-test.ts index eac68d6d56..f194821479 100644 --- a/packages/realm-server/tests/realm-endpoints/permissions-test.ts +++ b/packages/realm-server/tests/realm-endpoints/permissions-test.ts @@ -43,6 +43,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { permissions: { mary: ['read', 'write', 'realm-owner'], bob: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/realm-endpoints/search-test.ts b/packages/realm-server/tests/realm-endpoints/search-test.ts index 3f58562f66..9b27a3610c 100644 --- a/packages/realm-server/tests/realm-endpoints/search-test.ts +++ b/packages/realm-server/tests/realm-endpoints/search-test.ts @@ -351,6 +351,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read'], + '@node-test_realm:localhost': ['read'], }, realmURL: new URL('http://127.0.0.1:4444/test/'), onRealmSetup, @@ -407,6 +408,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { '*': ['read'], + '@node-test_realm:localhost': ['read'], }, realmURL: new URL('http://127.0.0.1:4444/test/'), onRealmSetup, diff --git a/packages/realm-server/tests/realm-endpoints/user-test.ts b/packages/realm-server/tests/realm-endpoints/user-test.ts index 066d7a2d76..35de5d41a0 100644 --- a/packages/realm-server/tests/realm-endpoints/user-test.ts +++ b/packages/realm-server/tests/realm-endpoints/user-test.ts @@ -66,6 +66,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); @@ -475,6 +476,7 @@ module(`realm-endpoints/${basename(__filename)}`, function () { setupPermissionedRealm(hooks, { permissions: { john: ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/search-prerendered-test.ts b/packages/realm-server/tests/search-prerendered-test.ts index b0881e8099..9777aa5808 100644 --- a/packages/realm-server/tests/search-prerendered-test.ts +++ b/packages/realm-server/tests/search-prerendered-test.ts @@ -978,6 +978,7 @@ module(basename(__filename), function () { realmURL, permissions: { john: ['read'], + '@node-test_realm:localhost': ['read'], }, fileSystem: { 'person.gts': ` diff --git a/packages/realm-server/tests/server-endpoints/helpers.ts b/packages/realm-server/tests/server-endpoints/helpers.ts index 832ddfbd02..060d5b63c0 100644 --- a/packages/realm-server/tests/server-endpoints/helpers.ts +++ b/packages/realm-server/tests/server-endpoints/helpers.ts @@ -73,6 +73,7 @@ export function setupServerEndpointsTest( setupPermissionedRealm(hooks, { permissions: { '*': ['read', 'write'], + '@node-test_realm:localhost': ['read'], }, onRealmSetup, }); diff --git a/packages/realm-server/tests/server-endpoints/realm-lifecycle-test.ts b/packages/realm-server/tests/server-endpoints/realm-lifecycle-test.ts index 1a964718e1..0035911513 100644 --- a/packages/realm-server/tests/server-endpoints/realm-lifecycle-test.ts +++ b/packages/realm-server/tests/server-endpoints/realm-lifecycle-test.ts @@ -17,6 +17,7 @@ import { createJWT, realmSecretSeed, testRealmInfo, + testRealmServerMatrixUserId, } from '../helpers'; import { createJWT as createRealmServerJWT } from '../../utils/jwt'; import { setupServerEndpointsTest, testRealm2URL } from './helpers'; @@ -116,17 +117,12 @@ module(`server-endpoints/${basename(__filename)}`, function () { new URL(json.data.id), ); assert.deepEqual(permissions, { - [`@realm/mango_${endpoint}:localhost`]: [ - 'read', - 'write', - 'realm-owner', - ], [ownerUserId]: ['read', 'write', 'realm-owner'], }); let sessionRoom = await fetchSessionRoom( context.dbAdapter, - json.data.id, + testRealmServerMatrixUserId, ownerUserId, ); assert.ok( diff --git a/packages/realm-server/tests/server-endpoints/user-and-catalog-test.ts b/packages/realm-server/tests/server-endpoints/user-and-catalog-test.ts index 1aebb19061..ab0062d426 100644 --- a/packages/realm-server/tests/server-endpoints/user-and-catalog-test.ts +++ b/packages/realm-server/tests/server-endpoints/user-and-catalog-test.ts @@ -85,7 +85,6 @@ module(`server-endpoints/${basename(__filename)}`, function () { id: `${testRealm2URL}`, attributes: { ...testRealmInfo, - realmUserId: '@node-test_realm:localhost', }, }, ], diff --git a/packages/runtime-common/db-queries/session-room-queries.ts b/packages/runtime-common/db-queries/session-room-queries.ts index 17d9d23efe..091cac4777 100644 --- a/packages/runtime-common/db-queries/session-room-queries.ts +++ b/packages/runtime-common/db-queries/session-room-queries.ts @@ -8,12 +8,14 @@ export const REALM_SERVER_REALM = '__realm-server__'; */ export async function fetchSessionRoom( dbAdapter: DBAdapter, - realmURL: string, + realmUserId: string, matrixUserId: string, ) { let rows = await query(dbAdapter, [ - 'SELECT room_id FROM session_rooms WHERE realm_url =', - param(realmURL), + 'SELECT room_id FROM session_rooms WHERE realm_user_id =', + param(realmUserId), + 'AND realm_url = ', + param(REALM_SERVER_REALM), 'AND matrix_user_id =', param(matrixUserId), ]); @@ -31,14 +33,16 @@ export async function fetchSessionRoom( */ export async function upsertSessionRoom( dbAdapter: DBAdapter, - realmURL: string, + realmUserId: string, matrixUserId: string, roomId: string, ) { await query(dbAdapter, [ - 'INSERT INTO session_rooms (realm_url, matrix_user_id, room_id, created_at, updated_at)', + 'INSERT INTO session_rooms (realm_url, realm_user_id, matrix_user_id, room_id, created_at, updated_at)', 'VALUES (', - param(realmURL), + param(REALM_SERVER_REALM), + ',', + param(realmUserId), ',', param(matrixUserId), ',', @@ -52,6 +56,9 @@ export async function upsertSessionRoom( 'room_id =', param(roomId), ',', + 'realm_user_id =', + param(realmUserId), + ',', 'updated_at =', dbExpression({ pg: 'NOW()', sqlite: 'CURRENT_TIMESTAMP' }), ]); @@ -63,10 +70,20 @@ export async function upsertSessionRoom( export async function fetchAllSessionRooms( dbAdapter: DBAdapter, realmURL: string, + realmUserId: string, ) { let rows = await query(dbAdapter, [ - 'SELECT matrix_user_id, room_id FROM session_rooms WHERE realm_url =', + 'SELECT sr.matrix_user_id, sr.room_id', + 'FROM session_rooms sr', + 'JOIN realm_user_permissions rup', + 'ON rup.username = sr.matrix_user_id', + 'WHERE rup.realm_url =', param(realmURL), + 'AND (rup.read = true OR rup.write = true)', + 'AND sr.realm_user_id =', + param(realmUserId), + 'AND sr.realm_url =', + param(REALM_SERVER_REALM), ]); let result: Record = {}; diff --git a/packages/runtime-common/realm.ts b/packages/runtime-common/realm.ts index 513d2f1752..c4265c0316 100644 --- a/packages/runtime-common/realm.ts +++ b/packages/runtime-common/realm.ts @@ -396,7 +396,6 @@ export type RequestContext = { realm: Realm; permissions: RealmPermissions }; export class Realm { #startedUp = new Deferred(); #matrixClient: MatrixClient; - #realmServerMatrixClient: MatrixClient; #realmServerURL: string; #realmIndexUpdater: RealmIndexUpdater; #realmIndexQueryEngine: RealmIndexQueryEngine; @@ -411,7 +410,6 @@ export class Realm { #disableModuleCaching = false; #fullIndexOnStartup = false; #fromScratchIndexPriority = systemInitiatedPriority; - #realmServerMatrixUserId: string; #definitionLookup: DefinitionLookup; #copiedFromRealm: URL | undefined; #sourceCache = new AliasCache(); @@ -459,24 +457,22 @@ export class Realm { { url, adapter, - matrix, secretSeed, dbAdapter, queue, virtualNetwork, - realmServerMatrixClient, + matrixClient, realmServerURL, definitionLookup, cardSizeLimitBytes, }: { url: string; adapter: RealmAdapter; - matrix: MatrixConfig; secretSeed: string; dbAdapter: DBAdapter; queue: QueuePublisher; virtualNetwork: VirtualNetwork; - realmServerMatrixClient: MatrixClient; + matrixClient: MatrixClient; realmServerURL: string; definitionLookup: DefinitionLookup; cardSizeLimitBytes?: number; @@ -484,7 +480,6 @@ export class Realm { opts?: Options, ) { this.paths = new RealmPaths(new URL(url)); - let { username, url: matrixURL } = matrix; this.#realmSecretSeed = secretSeed; this.#dbAdapter = dbAdapter; this.#adapter = adapter; @@ -492,19 +487,10 @@ export class Realm { this.#fullIndexOnStartup = opts?.fullIndexOnStartup ?? false; this.#fromScratchIndexPriority = opts?.fromScratchIndexPriority ?? systemInitiatedPriority; - this.#realmServerMatrixClient = realmServerMatrixClient; + this.#matrixClient = matrixClient; this.#realmServerURL = ensureTrailingSlash(realmServerURL); this.#cardSizeLimitBytes = cardSizeLimitBytes ?? DEFAULT_CARD_SIZE_LIMIT_BYTES; - this.#realmServerMatrixUserId = userIdFromUsername( - realmServerMatrixClient.username, - realmServerMatrixClient.matrixURL.href, - ); - this.#matrixClient = new MatrixClient({ - matrixURL, - username, - seed: secretSeed, - }); this.#disableModuleCaching = Boolean(opts?.disableModuleCaching); this.#copiedFromRealm = opts?.copiedFromRealm; let owner: string | undefined; @@ -534,7 +520,7 @@ export class Realm { // server so that we can assume user that owns this realm. refactor this // back to using the realm's own matrix client after running cards in // headless chrome lands. - new RealmAuthDataSource(this.#realmServerMatrixClient, () => _fetch), + new RealmAuthDataSource(this.#matrixClient, () => _fetch), ), ]); @@ -691,7 +677,7 @@ export class Realm { async ensureSessionRoom(matrixUserId: string): Promise { let sessionRoom = await fetchSessionRoom( this.#dbAdapter, - this.url, + this.#matrixClient.getUserId(), matrixUserId, ); @@ -700,7 +686,7 @@ export class Realm { sessionRoom = await this.#matrixClient.createDM(matrixUserId); await upsertSessionRoom( this.#dbAdapter, - this.url, + this.#matrixClient.getUserId(), matrixUserId, sessionRoom, ); @@ -1447,7 +1433,12 @@ export class Realm { ensureSessionRoom: async (userId: string) => this.ensureSessionRoom(userId), setSessionRoom: (userId: string, roomId: string) => - upsertSessionRoom(this.#dbAdapter, this.url, userId, roomId), + upsertSessionRoom( + this.#dbAdapter, + this.#matrixClient.getUserId(), + userId, + roomId, + ), } as Utils, ); @@ -4371,18 +4362,19 @@ export class Realm { private async createRequestContext( requiredPermission: RealmAction, ): Promise { + let realmServerMatrixUserId = this.#matrixClient.getUserId(); let permissions: RealmPermissions; let shouldUseWorldReadable = requiredPermission === 'read' && (await this.isWorldReadable()); if (shouldUseWorldReadable) { permissions = { - [this.#realmServerMatrixUserId]: ['assume-user'], + [realmServerMatrixUserId]: ['assume-user'], '*': ['read'], }; } else { permissions = { - [this.#realmServerMatrixUserId]: ['assume-user'], + [realmServerMatrixUserId]: ['assume-user'], ...(await fetchRealmPermissions(this.#dbAdapter, new URL(this.url))), }; }