Fix external guest access url for unencrypted rooms (#12345)

* use unencrypted calls in unencrypted rooms (make external call links compatible with unencrypted embedded calls)

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

* use same logic in Call.ts

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

* fix tests

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

* fix test

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

---------

Signed-off-by: Timo K <toger5@hotmail.de>
pull/28217/head
Timo 2024-03-28 13:25:00 +01:00 committed by GitHub
parent 75a989e409
commit 09f0d11e7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 24 additions and 6 deletions

View File

@ -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);
}

View File

@ -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,

View File

@ -563,9 +563,10 @@ describe("RoomHeader", () => {
const { container } = render(<RoomHeader room={room} />, 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(<RoomHeader room={room} />, 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(<RoomHeader room={room} />, 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", () => {

View File

@ -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();
});

View File

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