diff --git a/src/hooks/room/useRoomCall.ts b/src/hooks/room/useRoomCall.ts index 308c1dc5cb..852804aa9d 100644 --- a/src/hooks/room/useRoomCall.ts +++ b/src/hooks/room/useRoomCall.ts @@ -282,7 +282,7 @@ export const useRoomCall = ( url.pathname = "/room/"; // Set params for the sharable url url.searchParams.set("roomId", room.roomId); - url.searchParams.set("perParticipantE2EE", "true"); + if (room.hasEncryptionStateEvent()) url.searchParams.set("perParticipantE2EE", "true"); for (const server of calculateRoomVia(room)) { url.searchParams.set("viaServers", server); } diff --git a/src/models/Call.ts b/src/models/Call.ts index d970499ef6..c7d53284cc 100644 --- a/src/models/Call.ts +++ b/src/models/Call.ts @@ -778,7 +778,10 @@ export class ElementCall extends Call { overwriteData: IWidgetData, ): IWidgetData { let perParticipantE2EE = false; - if (client.isRoomEncrypted(roomId) && !SettingsStore.getValue("feature_disable_call_per_sender_encryption")) + if ( + client.getRoom(roomId)?.hasEncryptionStateEvent() && + !SettingsStore.getValue("feature_disable_call_per_sender_encryption") + ) perParticipantE2EE = true; return { ...currentData, diff --git a/test/components/views/rooms/RoomHeader-test.tsx b/test/components/views/rooms/RoomHeader-test.tsx index 55506bae49..dfe361c17c 100644 --- a/test/components/views/rooms/RoomHeader-test.tsx +++ b/test/components/views/rooms/RoomHeader-test.tsx @@ -563,9 +563,10 @@ describe("RoomHeader", () => { const { container } = render(, getWrapper()); expect(getByLabelText(container, _t("voip|get_call_link"))).toBeInTheDocument(); }); - it("opens the share dialog with the correct share link", () => { + it("opens the share dialog with the correct share link in an encrypted room", () => { jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Public); jest.spyOn(SdkContextClass.instance.roomViewStore, "isViewingCall").mockReturnValue(true); + jest.spyOn(room, "hasEncryptionStateEvent").mockReturnValue(true); const { container } = render(, getWrapper()); const modalSpy = jest.spyOn(Modal, "createDialog"); @@ -583,6 +584,20 @@ describe("RoomHeader", () => { }); expect(arg1.target.toString()).toEqual(target); }); + + it("share dialog has correct link in an unencrypted room", () => { + jest.spyOn(room, "getJoinRule").mockReturnValue(JoinRule.Public); + jest.spyOn(room, "hasEncryptionStateEvent").mockReturnValue(false); + jest.spyOn(SdkContextClass.instance.roomViewStore, "isViewingCall").mockReturnValue(true); + + const { container } = render(, getWrapper()); + const modalSpy = jest.spyOn(Modal, "createDialog"); + fireEvent.click(getByLabelText(container, _t("voip|get_call_link"))); + const target = + "https://guest_spa_url.com/room/#/!1:example.org?roomId=%211%3Aexample.org&viaServers=example.org"; + const arg1 = modalSpy.mock.calls[0][1] as any; + expect(arg1.target.toString()).toEqual(target); + }); }); describe("public room", () => { diff --git a/test/models/Call-test.ts b/test/models/Call-test.ts index 1b2fa5a2c5..5748b507ac 100644 --- a/test/models/Call-test.ts +++ b/test/models/Call-test.ts @@ -1039,7 +1039,7 @@ describe("ElementCall", () => { call.destroy(); const addWidgetSpy = jest.spyOn(WidgetStore.instance, "addVirtualWidget"); // If a room is not encrypted we will never add the perParticipantE2EE flag. - client.isRoomEncrypted.mockReturnValue(true); + const roomSpy = jest.spyOn(room, "hasEncryptionStateEvent").mockReturnValue(true); // should create call with perParticipantE2EE flag ElementCall.create(room); @@ -1049,8 +1049,7 @@ describe("ElementCall", () => { enabledSettings.add("feature_disable_call_per_sender_encryption"); expect(Call.get(room)?.widget?.data?.perParticipantE2EE).toBe(false); enabledSettings.delete("feature_disable_call_per_sender_encryption"); - - client.isRoomEncrypted.mockClear(); + roomSpy.mockRestore(); addWidgetSpy.mockRestore(); }); diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index dbbfff30b9..75778dbbe7 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -624,6 +624,7 @@ export function mkStubRoom( isElementVideoRoom: jest.fn().mockReturnValue(false), isSpaceRoom: jest.fn().mockReturnValue(false), isCallRoom: jest.fn().mockReturnValue(false), + hasEncryptionStateEvent: jest.fn().mockReturnValue(false), loadMembersIfNeeded: jest.fn(), maySendMessage: jest.fn().mockReturnValue(true), myUserId: client?.getUserId(),