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(),