You've already forked matrix-js-sdk
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:
@@ -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),
|
||||||
|
@@ -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];
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user