Skip to content

Commit 6a30780

Browse files
committed
Element-R: add a listener for room membership events
we need to track the devices of users that join the room after us.
1 parent 64a9d6b commit 6a30780

File tree

4 files changed

+49
-3
lines changed

4 files changed

+49
-3
lines changed

src/client.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -2183,7 +2183,11 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
21832183
// importing rust-crypto will download the webassembly, so we delay it until we know it will be
21842184
// needed.
21852185
const RustCrypto = await import("./rust-crypto");
2186-
this.cryptoBackend = await RustCrypto.initRustCrypto(this.http, userId, deviceId);
2186+
const rustCrypto = await RustCrypto.initRustCrypto(this.http, userId, deviceId);
2187+
this.cryptoBackend = rustCrypto;
2188+
2189+
// attach the event listeners needed by RustCrypto
2190+
this.on(RoomMemberEvent.Membership, rustCrypto.onRoomMembership.bind(rustCrypto));
21872191
}
21882192

21892193
/**

src/rust-crypto/RoomEncryptor.ts

+21
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { IContent, MatrixEvent } from "../models/event";
2020
import { Room } from "../models/room";
2121
import { logger, PrefixedLogger } from "../logger";
2222
import { KeyClaimManager } from "./KeyClaimManager";
23+
import { RoomMember } from "../models/room-member";
2324

2425
/**
2526
* RoomEncryptor: responsible for encrypting messages to a given room
@@ -53,6 +54,26 @@ export class RoomEncryptor {
5354
}
5455
}
5556

57+
/**
58+
* Handle a new `m.room.member` event in this room
59+
*
60+
* @param member - new membership state
61+
*/
62+
public onRoomMembership(member: RoomMember): void {
63+
this.prefixedLogger.debug(`${member.membership} event for ${member.userId}`);
64+
65+
if (
66+
member.membership == "join" ||
67+
(member.membership == "invite" && this.room.shouldEncryptForInvitedMembers())
68+
) {
69+
// make sure we are tracking the deviceList for this user
70+
this.prefixedLogger.debug(`starting to track devices for: ${member.userId}`);
71+
this.olmMachine.updateTrackedUsers([new UserId(member.userId)]);
72+
}
73+
74+
// TODO: handle leaves (including our own)
75+
}
76+
5677
/**
5778
* Prepare to encrypt events in this room.
5879
*

src/rust-crypto/index.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-js";
1818

1919
import { RustCrypto } from "./rust-crypto";
2020
import { logger } from "../logger";
21-
import { CryptoBackend } from "../common-crypto/CryptoBackend";
2221
import { RUST_SDK_STORE_PREFIX } from "./constants";
2322
import { IHttpOpts, MatrixHttpApi } from "../http-api";
2423

2524
export async function initRustCrypto(
2625
http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,
2726
userId: string,
2827
deviceId: string,
29-
): Promise<CryptoBackend> {
28+
): Promise<RustCrypto> {
3029
// initialise the rust matrix-sdk-crypto-js, if it hasn't already been done
3130
await RustSdkCryptoJs.initAsync();
3231

src/rust-crypto/rust-crypto.ts

+22
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type { IToDeviceEvent } from "../sync-accumulator";
2121
import type { IEncryptedEventInfo } from "../crypto/api";
2222
import { MatrixEvent } from "../models/event";
2323
import { Room } from "../models/room";
24+
import { RoomMember } from "../models/room-member";
2425
import { CryptoBackend, OnSyncCompletedData } from "../common-crypto/CryptoBackend";
2526
import { logger } from "../logger";
2627
import { IHttpOpts, MatrixHttpApi } from "../http-api";
@@ -227,6 +228,27 @@ export class RustCrypto implements CryptoBackend {
227228
this.outgoingRequestLoop();
228229
}
229230

231+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
232+
//
233+
// Other public functions
234+
//
235+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
236+
237+
/** called by the MatrixClient on a room membership event
238+
*
239+
* @param event - The matrix event which caused this event to fire.
240+
* @param member - The member whose RoomMember.membership changed.
241+
* @param oldMembership - The previous membership state. Null if it's a new member.
242+
*/
243+
public onRoomMembership(event: MatrixEvent, member: RoomMember, oldMembership?: string): void {
244+
const enc = this.roomEncryptors[event.getRoomId()!];
245+
if (!enc) {
246+
// not encrypting in this room
247+
return;
248+
}
249+
enc.onRoomMembership(member);
250+
}
251+
230252
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
231253
//
232254
// Outgoing requests

0 commit comments

Comments
 (0)