Skip to content

Commit a966fa8

Browse files
committed
Merge branch 'develop' into toger5/start-voice-call-in-pip
2 parents 82efc9c + f93f680 commit a966fa8

314 files changed

Lines changed: 2912 additions & 13474 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/desktop/.node-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24.16.0
1+
24.18.0

apps/desktop/dockerbuild/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Docker image to facilitate building Element Desktop's native bits using a glibc version (2.31)
22
# with broader compatibility, down to Debian bullseye & Ubuntu focal.
33

4-
FROM rust:bullseye@sha256:e12c121572a8e557ce164e10755da72047be5b689edb5ae617a6a5d37683a0fc
4+
FROM rust:bullseye@sha256:21d112adb6ab370d39eef8f861f10b42342419b9569e7a05dac15e19eb65a3b4
55

66
ENV DEBIAN_FRONTEND=noninteractive
77

apps/desktop/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
"app-builder-lib": "26.15.3",
8787
"chokidar": "^5.0.0",
8888
"detect-libc": "^2.0.0",
89-
"electron": "42.4.1",
89+
"electron": "42.5.0",
9090
"electron-builder": "26.15.3",
9191
"electron-builder-squirrel-windows": "26.15.3",
9292
"electron-devtools-installer": "^4.0.0",

apps/desktop/playwright/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM mcr.microsoft.com/playwright:v1.61.0-jammy@sha256:264136758e43332108f6420f82c47f639f619ca65301065ceade677763f477ec
1+
FROM mcr.microsoft.com/playwright:v1.61.1-jammy@sha256:7b86926fff94374389e8e1f4fdc5c76d050d4a06a7886bb537bf412b20e2b71e
22

33
WORKDIR /work
44

apps/desktop/src/macos-titlebar.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,9 @@ export function setupMacosTitleBar(window: BrowserWindow): void {
115115
116116
.mx_LeftPanel::before {
117117
content: "";
118-
height: 20px;
119-
-webkit-app-region: drag;
120-
}
121-
122-
.mx_LeftPanel_newRoomList::before {
123-
/* Aligned with the room header */
124118
height: 13px;
125119
border-right: 1px solid var(--cpd-color-bg-subtle-primary);
120+
-webkit-app-region: drag;
126121
}
127122
128123
.mx_RoomView::before,

apps/web/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Context must be the root of the monorepo
33

44
# Builder
5-
FROM --platform=$BUILDPLATFORM node:24-bullseye@sha256:c10a2aa8adf4af8e64ff547de794ce259e7344b8ed3888e7f8023825c339a830 AS builder
5+
FROM --platform=$BUILDPLATFORM node:24-bullseye@sha256:b2f4f5e6553256d611490b757e7aa80da1faae9d264d77ac8c2ddca96ace9d68 AS builder
66

77
# Support custom branch of the js-sdk. This also helps us build images of element-web develop.
88
ARG USE_CUSTOM_SDKS=false
@@ -25,7 +25,7 @@ RUN --mount=type=bind,source=.git,target=/src/.git /src/scripts/docker-package.s
2525
RUN cp /src/apps/web/config.sample.json /src/apps/web/webapp/config.json
2626

2727
# App
28-
FROM nginxinc/nginx-unprivileged:alpine-slim@sha256:8f92ff79b9e9039b1ec2e363a04ce89c95c30e3d0be545bf6263024f5c21a2a8
28+
FROM nginxinc/nginx-unprivileged:alpine-slim@sha256:ee7751c78fd1a51a8c12ac5a0ab15b2de2d486df155ef95bf52db9cef7de0d2d
2929

3030
# Need root user to install packages & manipulate the usr directory
3131
USER root

apps/web/package.json

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
"escape-html": "^1.0.3",
7171
"events": "^3.3.0",
7272
"file-saver": "^2.0.5",
73-
"filesize": "11.0.18",
73+
"filesize": "11.0.19",
7474
"github-markdown-css": "^5.5.1",
7575
"glob-to-regexp": "^0.4.1",
7676
"highlight.js": "^11.3.1",
@@ -89,9 +89,9 @@
8989
"mime": "^4.0.4",
9090
"oidc-client-ts": "^3.0.1",
9191
"opus-recorder": "^8.0.3",
92-
"pako": "^2.0.3",
92+
"pako": "^3.0.0",
9393
"png-chunks-extract": "^1.0.0",
94-
"posthog-js": "1.394.0",
94+
"posthog-js": "1.396.0",
9595
"qrcode": "1.5.4",
9696
"re-resizable": "6.11.2",
9797
"react": "catalog:",
@@ -126,7 +126,7 @@
126126
"@babel/preset-env": "^7.12.11",
127127
"@babel/preset-react": "^7.12.10",
128128
"@babel/preset-typescript": "^7.12.7",
129-
"@element-hq/element-call-embedded": "0.20.1",
129+
"@element-hq/element-call-embedded": "0.20.2",
130130
"@element-hq/element-web-playwright-common": "workspace:*",
131131
"@fetch-mock/jest": "^0.2.20",
132132
"@fetch-mock/vitest": "^0.2.18",
@@ -154,7 +154,6 @@
154154
"@types/lodash": "^4.14.168",
155155
"@types/modernizr": "^3.5.3",
156156
"@types/node": "catalog:",
157-
"@types/pako": "^2.0.0",
158157
"@types/postcss-import": "^14.0.3",
159158
"@types/qrcode": "^1.3.5",
160159
"@types/react": "catalog:",

apps/web/playwright/e2e/crypto/dehydration.spec.ts

Lines changed: 52 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,15 @@ Please see LICENSE files in the repository root for full details.
88

99
import { test, expect } from "../../element-web-test";
1010
import { isDendrite } from "../../plugins/homeserver/dendrite";
11-
import { createBot, logIntoElement } from "./utils.ts";
11+
import {
12+
autoJoin,
13+
createBot,
14+
createSharedEncryptedRoomWithUser,
15+
enableKeyBackup,
16+
logIntoElement,
17+
logIntoElementAndVerify,
18+
logOutOfElement,
19+
} from "./utils.ts";
1220
import { type Client } from "../../pages/client.ts";
1321
import { type ElementAppPage } from "../../pages/ElementAppPage.ts";
1422

@@ -40,15 +48,10 @@ test.describe("Dehydration", () => {
4048
await settings.getByRole("button", { name: "Verify this device" }).click();
4149
await page.getByRole("button", { name: "Can't confirm?" }).click();
4250
await page.getByRole("button", { name: "Continue" }).click();
51+
await app.closeDialog();
4352

4453
// Set up recovery
45-
await page.getByRole("button", { name: "Get recovery key" }).click();
46-
await page.getByRole("button", { name: "Continue" }).click();
47-
const recoveryKey = await page.getByTestId("recoveryKey").innerText();
48-
await page.getByRole("button", { name: "Continue" }).click();
49-
await page.getByRole("textbox").fill(recoveryKey);
50-
await page.getByRole("button", { name: "Finish set up" }).click();
51-
await page.getByRole("button", { name: "Close" }).click();
54+
await enableKeyBackup(app);
5255

5356
await expectDehydratedDeviceEnabled(app);
5457

@@ -61,28 +64,7 @@ test.describe("Dehydration", () => {
6164

6265
test("'Get recovery key' creates dehydrated device", async ({ app, credentials, page }) => {
6366
await logIntoElement(page, credentials);
64-
65-
const settingsDialogLocator = await app.settings.openUserSettings("Encryption");
66-
await settingsDialogLocator.getByRole("button", { name: "Get recovery key" }).click();
67-
68-
// First it displays an informative panel about the recovery key
69-
await expect(settingsDialogLocator.getByRole("heading", { name: "Get recovery key" })).toBeVisible();
70-
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
71-
72-
// Next, it displays the new recovery key. We click on the copy button.
73-
await expect(settingsDialogLocator.getByText("Save your recovery key somewhere safe")).toBeVisible();
74-
await settingsDialogLocator.getByRole("button", { name: "Copy" }).click();
75-
const recoveryKey = await app.getClipboard();
76-
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
77-
78-
await expect(
79-
settingsDialogLocator.getByText("Enter your recovery key to confirm", { exact: true }),
80-
).toBeVisible();
81-
await settingsDialogLocator.getByRole("textbox").fill(recoveryKey);
82-
await settingsDialogLocator.getByRole("button", { name: "Finish set up" }).click();
83-
84-
await app.settings.closeDialog();
85-
67+
await enableKeyBackup(app);
8668
await expectDehydratedDeviceEnabled(app);
8769
});
8870

@@ -115,13 +97,7 @@ test.describe("Dehydration", () => {
11597
await page.getByRole("button", { name: "Continue" }).click();
11698

11799
// And set up recovery
118-
const settings = await app.settings.openUserSettings("Encryption");
119-
await settings.getByRole("button", { name: "Get recovery key" }).click();
120-
await settings.getByRole("button", { name: "Continue" }).click();
121-
const recoveryKey = await settings.getByTestId("recoveryKey").innerText();
122-
await settings.getByRole("button", { name: "Continue" }).click();
123-
await settings.getByRole("textbox").fill(recoveryKey);
124-
await settings.getByRole("button", { name: "Finish set up" }).click();
100+
await enableKeyBackup(app);
125101

126102
// There should be a brand new dehydrated device
127103
await expectDehydratedDeviceEnabled(app);
@@ -132,34 +108,54 @@ test.describe("Dehydration", () => {
132108

133109
// Create a dehydrated device by setting up recovery (see "'Set up
134110
// recovery' creates dehydrated device" test above)
135-
const settingsDialogLocator = await app.settings.openUserSettings("Encryption");
136-
await settingsDialogLocator.getByRole("button", { name: "Get recovery key" }).click();
137-
138-
// First it displays an informative panel about the recovery key
139-
await expect(settingsDialogLocator.getByRole("heading", { name: "Get recovery key" })).toBeVisible();
140-
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
141-
142-
// Next, it displays the new recovery key. We click on the copy button.
143-
await expect(settingsDialogLocator.getByText("Save your recovery key somewhere safe")).toBeVisible();
144-
await settingsDialogLocator.getByRole("button", { name: "Copy" }).click();
145-
const recoveryKey = await app.getClipboard();
146-
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
147-
148-
await expect(
149-
settingsDialogLocator.getByText("Enter your recovery key to confirm", { exact: true }),
150-
).toBeVisible();
151-
await settingsDialogLocator.getByRole("textbox").fill(recoveryKey);
152-
await settingsDialogLocator.getByRole("button", { name: "Finish set up" }).click();
153-
111+
await enableKeyBackup(app);
154112
await expectDehydratedDeviceEnabled(app);
155113

156114
// After recovery is set up, we reset our cryptographic identity, which
157115
// should drop the dehydrated device.
116+
const settingsDialogLocator = await app.settings.openUserSettings("Encryption");
158117
await settingsDialogLocator.getByRole("button", { name: "Reset cryptographic identity" }).click();
159118
await settingsDialogLocator.getByRole("button", { name: "Continue" }).click();
160119

161120
await expectDehydratedDeviceDisabled(app);
162121
});
122+
123+
test("Can read messages sent while logged out", async ({ page, user: credentials, app, bot: bob }) => {
124+
const recoveryKey =
125+
await test.step("Alice sets up cross-signing and recovery => a dehydrated device is created", async () => {
126+
// Create an identity, then set up recovery, to create a dehydrated device.
127+
await app.client.bootstrapCrossSigning(credentials);
128+
const recoveryKey = await enableKeyBackup(app);
129+
130+
await expectDehydratedDeviceEnabled(app);
131+
return recoveryKey;
132+
});
133+
134+
const testRoomId = await test.step("Bob and Alice make a shared room", async () => {
135+
await autoJoin(bob);
136+
137+
// create an encrypted room, and wait for Bob to join it.
138+
const testRoomId = await createSharedEncryptedRoomWithUser(app, bob.credentials.userId);
139+
140+
// Even though Alice has seen Bob's join event, Bob may not have done so yet. Wait for the sync to arrive.
141+
await bob.awaitRoomMembership(testRoomId);
142+
return testRoomId;
143+
});
144+
145+
await test.step("Alice logs out", async () => {
146+
await logOutOfElement(page);
147+
});
148+
149+
await test.step("Bob sends a message", async () => {
150+
await bob.sendMessage(testRoomId, "test encrypted 1");
151+
});
152+
153+
await test.step("Alice logs back in, and should be able to view Bob's message", async () => {
154+
await logIntoElementAndVerify(page, credentials, recoveryKey);
155+
await app.viewRoomById(testRoomId);
156+
await expect(page.getByText("test encrypted 1")).toBeVisible();
157+
});
158+
});
163159
});
164160

165161
async function getDehydratedDeviceIds(client: Client): Promise<string[]> {

apps/web/playwright/e2e/crypto/event-shields.spec.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { expect, test } from "../../element-web-test";
1212
import {
1313
autoJoin,
1414
createSecondBotDevice,
15-
createSharedRoomWithUser,
15+
createSharedEncryptedRoomWithUser,
1616
enableKeyBackup,
1717
logIntoElementAndVerify,
1818
logOutOfElement,
@@ -39,18 +39,7 @@ test.describe("Cryptography", function () {
3939
await autoJoin(bob);
4040

4141
// create an encrypted room, and wait for Bob to join it.
42-
testRoomId = await createSharedRoomWithUser(app, bob.credentials.userId, {
43-
name: "TestRoom",
44-
initial_state: [
45-
{
46-
type: "m.room.encryption",
47-
state_key: "",
48-
content: {
49-
algorithm: "m.megolm.v1.aes-sha2",
50-
},
51-
},
52-
],
53-
});
42+
testRoomId = await createSharedEncryptedRoomWithUser(app, bob.credentials.userId);
5443

5544
// Even though Alice has seen Bob's join event, Bob may not have done so yet. Wait for the sync to arrive.
5645
await bob.awaitRoomMembership(testRoomId);

apps/web/playwright/e2e/crypto/invisible-crypto.spec.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
66
*/
77

88
import { expect, test } from "../../element-web-test";
9-
import { autoJoin, createSecondBotDevice, createSharedRoomWithUser, verify } from "./utils";
9+
import { autoJoin, createSecondBotDevice, createSharedEncryptedRoomWithUser, verify } from "./utils";
1010
import { bootstrapCrossSigningForClient } from "../../pages/client.ts";
1111

1212
/** Tests for the "invisible crypto" behaviour -- i.e., when the "exclude insecure devices" setting is enabled */
@@ -29,18 +29,7 @@ test.describe("Invisible cryptography", () => {
2929
await autoJoin(bob);
3030

3131
// create an encrypted room
32-
const testRoomId = await createSharedRoomWithUser(app, bob.credentials.userId, {
33-
name: "TestRoom",
34-
initial_state: [
35-
{
36-
type: "m.room.encryption",
37-
state_key: "",
38-
content: {
39-
algorithm: "m.megolm.v1.aes-sha2",
40-
},
41-
},
42-
],
43-
});
32+
const testRoomId = await createSharedEncryptedRoomWithUser(app, bob.credentials.userId);
4433

4534
// Verify Bob
4635
await verify(app, bob);

0 commit comments

Comments
 (0)