diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml
index 9f905723717..27bd6aab4dd 100644
--- a/.github/workflows/static_analysis.yaml
+++ b/.github/workflows/static_analysis.yaml
@@ -51,7 +51,6 @@ jobs:
allowed-hardcoded-keys: |
console_dev_note
labs|element_call_video_rooms
- labs|feature_disable_call_per_sender_encryption
voip|element_call
error|invalid_json
error|misconfigured
diff --git a/docs/labs.md b/docs/labs.md
index a4ab78b08b2..68d6d20c3b8 100644
--- a/docs/labs.md
+++ b/docs/labs.md
@@ -92,15 +92,6 @@ This feature allows users to place native [MSC3401](https://github.com/matrix-or
If you're enabling this at the deployment level, you may also want to reference the docs for the `element_call` config section.
-## Disable per-sender encryption for Element Call (`feature_disable_call_per_sender_encryption`)
-
-The default for embedded Element Call in Element Web is per-participant encryption.
-This labs flag disables encryption for embedded Element Call in encrypted rooms.
-
-Under the hood this stops Element Web from adding the `perParticipantE2EE` flag for the Element Call widget url.
-
-This is useful while we experiment with encryption and to make calling compatible with platforms that don't use encryption yet.
-
## Enable the notifications panel in the room header (`feature_notifications`)
Unreliable in encrypted rooms.
diff --git a/playwright/e2e/voip/element-call.spec.ts b/playwright/e2e/voip/element-call.spec.ts
index 7c2494d2ae2..366bb73125a 100644
--- a/playwright/e2e/voip/element-call.spec.ts
+++ b/playwright/e2e/voip/element-call.spec.ts
@@ -31,7 +31,6 @@ function assertCommonCallParameters(
expect(url.has("widgetId")).toEqual(true);
expect(url.has("parentUrl")).toEqual(true);
- expect(hash.get("perParticipantE2EE")).toEqual("false");
expect(hash.get("userId")).toEqual(user.userId);
expect(hash.get("deviceId")).toEqual(user.deviceId);
expect(hash.get("roomId")).toEqual(room.roomId);
diff --git a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx b/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx
index 16ef5c22344..74c81b81723 100644
--- a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx
+++ b/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx
@@ -35,7 +35,6 @@ export const CallGuestLinkButton: React.FC<{ room: Room }> = ({ room }) => {
url.pathname = "/room/";
// Set params for the sharable url
url.searchParams.set("roomId", room.roomId);
- if (room.hasEncryptionStateEvent()) url.searchParams.set("perParticipantE2EE", "true");
for (const server of calculateRoomVia(room)) {
url.searchParams.set("viaServers", server);
}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 400c2d16796..2afd1d6ba3a 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -1535,7 +1535,6 @@
"experimental_description": "Feeling experimental? Try out our latest ideas in development. These features are not finalised; they may be unstable, may change, or may be dropped altogether. Learn more.",
"experimental_section": "Early previews",
"extended_profiles_msc_support": "Requires your server to support MSC4133",
- "feature_disable_call_per_sender_encryption": "Disable per-sender encryption for Element Call",
"feature_wysiwyg_composer_description": "Use rich text instead of Markdown in the message composer.",
"group_calls": "New group call experience",
"group_developer": "Developer",
diff --git a/src/models/Call.ts b/src/models/Call.ts
index 39e4aa4b9a6..9c7486b4368 100644
--- a/src/models/Call.ts
+++ b/src/models/Call.ts
@@ -754,7 +754,6 @@ export class ElementCall extends Call {
// Parameters can be found in https://github.com/element-hq/element-call/blob/livekit/src/UrlParams.ts.
const params = new URLSearchParams({
// Template variables are used, so that this can be configured using the widget data.
- perParticipantE2EE: "$perParticipantE2EE",
userId: client.getUserId()!,
deviceId: client.getDeviceId()!,
roomId: roomId,
@@ -873,27 +872,15 @@ export class ElementCall extends Call {
overwriteData: IWidgetData,
voiceOnly?: boolean,
): IWidgetData {
- let perParticipantE2EE = false;
- if (
- client.getRoom(roomId)?.hasEncryptionStateEvent() &&
- !SettingsStore.getValue("feature_disable_call_per_sender_encryption")
- )
- perParticipantE2EE = true;
-
const intent = ElementCall.getWidgetIntent(client, roomId, voiceOnly);
return {
...currentData,
...overwriteData,
intent,
- perParticipantE2EE,
};
}
- private onCallEncryptionSettingsChange(): void {
- this.widget.data = ElementCall.getWidgetData(this.client, this.roomId, this.widget.data ?? {}, {});
- }
-
private constructor(
public session: MatrixRTCSession,
widget: IApp,
@@ -903,11 +890,6 @@ export class ElementCall extends Call {
this.session.on(MatrixRTCSessionEvent.MembershipsChanged, this.onMembershipChanged);
this.client.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionEnded, this.checkDestroy);
- SettingsStore.watchSetting(
- "feature_disable_call_per_sender_encryption",
- null,
- this.onCallEncryptionSettingsChange.bind(this),
- );
this.updateParticipants();
}
diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
index 2fdc1a79a21..cc663a708b2 100644
--- a/src/settings/Settings.tsx
+++ b/src/settings/Settings.tsx
@@ -222,7 +222,6 @@ export interface Settings {
"feature_simplified_sliding_sync": IFeature;
"feature_element_call_video_rooms": IFeature;
"feature_group_calls": IFeature;
- "feature_disable_call_per_sender_encryption": IFeature;
"feature_location_share_live": IFeature;
"feature_dynamic_room_predecessors": IFeature;
"feature_render_reaction_images": IFeature;
@@ -644,14 +643,6 @@ export const SETTINGS: Settings = {
controller: new ReloadOnChangeController(),
default: false,
},
- "feature_disable_call_per_sender_encryption": {
- isFeature: true,
- labsGroup: LabGroup.VoiceAndVideo,
- supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED,
- supportedLevelsAreOrdered: true,
- displayName: _td("labs|feature_disable_call_per_sender_encryption"),
- default: false,
- },
"feature_location_share_live": {
isFeature: true,
labsGroup: LabGroup.Messaging,
diff --git a/test/unit-tests/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx b/test/unit-tests/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx
index 4ba3cfc4104..590005aeb65 100644
--- a/test/unit-tests/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx
+++ b/test/unit-tests/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx
@@ -33,7 +33,7 @@ describe("", () => {
const targetUnencrypted =
"https://guest_spa_url.com/room/#/!room:server.org?roomId=%21room%3Aserver.org&viaServers=example.org";
const targetEncrypted =
- "https://guest_spa_url.com/room/#/!room:server.org?roomId=%21room%3Aserver.org&perParticipantE2EE=true&viaServers=example.org";
+ "https://guest_spa_url.com/room/#/!room:server.org?roomId=%21room%3Aserver.org&viaServers=example.org";
const expectedShareDialogProps = {
target: targetEncrypted,
customTitle: "Conference invite link",
@@ -183,8 +183,6 @@ describe("", () => {
getComponent(room);
const modalSpy = jest.spyOn(Modal, "createDialog");
fireEvent.click(getByLabelText(document.body, _t("voip|get_call_link")));
- // const target =
- // "https://guest_spa_url.com/room/#/!room:server.org?roomId=%21room%3Aserver.org&perParticipantE2EE=true&viaServers=example.org";
expect(modalSpy).toHaveBeenCalled();
const arg0 = modalSpy.mock.calls[0][0];
const arg1 = modalSpy.mock.calls[0][1] as any;
diff --git a/test/unit-tests/models/Call-test.ts b/test/unit-tests/models/Call-test.ts
index e26ae85fa49..80347829c87 100644
--- a/test/unit-tests/models/Call-test.ts
+++ b/test/unit-tests/models/Call-test.ts
@@ -38,8 +38,7 @@ import {
ElementCall,
ElementCallIntent,
} from "../../../src/models/Call";
-import { cleanUpClientRoomAndStores, enableCalls, mockPlatformPeg, setUpClientRoomAndStores } from "../../test-utils";
-import WidgetStore from "../../../src/stores/WidgetStore";
+import { cleanUpClientRoomAndStores, mockPlatformPeg, setUpClientRoomAndStores } from "../../test-utils";
import { WidgetMessagingStore } from "../../../src/stores/widgets/WidgetMessagingStore";
import ActiveWidgetStore, { ActiveWidgetStoreEvent } from "../../../src/stores/ActiveWidgetStore";
import { ElementWidgetActions } from "../../../src/stores/widgets/ElementWidgetActions";
@@ -50,8 +49,6 @@ import SdkConfig from "../../../src/SdkConfig.ts";
import DMRoomMap from "../../../src/utils/DMRoomMap.ts";
import { WidgetMessagingEvent, type WidgetMessaging } from "../../../src/stores/widgets/WidgetMessaging.ts";
-const { enabledSettings } = enableCalls();
-
const setUpWidget = (
call: Call,
): { widget: Widget; messaging: Mocked; widgetApi: Mocked } => {
@@ -983,25 +980,6 @@ describe("ElementCall", () => {
call.destroy();
expect(destroyPersistentWidgetSpy).toHaveBeenCalled();
});
-
- it("the perParticipantE2EE url flag is used in encrypted rooms while respecting the feature_disable_call_per_sender_encryption flag", async () => {
- // We destroy the call created in beforeEach because we test the call creation process.
- call.destroy();
- const addWidgetSpy = jest.spyOn(WidgetStore.instance, "addVirtualWidget");
- // If a room is not encrypted we will never add the perParticipantE2EE flag.
- const roomSpy = jest.spyOn(room, "hasEncryptionStateEvent").mockReturnValue(true);
-
- // should create call with perParticipantE2EE flag
- ElementCall.create(room);
- expect(Call.get(room)?.widget?.data?.perParticipantE2EE).toBe(true);
-
- // should create call without perParticipantE2EE flag
- 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");
- roomSpy.mockRestore();
- addWidgetSpy.mockRestore();
- });
});
describe("instance in a video room", () => {