1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-07 23:02:56 +03:00

Ignore memberships of users that are not in the call (#4065)

* ignore memberships of users that are not in the call

Signed-off-by: Timo K <toger5@hotmail.de>

* recompute memberships on room member change.

Signed-off-by: Timo K <toger5@hotmail.de>

* fix Tests and add test for left member

Signed-off-by: Timo K <toger5@hotmail.de>

* fix event type

Signed-off-by: Timo K <toger5@hotmail.de>

* fix import desaster

Signed-off-by: Timo K <toger5@hotmail.de>

* fix mocks

Signed-off-by: Timo K <toger5@hotmail.de>

---------

Signed-off-by: Timo K <toger5@hotmail.de>
This commit is contained in:
Timo
2024-02-14 14:04:40 +01:00
committed by GitHub
parent 5d7218476a
commit 74c109adac
3 changed files with 26 additions and 3 deletions

View File

@@ -74,6 +74,13 @@ describe("MatrixRTCSession", () => {
expect(sess?.memberships[0].deviceId).toEqual("AAAAAAA"); expect(sess?.memberships[0].deviceId).toEqual("AAAAAAA");
}); });
it("ignores memberships events of members not in the room", () => {
const mockRoom = makeMockRoom([membershipTemplate]);
mockRoom.hasMembershipState = (state) => state === "join";
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
expect(sess?.memberships.length).toEqual(0);
});
it("honours created_ts", () => { it("honours created_ts", () => {
const expiredMembership = Object.assign({}, membershipTemplate); const expiredMembership = Object.assign({}, membershipTemplate);
expiredMembership.created_ts = 500; expiredMembership.created_ts = 500;
@@ -91,9 +98,12 @@ describe("MatrixRTCSession", () => {
it("safely ignores events with no memberships section", () => { it("safely ignores events with no memberships section", () => {
const mockRoom = { const mockRoom = {
...makeMockRoom([]),
roomId: randomString(8), roomId: randomString(8),
getLiveTimeline: jest.fn().mockReturnValue({ getLiveTimeline: jest.fn().mockReturnValue({
getState: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({
on: jest.fn(),
off: jest.fn(),
getStateEvents: (_type: string, _stateKey: string) => [ getStateEvents: (_type: string, _stateKey: string) => [
{ {
getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix),
@@ -112,9 +122,12 @@ describe("MatrixRTCSession", () => {
it("safely ignores events with junk memberships section", () => { it("safely ignores events with junk memberships section", () => {
const mockRoom = { const mockRoom = {
...makeMockRoom([]),
roomId: randomString(8), roomId: randomString(8),
getLiveTimeline: jest.fn().mockReturnValue({ getLiveTimeline: jest.fn().mockReturnValue({
getState: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({
on: jest.fn(),
off: jest.fn(),
getStateEvents: (_type: string, _stateKey: string) => [ getStateEvents: (_type: string, _stateKey: string) => [
{ {
getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix),

View File

@@ -24,6 +24,7 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number
const roomState = makeMockRoomState(memberships, roomId, localAge); const roomState = makeMockRoomState(memberships, roomId, localAge);
return { return {
roomId: roomId, roomId: roomId,
hasMembershipState: jest.fn().mockReturnValue(true),
getLiveTimeline: jest.fn().mockReturnValue({ getLiveTimeline: jest.fn().mockReturnValue({
getState: jest.fn().mockReturnValue(roomState), getState: jest.fn().mockReturnValue(roomState),
}), }),
@@ -33,6 +34,8 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number
export function makeMockRoomState(memberships: CallMembershipData[], roomId: string, localAge: number | null = null) { export function makeMockRoomState(memberships: CallMembershipData[], roomId: string, localAge: number | null = null) {
const event = mockRTCEvent(memberships, roomId, localAge); const event = mockRTCEvent(memberships, roomId, localAge);
return { return {
on: jest.fn(),
off: jest.fn(),
getStateEvents: (_: string, stateKey: string) => { getStateEvents: (_: string, stateKey: string) => {
if (stateKey !== undefined) return event; if (stateKey !== undefined) return event;
return [event]; return [event];

View File

@@ -21,6 +21,7 @@ import { Room } from "../models/room";
import { MatrixClient } from "../client"; import { MatrixClient } from "../client";
import { EventType } from "../@types/event"; import { EventType } from "../@types/event";
import { CallMembership, CallMembershipData } from "./CallMembership"; import { CallMembership, CallMembershipData } from "./CallMembership";
import { RoomStateEvent } from "../models/room-state";
import { Focus } from "./focus"; import { Focus } from "./focus";
import { MatrixError, MatrixEvent } from "../matrix"; import { MatrixError, MatrixEvent } from "../matrix";
import { randomString, secureRandomBase64Url } from "../randomstring"; import { randomString, secureRandomBase64Url } from "../randomstring";
@@ -152,9 +153,11 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
} }
if (membership.isExpired()) { if (membership.isExpired()) {
logger.info( logger.info(`Ignoring expired device membership ${membership.sender}/${membership.deviceId}`);
`Ignoring expired device membership ${memberEvent.getSender()}/${membership.deviceId}`, continue;
); }
if (!room.hasMembershipState(membership.sender ?? "", "join")) {
logger.info(`Ignoring membership of user ${membership.sender} who is not in the room.`);
continue; continue;
} }
callMemberships.push(membership); callMemberships.push(membership);
@@ -191,6 +194,8 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
) { ) {
super(); super();
this._callId = memberships[0]?.callId; this._callId = memberships[0]?.callId;
const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
roomState?.on(RoomStateEvent.Members, this.onMembershipUpdate);
this.setExpiryTimer(); this.setExpiryTimer();
} }
@@ -214,6 +219,8 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
clearTimeout(this.memberEventTimeout); clearTimeout(this.memberEventTimeout);
this.memberEventTimeout = undefined; this.memberEventTimeout = undefined;
} }
const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
roomState?.off(RoomStateEvent.Members, this.onMembershipUpdate);
} }
/** /**