Compare commits

...

190 Commits

Author SHA1 Message Date
RiotRobot
edb79cba9d v1.12.0 2025-09-23 12:46:01 +00:00
RiotRobot
65b22386fa v1.12.0-rc.0 2025-09-17 09:22:43 +00:00
RiotRobot
2785778fb0 v1.11.113-rc.0 2025-09-17 09:17:46 +00:00
Johnny Arcitec
78aed022f5 Update Electron to v38.1.0 to fix Kernel crash on multi-GPU systems (#2544) 2025-09-16 14:13:17 +01:00
RiotRobot
2b0a9b83b6 Merge branch 'master' into develop 2025-09-16 12:27:23 +00:00
RiotRobot
15455ad4be v1.11.112 2025-09-16 12:26:45 +00:00
ElementRobot
87c22acaae [Backport staging] Handle unsupported macOS versions better (#2555)
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-09-16 13:23:08 +01:00
Michael Telatynski
3961e3d7bb Handle unsupported macOS versions better (#2552) 2025-09-16 12:49:31 +01:00
David Baker
b0a3b9e484 Merge pull request #2554 from element-hq/dbkr/no_drag_on_auth_page
Fix Confirm your identity buttons being unclickable
2025-09-16 12:26:34 +01:00
David Baker
7c5eb799d0 Fix Confirm your identity buttons being unclickable
Exclude the auth pager content from being a draggable area
2025-09-16 11:53:46 +01:00
RiotRobot
2bf3436a5b Merge branch 'master' into develop 2025-09-10 09:49:41 +00:00
RiotRobot
5682c38944 v1.11.111 2025-09-10 09:48:57 +00:00
ElementRobot
f5558add0f Merge pull request #2548 from element-hq/actions/localazy-download
Localazy Download
2025-09-10 07:30:35 +01:00
t3chguy
29dbe3284f [create-pull-request] automated change 2025-09-10 06:08:00 +00:00
byquanton
56e3e8389d Automatically select first source for desktop capture under Wayland (#2526) 2025-09-09 09:46:02 +01:00
Michael Telatynski
f1039d3fc2 Ensure dropdown is not a drag element on macOS (#2540) 2025-09-05 10:17:21 +01:00
Michael Telatynski
15f944581b Apply overrides from prepare artifact (#2503) 2025-09-04 13:18:31 +01:00
Michael Telatynski
b8bedd9c22 Reintroduce "Switch to a build variant config instead of magic env vars" (#2522) 2025-09-03 15:06:29 +01:00
renovate[bot]
5561e2efa3 Update electron-builder to v26.0.20 (#2530)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-03 10:10:12 +01:00
renovate[bot]
46192bd10e Update typescript-eslint monorepo to v8.41.0 (#2534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-03 10:08:22 +01:00
renovate[bot]
74444237d9 Update all non-major dependencies (#2531)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-09-02 15:18:06 +01:00
renovate[bot]
9b8ebd97ed Update playwright to v1.55.0 (#2533)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 15:02:15 +01:00
renovate[bot]
c770ea5e2c Update dependency png-to-ico to v3 (#2535)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 14:57:46 +01:00
renovate[bot]
942c4eabc3 Update dependency electron to v37.4.0 (#2532)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-02 13:54:23 +00:00
RiotRobot
d725093b10 v1.11.111-rc.0 2025-09-02 13:09:30 +00:00
ElementRobot
a0185ecf3c Merge pull request #2529 from element-hq/actions/localazy-download
Localazy Download
2025-09-01 08:22:13 +02:00
t3chguy
a969bde5fd [create-pull-request] automated change 2025-09-01 06:08:17 +00:00
Michael Telatynski
bcde9afce9 Revert "Switch to a build variant config instead of magic env vars (#2498)" (#2520) 2025-08-28 11:33:39 +01:00
Michael Telatynski
a50957973b Switch to a build variant config instead of magic env vars (#2498) 2025-08-28 08:28:22 +00:00
RiotRobot
08fc8722f1 Merge branch 'master' into develop 2025-08-27 14:12:47 +00:00
RiotRobot
79f917792a v1.11.110 2025-08-27 14:12:03 +00:00
Michael Telatynski
954e11947e Simplify the number of icons (#2497) 2025-08-20 11:11:46 +00:00
Michael Telatynski
58caf2d337 Load deb maintainer info from package.json to make it easier to override (#2502) 2025-08-20 09:47:47 +01:00
Michael Telatynski
da87f2e5be Remove legacy code for handling Riot->Element autoLauncher migration (#2501) 2025-08-20 09:11:34 +01:00
Michael Telatynski
3a780766de Remove deb fields replaces/breaks riot-desktop (#2500) 2025-08-20 09:10:34 +01:00
Michael Telatynski
4762bc137f Allow specifying the webapp artifact name for the reusable workflows (#2499) 2025-08-20 09:07:51 +01:00
renovate[bot]
e13c6a4797 Update actions/download-artifact action to v5 (#2513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 17:05:50 +01:00
renovate[bot]
a7ecf597dd Update actions/checkout action to v5 (#2512)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 17:05:43 +01:00
renovate[bot]
d261f95d86 Update typescript-eslint monorepo to v8.39.1 (#2510)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 17:05:35 +01:00
renovate[bot]
108b8574f0 Update dependency @types/node to v18.19.123 (#2509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 17:05:28 +01:00
renovate[bot]
cf2081effe Update electron (#2511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 17:05:23 +01:00
renovate[bot]
dd73fcc82e Update rust:bullseye Docker digest to 5b0defc (#2505)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 15:45:13 +00:00
renovate[bot]
3d39d6a1f1 Update dependency @stylistic/eslint-plugin to v5.2.3 (#2508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 16:28:04 +01:00
renovate[bot]
9b7bca653b Update babel monorepo to v7.28.3 (#2507)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 16:27:47 +01:00
renovate[bot]
25e8bd4906 Update all non-major dependencies (#2506)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 16:26:52 +01:00
renovate[bot]
6f6923b9fa Update actions/cache digest to 0400d5f (#2504)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-19 15:26:36 +00:00
RiotRobot
c58bedb312 v1.11.110-rc.0 2025-08-19 15:20:09 +00:00
renovate[bot]
479b823fdb Update Node.js to v22.18.0 (#2489)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-08-15 13:37:19 +01:00
ElementRobot
2ddced50e2 Merge pull request #2496 from element-hq/actions/localazy-download
Localazy Download
2025-08-13 08:21:41 +02:00
t3chguy
679b6146dd [create-pull-request] automated change 2025-08-13 06:08:21 +00:00
RiotRobot
3d0d131733 Merge branch 'master' into develop 2025-08-11 12:04:22 +00:00
RiotRobot
062f7ea977 v1.11.109 2025-08-11 12:03:47 +00:00
ElementRobot
38e3d473e6 Merge pull request #2492 from element-hq/actions/localazy-download
Localazy Download
2025-08-08 08:22:27 +02:00
t3chguy
5450102047 [create-pull-request] automated change 2025-08-08 06:09:15 +00:00
ElementRobot
5fd8cf189a Merge pull request #2491 from element-hq/actions/localazy-download
Localazy Download
2025-08-06 07:26:03 +01:00
t3chguy
77962c402b [create-pull-request] automated change 2025-08-06 06:09:34 +00:00
renovate[bot]
31bef3860e Update typescript-eslint monorepo to v8.39.0 (#2490)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 16:25:31 +01:00
renovate[bot]
81458c29ed Update dependency typescript to v5.9.2 (#2488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 16:22:03 +01:00
renovate[bot]
c61771de38 Update playwright to v1.54.2 (#2487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 16:19:23 +01:00
renovate[bot]
2c577bcf84 Update electron (#2486)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 15:09:07 +01:00
renovate[bot]
3360b069d8 Update docker (#2483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 15:06:35 +01:00
renovate[bot]
bb951131d1 Update dependency @types/node to v18.19.121 (#2485)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 15:05:08 +01:00
renovate[bot]
ada93d84e7 Update rust:bullseye Docker digest to b315f98 (#2484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 15:04:50 +01:00
RiotRobot
8cf16397a9 v1.11.109-rc.0 2025-08-05 13:17:13 +00:00
ElementRobot
8bbbdcc2af Merge pull request #2470 from element-hq/actions/localazy-download
Localazy Download
2025-08-01 07:33:18 +01:00
t3chguy
73f5aa0ffb [create-pull-request] automated change 2025-08-01 06:09:20 +00:00
RiotRobot
60c2ebfb19 Merge branch 'master' into develop 2025-07-30 14:42:24 +00:00
RiotRobot
8d39941559 v1.11.108 2025-07-30 14:41:30 +00:00
ElementRobot
4fc2099693 Merge pull request #2465 from element-hq/actions/localazy-download
Localazy Download
2025-07-30 07:34:18 +01:00
t3chguy
05321d2e94 [create-pull-request] automated change 2025-07-30 06:09:08 +00:00
RiotRobot
54a88af28c Merge branch 'master' into develop 2025-07-29 13:25:39 +00:00
RiotRobot
e8b4fc7660 v1.11.107 2025-07-29 13:25:01 +00:00
ElementRobot
85e1e83d1d Merge pull request #2464 from element-hq/actions/localazy-download
Localazy Download
2025-07-28 07:28:05 +01:00
t3chguy
1d09bb0016 [create-pull-request] automated change 2025-07-28 06:09:15 +00:00
ElementRobot
bff219808e Merge pull request #2462 from element-hq/actions/localazy-download
Localazy Download
2025-07-25 07:23:34 +01:00
t3chguy
00475e4bfa [create-pull-request] automated change 2025-07-25 06:08:27 +00:00
renovate[bot]
9b50bdb9a0 Update all non-major dependencies (#2455)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-07-22 16:35:39 +00:00
renovate[bot]
d97a6a743e Update typescript-eslint monorepo to v8.37.0 (#2460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:23:46 +01:00
renovate[bot]
5daf37de3e Update dependency @types/node to v18.19.120 (#2456)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:11:18 +01:00
renovate[bot]
2cbb6041c8 Update dependency electron to v37.2.3 (#2457)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:07:46 +01:00
renovate[bot]
0dc2cafb26 Update playwright to v1.54.1 (#2459)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:06:18 +01:00
renovate[bot]
45a7d1564a Update rust:bullseye Docker digest to aaa0999 (#2454)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 17:06:12 +01:00
renovate[bot]
003d813967 Update dependency @stylistic/eslint-plugin to v5.2.0 (#2458)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 16:59:56 +01:00
RiotRobot
cdb0a051e6 v1.11.107-rc.0 2025-07-22 13:34:51 +00:00
dependabot[bot]
cad16c7e3b Bump form-data from 4.0.1 to 4.0.4 (#2453)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 09:24:15 +00:00
renovate[bot]
6a61d24fb8 Update electron-builder to v26.0.19 (#2415)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 10:03:56 +01:00
ElementRobot
0bb49702ba Merge pull request #2452 from element-hq/actions/localazy-download
Localazy Download
2025-07-21 08:25:04 +02:00
t3chguy
d1a0196d44 [create-pull-request] automated change 2025-07-21 06:08:39 +00:00
Will Hunt
229e52d809 Merge pull request #2443 from element-hq/hs/add-support-for-windows-badges
Add support for overlaying notification badges on the Windows Taskbar icon.
2025-07-18 08:39:21 +01:00
Will Hunt
0c16caf519 copyrights 2025-07-18 08:22:58 +01:00
ElementRobot
def0864df3 Merge pull request #2448 from element-hq/actions/localazy-download
Localazy Download
2025-07-18 08:27:32 +02:00
t3chguy
2cb99596d2 [create-pull-request] automated change 2025-07-18 06:07:51 +00:00
Half-Shot
812dd20b39 fix i18n 2025-07-17 11:30:39 +01:00
Half-Shot
db78dbec09 Restore tray icon updates for Windows. 2025-07-17 10:05:47 +01:00
Half-Shot
31be440d37 Split out badge 2025-07-17 10:05:08 +01:00
Half-Shot
b13f3ba1bd Update with a proper comment 2025-07-17 09:55:53 +01:00
Florian Duros
82852a0d0b Merge pull request #2446 from element-hq/florianduros/new-room-list/macos-titlebar 2025-07-16 21:34:22 +02:00
Florian Duros
dd45096808 fix: reduce macos titlebar height with the new room list and expand the existing border 2025-07-16 14:14:29 +02:00
ElementRobot
88829a1726 Merge pull request #2445 from element-hq/actions/localazy-download
Localazy Download
2025-07-16 08:31:20 +02:00
t3chguy
205d1609cd [create-pull-request] automated change 2025-07-16 06:08:06 +00:00
RiotRobot
c5a5dab318 Merge branch 'master' into develop 2025-07-15 15:12:14 +00:00
RiotRobot
27582b5d8c v1.11.106 2025-07-15 15:10:13 +00:00
Will Hunt
92a7da38ea lint 2025-07-15 15:35:08 +01:00
Will Hunt
7c19e5f0a8 Move code; drop favicon updating for win32 2025-07-15 13:55:04 +01:00
Will Hunt
f91c07f929 Merge branch 'develop' into hs/add-support-for-windows-badges 2025-07-14 14:32:23 +01:00
Half-Shot
2d21835588 Document why we do this. 2025-07-14 14:32:01 +01:00
Half-Shot
79b9ac896a lint 2025-07-14 13:11:57 +01:00
Half-Shot
7d488cc06d Announce support for badge overlays 2025-07-14 13:11:16 +01:00
Half-Shot
ad8287112b invoke setOverlayIcon for Windows platforms 2025-07-14 13:10:58 +01:00
Michael Telatynski
4629eccb5a Revert "Temporarily disable sandbox signing (#2430)" (#2440) 2025-07-14 10:05:42 +01:00
renovate[bot]
8aba763e3e Update all non-major dependencies (#2432)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-07-09 11:13:50 +00:00
renovate[bot]
ec23373969 Update dependency @stylistic/eslint-plugin to v5 (#2437)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-09 08:24:58 +01:00
ElementRobot
c9ec2d2a84 Merge pull request #2421 from element-hq/actions/localazy-download
Localazy Download
2025-07-09 08:24:50 +02:00
t3chguy
e02e0b86e5 [create-pull-request] automated change 2025-07-09 06:08:15 +00:00
renovate[bot]
5dc47b9e77 Update dependency @types/node to v18.19.115 (#2433)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 17:31:32 +01:00
renovate[bot]
267e85cd4e Update playwright to v1.53.2 (#2434)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 16:31:22 +00:00
renovate[bot]
17b57d10f5 Update dependency electron to v37 (#2438)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 17:31:12 +01:00
renovate[bot]
2debea1f53 Update babel monorepo to v7.28.0 (#2436)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 17:30:27 +01:00
renovate[bot]
08d0e076fa Update typescript-eslint monorepo to v8.35.1 (#2435)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 17:16:19 +01:00
renovate[bot]
b08adafb62 Update rust:bullseye Docker digest to 8eb96c7 (#2431)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-08 16:13:43 +00:00
Michael Telatynski
c2bb7ebb6d Temporarily disable sandbox signing (#2430) 2025-07-08 16:43:29 +01:00
RiotRobot
3f94cb2619 v1.11.106-rc.0 2025-07-08 13:39:58 +00:00
RiotRobot
48a138102b Merge branch 'master' into develop 2025-07-01 15:33:50 +00:00
RiotRobot
93a72b3d72 v1.11.105 2025-07-01 15:32:42 +00:00
David Baker
343b7d75d0 Merge pull request #2417 from element-hq/renovate/electron
Update electron
2025-06-27 10:36:29 +01:00
David Baker
804933023a Remove mystery change to README 2025-06-25 11:16:25 +01:00
David Baker
5149911e38 Prettier 2025-06-25 11:13:25 +01:00
David Baker
c9a53ba25d Fix types 2025-06-25 11:11:57 +01:00
David Baker
abf15ef471 Merge pull request #2418 from element-hq/renovate/playwright
Update playwright to v1.53.1
2025-06-25 10:41:15 +01:00
David Baker
4d0add6309 Merge pull request #2416 from element-hq/renovate/typescript-eslint-monorepo
Update typescript-eslint monorepo to v8.34.1
2025-06-24 18:45:07 +01:00
David Baker
74f2ecb4a9 Merge pull request #2414 from element-hq/renovate/definitelytyped
Update dependency @types/node to v18.19.112
2025-06-24 18:44:36 +01:00
David Baker
8ce5cf0f10 Merge pull request #2413 from element-hq/renovate/all-minor-patch
Update all non-major dependencies
2025-06-24 18:44:12 +01:00
David Baker
b92d31e7a4 Merge pull request #2412 from element-hq/renovate/rust-bullseye
Update rust:bullseye Docker digest to af1a29a
2025-06-24 18:16:11 +01:00
David Baker
fd29e65112 Merge pull request #2411 from element-hq/renovate/docker
Update docker
2025-06-24 18:15:48 +01:00
renovate[bot]
75f93ab631 Update playwright to v1.53.1 2025-06-24 16:50:22 +00:00
renovate[bot]
4b56f3b1ca Update electron 2025-06-24 16:49:55 +00:00
renovate[bot]
a1b1245c77 Update typescript-eslint monorepo to v8.34.1 2025-06-24 16:49:39 +00:00
renovate[bot]
053bcd10e1 Update dependency @types/node to v18.19.112 2025-06-24 16:49:12 +00:00
renovate[bot]
91036dcd22 Update all non-major dependencies 2025-06-24 16:48:59 +00:00
renovate[bot]
c0f3703c5a Update rust:bullseye Docker digest to af1a29a 2025-06-24 16:48:36 +00:00
renovate[bot]
960a413c8a Update docker 2025-06-24 16:48:31 +00:00
RiotRobot
5e8373d6cd v1.11.105-rc.0 2025-06-24 13:00:18 +00:00
ElementRobot
858e4fdbde Merge pull request #2406 from element-hq/actions/localazy-download
Localazy Download
2025-06-20 08:31:44 +02:00
t3chguy
8e5761be2d [create-pull-request] automated change 2025-06-20 06:07:33 +00:00
RiotRobot
be6565656d Merge branch 'master' into develop 2025-06-17 13:37:27 +00:00
RiotRobot
02f2274765 v1.11.104 2025-06-17 13:36:49 +00:00
Michael Telatynski
0d04e3d2ac Fix element-desktop-ssoid profile deeplinking for OIDC (#2396) 2025-06-13 14:57:41 +01:00
ElementRobot
f4b3816888 Merge pull request #2395 from element-hq/actions/localazy-download
Localazy Download
2025-06-13 01:27:56 -05:00
t3chguy
db153374f0 [create-pull-request] automated change 2025-06-13 06:07:46 +00:00
Michael Telatynski
0d4f02cde6 Add support for migrating to kwallet6 (#2390) 2025-06-11 14:06:25 +01:00
renovate[bot]
0061966718 Update electron (#2388)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-11 11:07:21 +01:00
ElementRobot
9fc64550dd Merge pull request #2389 from element-hq/actions/localazy-download
Localazy Download
2025-06-11 01:23:44 -05:00
t3chguy
51d2f6a29e [create-pull-request] automated change 2025-06-11 06:07:47 +00:00
renovate[bot]
58ef3d277f Update electron-builder to v26.0.16 (#2385)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-06-10 16:33:49 +00:00
renovate[bot]
fd62231856 Update dependency @stylistic/eslint-plugin to v4.4.1 (#2383)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 17:18:11 +01:00
renovate[bot]
0510fa4ee4 Update dependency @babel/core to v7.27.4 (#2382)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 16:47:33 +01:00
renovate[bot]
58d129f565 Update all non-major dependencies (#2387)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 16:21:12 +01:00
renovate[bot]
c72c18e998 Update typescript-eslint monorepo to v8.33.1 (#2386)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 15:05:17 +00:00
renovate[bot]
906125c738 Update dependency @types/node to v18.19.111 (#2384)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-10 14:47:06 +00:00
RiotRobot
bf97ef4904 v1.11.104-rc.0 2025-06-10 13:43:15 +00:00
RiotRobot
273afae84e Merge branch 'master' into develop 2025-06-10 12:30:59 +00:00
RiotRobot
e18ddee37e v1.11.103 2025-06-10 12:30:14 +00:00
Michael Telatynski
c43e8d684f Wire up setContentProtectionEnable for Windows & macOS (#2379) 2025-06-10 08:55:51 +01:00
ElementRobot
75463f0296 Merge pull request #2378 from element-hq/actions/localazy-download
Localazy Download
2025-06-09 01:21:28 -05:00
t3chguy
2401c1f7ef [create-pull-request] automated change 2025-06-09 06:07:53 +00:00
ElementRobot
fe7d10539b Merge pull request #2375 from element-hq/actions/localazy-download
Localazy Download
2025-06-06 01:28:56 -05:00
t3chguy
cb5f5bc94a [create-pull-request] automated change 2025-06-06 06:07:50 +00:00
David Baker
b123e0f60c Merge pull request #2373 from element-hq/dbkr/safestorage_fixloop
Fix restart loop in safeStorage
2025-06-04 19:30:02 +01:00
David Baker
39f460b636 Actually assign the promise 2025-06-04 18:26:56 +01:00
David Baker
86f6136257 Prettier 2025-06-04 16:23:59 +01:00
David Baker
2e039f4bab Add log message while I'm here 2025-06-04 16:15:08 +01:00
David Baker
8f24f45090 Need to return false here too 2025-06-04 16:12:43 +01:00
David Baker
6901bff548 Fix clear storage not working
It failed because it went looking for the focused / first window to
clear the storage on, but we called it before we had a window. Just
rewrite it without electron-clear-storage which doesn't really seem
necessary as a dependency, and also relaunched the app when clearing
stprage (you-had-one-job.gif). Pass the session in explicitly so it's
clear it needs it.
2025-06-04 16:01:03 +01:00
David Baker
cf88e520a0 Fix restart loop in safeStorage
if we started using a backend but it's now unusable, we need to prompt
the user that we can't migrate: if the override flag is already set then
we'll just restart in a loop.
2025-06-04 14:01:14 +01:00
ElementRobot
3bc59fb6ce Merge pull request #2372 from element-hq/actions/localazy-download
Localazy Download
2025-06-04 01:24:09 -05:00
t3chguy
f136c7aaad [create-pull-request] automated change 2025-06-04 06:07:42 +00:00
dependabot[bot]
5b33e2866d Bump tar-fs from 2.1.2 to 2.1.3 (#2369)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 16:28:15 +00:00
RiotRobot
c0ca58e930 Merge branch 'master' into develop 2025-06-03 15:14:12 +00:00
ElementRobot
b22d2480ae Merge pull request #2367 from element-hq/actions/localazy-download
Localazy Download
2025-06-02 01:26:44 -05:00
t3chguy
7142b6fe57 [create-pull-request] automated change 2025-06-02 06:07:44 +00:00
renovate[bot]
b4c2bc7165 Update dependency electron to v36.3.2 (#2364)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-29 08:01:51 +00:00
renovate[bot]
4ea7b679e9 Update dependency @types/node to v18.19.105 (#2363)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-29 07:58:32 +00:00
renovate[bot]
89ead2e56f Update all non-major dependencies (#2358)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-05-29 08:41:58 +01:00
renovate[bot]
360665cd41 Update rust:bullseye Docker digest to eb80936 (#2355)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2025-05-28 17:41:51 +01:00
renovate[bot]
93c0b81cc4 Update typescript-eslint monorepo to v8.33.0 (#2361)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 17:00:23 +01:00
renovate[bot]
bd194306dd Update dependency @stylistic/eslint-plugin to v4.4.0 (#2359)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 15:15:01 +00:00
renovate[bot]
b4a23ff505 Update dependency electron to v36.3.1 (#2360)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 15:14:33 +00:00
renovate[bot]
8559a740f4 Update dependency @electron/asar to v4 (#2362)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 16:11:37 +01:00
renovate[bot]
dea64f7e38 Update dependency @babel/core to v7.27.3 (#2356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 14:48:05 +00:00
renovate[bot]
044de246a1 Update dependency @types/node to v18.19.103 (#2357)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-28 15:46:37 +01:00
55 changed files with 1948 additions and 1068 deletions

View File

@@ -107,7 +107,7 @@ jobs:
environment: ${{ needs.prepare.outputs.deploy == 'true' && 'packages.element.io' || '' }}
steps:
- name: Download artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
- name: Prepare artifacts for deployment
run: |
@@ -281,7 +281,7 @@ jobs:
aws-region: ${{ env.AWS_REGION }}
- name: Download artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
pattern: win-*

View File

@@ -53,7 +53,7 @@ jobs:
runs-on: ubuntu-24.04
if: always()
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -64,7 +64,7 @@ jobs:
run: yarn install --frozen-lockfile
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
pattern: blob-report-*
path: all-blob-reports

View File

@@ -20,6 +20,21 @@ on:
type: boolean
required: false
description: "Whether to run the blob report"
prepare-artifact-name:
type: string
required: false
description: |
The name of the prepare artifact to use, defaults to 'webapp'.
The artifact must contain the following:
+ webapp.asar - the asar archive of the webapp to embed in the desktop app
+ electronVersion - the version of electron to use for cache keying
+ hakHash - the hash of the .hak directory to use for cache keying
+ changelog.Debian - the changelog file to embed in the Debian package
+ variant.json - the variant configuration to use for the build
The artifact can also contain any additional files which will be applied as overrides to the checkout root before building,
for example icons in the `build/` directory to override the app icons.
default: "webapp"
env:
SQLCIPHER_BUNDLED: ${{ inputs.sqlcipher == 'static' && '1' || '' }}
MAX_GLIBC: 2.31 # bullseye-era glibc, used by glibc-check.sh
@@ -60,15 +75,15 @@ jobs:
}
}
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: webapp
name: ${{ inputs.prepare-artifact-name }}
- name: Cache .hak
id: cache
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
with:
key: ${{ runner.os }}-${{ github.ref_name }}-${{ inputs.sqlcipher }}-${{ inputs.arch }}-${{ hashFiles('hakHash', 'electronVersion', 'dockerbuild/*') }}
path: |
@@ -95,7 +110,7 @@ jobs:
# This allows contributors to test changes to the dockerbuild image within a pull request
- name: Build docker image
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
if: steps.changed_files.outputs.any_modified == 'true'
with:
file: dockerbuild/Dockerfile
@@ -140,8 +155,9 @@ jobs:
- name: Build App
run: yarn build --publish never -l ${{ steps.config.outputs.build-args }}
env:
VARIANT_PATH: variant.json
# Only set for Nightly builds
ED_NIGHTLY: ${{ inputs.version }}
VERSION: ${{ inputs.version }}
- name: Check native libraries
run: |

View File

@@ -31,21 +31,35 @@ on:
type: boolean
required: false
description: "Whether to run the blob report"
prepare-artifact-name:
type: string
required: false
description: |
The name of the prepare artifact to use, defaults to 'webapp'.
The artifact must contain the following:
+ webapp.asar - the asar archive of the webapp to embed in the desktop app
+ electronVersion - the version of electron to use for cache keying
+ hakHash - the hash of the .hak directory to use for cache keying
+ variant.json - the variant configuration to use for the build
The artifact can also contain any additional files which will be applied as overrides to the checkout root before building,
for example icons in the `build/` directory to override the app icons.
default: "webapp"
permissions: {} # No permissions required
jobs:
build:
runs-on: macos-14 # M1
environment: ${{ inputs.sign && 'packages.element.io' || '' }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: webapp
name: ${{ inputs.prepare-artifact-name }}
- name: Cache .hak
id: cache
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
with:
key: ${{ runner.os }}-${{ hashFiles('hakHash', 'electronVersion') }}
path: |
@@ -91,8 +105,9 @@ jobs:
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CSC_KEY_PASSWORD }}
CSC_LINK: ${{ secrets.APPLE_CSC_LINK }}
VARIANT_PATH: variant.json
# Only set for Nightly builds
ED_NIGHTLY: ${{ inputs.version }}
VERSION: ${{ inputs.version }}
- name: Check app was signed & notarised successfully
if: inputs.sign != ''
@@ -108,6 +123,7 @@ jobs:
yarn build:universal --publish never
env:
CSC_IDENTITY_AUTO_DISCOVERY: false
VARIANT_PATH: variant.json
- name: Generate releases.json
if: inputs.base-url

View File

@@ -54,7 +54,7 @@ jobs:
outputs:
nightly-version: ${{ steps.versions.outputs.nightly }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -85,6 +85,11 @@ jobs:
if: steps.branch-matching.outcome == 'failure' || steps.branch-matching.outcome == 'skipped'
run: yarn run fetch --noverify -d ${{ inputs.config }} ${{ inputs.version }}
- name: Copy variant config
run: cp "$CONFIG_DIR/build.json" variant.json
env:
CONFIG_DIR: ${{ inputs.config }}
# We split this out to save the build_* scripts having to do it to make use of `hashFiles` in the cache action
- name: Generate cache hash files
run: |
@@ -166,7 +171,7 @@ jobs:
retention-days: 1
path: |
webapp.asar
package.json
electronVersion
hakHash
changelog.Debian
variant.json

View File

@@ -27,7 +27,7 @@ jobs:
test:
runs-on: ${{ inputs.runs-on }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -37,7 +37,7 @@ jobs:
- name: Install Deps
run: "yarn install --frozen-lockfile"
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: ${{ inputs.artifact }}
path: dist

View File

@@ -34,6 +34,21 @@ on:
type: boolean
required: false
description: "Whether to run the blob report"
prepare-artifact-name:
type: string
required: false
description: |
The name of the prepare artifact to use, defaults to 'webapp'.
The artifact must contain the following:
+ webapp.asar - the asar archive of the webapp to embed in the desktop app
+ electronVersion - the version of electron to use for cache keying
+ hakHash - the hash of the .hak directory to use for cache keying
+ variant.json - the variant configuration to use for the build
The artifact can also contain any additional files which will be applied as overrides to the checkout root before building,
for example icons in the `build/` directory to override the app icons.
default: "webapp"
permissions: {} # No permissions required
jobs:
build:
@@ -65,15 +80,15 @@ jobs:
}
}
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: webapp
name: ${{ inputs.prepare-artifact-name }}
- name: Cache .hak
id: cache
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
with:
key: ${{ runner.os }}-${{ inputs.arch }}-${{ hashFiles('hakHash', 'electronVersion') }}
path: |
@@ -188,8 +203,14 @@ jobs:
- name: Build App
run: yarn build --publish never -w ${{ steps.config.outputs.build-args }}
env:
VARIANT_PATH: variant.json
# Only set for Nightly builds
ED_NIGHTLY: ${{ inputs.version }}
# The windows packager relies on parsing this as semver, so we have to make it look like one.
# This will give our update packages really stupid names, but we probably can't change that either
# because squirrel windows parses them for the version too. We don't really care: nobody sees them.
# We just give the installer a static name, so you'll just see this in the 'about' dialog.
# Turns out if you use 0.0.0 here it makes Squirrel windows crash, so we use 0.0.1.
VERSION: ${{ inputs.version && format('0.0.1-nightly.{0}', inputs.version) || '' }}
- name: Trust eSigner sandbox cert
if: inputs.sign == ''

View File

@@ -19,18 +19,18 @@ jobs:
contents: read
packages: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Set up QEMU
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3
with:
install: true
- name: Build test image
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
with:
file: dockerbuild/Dockerfile
push: false
@@ -42,7 +42,7 @@ jobs:
run: docker run -v $PWD:/project element-desktop-dockerbuild yarn install
- name: Log in to the Container registry
uses: docker/login-action@6d4b68b490aef8836e8fb5e50ee7b3bdfa5894f0
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1
if: github.event_name != 'pull_request'
with:
registry: ${{ env.REGISTRY }}
@@ -52,7 +52,7 @@ jobs:
- name: Extract metadata for Docker
id: meta
if: github.event_name != 'pull_request'
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
@@ -61,7 +61,7 @@ jobs:
- name: Build and push Docker image
if: github.event_name != 'pull_request'
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
with:
file: dockerbuild/Dockerfile
push: true

View File

@@ -9,7 +9,7 @@ jobs:
name: "Typescript Syntax Check"
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -35,7 +35,7 @@ jobs:
name: "ESLint"
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -53,7 +53,7 @@ jobs:
name: "Workflow Lint"
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
@@ -71,7 +71,7 @@ jobs:
name: "Analyse Dead Code"
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:

View File

@@ -1 +1 @@
v22.15.0
v22.19.0

View File

@@ -1,3 +1,258 @@
Changes in [1.12.0](https://github.com/element-hq/element-desktop/releases/tag/v1.12.0) (2025-09-23)
====================================================================================================
## 🦖 Deprecations
* Remove remaining support for outdated .well-known settings ([#30702](https://github.com/element-hq/element-web/pull/30702)). Contributed by @richvdh.
## ✨ Features
* Automatically select first source for desktop capture under Wayland ([#2526](https://github.com/element-hq/element-desktop/pull/2526)). Contributed by @byquanton.
* Add decline button to call notification toast (use new notification event) ([#30729](https://github.com/element-hq/element-web/pull/30729)). Contributed by @toger5.
* Use the new room list by default ([#30640](https://github.com/element-hq/element-web/pull/30640)). Contributed by @langleyd.
* "Verify this device" redesign ([#30596](https://github.com/element-hq/element-web/pull/30596)). Contributed by @uhoreg.
* Set Element Call "intents" when starting and answering DM calls. ([#30730](https://github.com/element-hq/element-web/pull/30730)). Contributed by @Half-Shot.
* Add axe compliance for new room list ([#30700](https://github.com/element-hq/element-web/pull/30700)). Contributed by @langleyd.
* Stop ringing and remove toast if another device answers a RTC call. ([#30728](https://github.com/element-hq/element-web/pull/30728)). Contributed by @Half-Shot.
* Automatically adjust history visibility when making a room private ([#30713](https://github.com/element-hq/element-web/pull/30713)). Contributed by @Half-Shot.
* Release announcement for new room list ([#30675](https://github.com/element-hq/element-web/pull/30675)). Contributed by @dbkr.
## 🐛 Bug Fixes
* Update Electron to v38.1.0 to fix Kernel crash on multi-GPU systems ([#2544](https://github.com/element-hq/element-desktop/pull/2544)). Contributed by @Arcitec.
* Fix Confirm your identity buttons being unclickable ([#2554](https://github.com/element-hq/element-desktop/pull/2554)). Contributed by @dbkr.
* Ensure dropdown is not a drag element on macOS ([#2540](https://github.com/element-hq/element-desktop/pull/2540)). Contributed by @t3chguy.
* [Backport staging] Room list: make the filter resize correctly ([#30795](https://github.com/element-hq/element-web/pull/30795)). Contributed by @RiotRobot.
* [Backport staging] Avoid flicker of the room list filter on resize ([#30794](https://github.com/element-hq/element-web/pull/30794)). Contributed by @RiotRobot.
* Don't show release announcements while toasts are displayed ([#30770](https://github.com/element-hq/element-web/pull/30770)). Contributed by @dbkr.
* Fix enabling key backup not working if there is an untrusted key backup ([#30707](https://github.com/element-hq/element-web/pull/30707)). Contributed by @Half-Shot.
* Force `preload` to be false when setting an intent on an Element Call. ([#30759](https://github.com/element-hq/element-web/pull/30759)). Contributed by @Half-Shot.
* Fix handling of 413 server response when uploading media ([#30737](https://github.com/element-hq/element-web/pull/30737)). Contributed by @hughns.
* Make landmark navigation work with new room list ([#30747](https://github.com/element-hq/element-web/pull/30747)). Contributed by @dbkr.
* Prevent voice message from displaying spurious errors ([#30736](https://github.com/element-hq/element-web/pull/30736)). Contributed by @florianduros.
* Align default avatar and fix colors in composer pills ([#30739](https://github.com/element-hq/element-web/pull/30739)). Contributed by @florianduros.
* Use configured URL for link to desktop app in message search settings ([#30742](https://github.com/element-hq/element-web/pull/30742)). Contributed by @t3chguy.
* Fix history visibility when creating space rooms ([#30745](https://github.com/element-hq/element-web/pull/30745)). Contributed by @dbkr.
* Check HTML-encoded quotes when handling translations for embedded pages (such as welcome.html) ([#30743](https://github.com/element-hq/element-web/pull/30743)). Contributed by @Half-Shot.
* Fix local room encryption status always not enabled ([#30461](https://github.com/element-hq/element-web/pull/30461)). Contributed by @BillCarsonFr.
* fix: make url in topic in room intro clickable ([#30686](https://github.com/element-hq/element-web/pull/30686)). Contributed by @florianduros.
* Block change recovery key button while a change is ongoing. ([#30664](https://github.com/element-hq/element-web/pull/30664)). Contributed by @Half-Shot.
* Hide advanced settings during room creation when `UIFeature.advancedSettings=false` ([#30684](https://github.com/element-hq/element-web/pull/30684)). Contributed by @florianduros.
* A11y: improve accessibility of pinned messages ([#30558](https://github.com/element-hq/element-web/pull/30558)). Contributed by @florianduros.
Changes in [1.11.112](https://github.com/element-hq/element-desktop/releases/tag/v1.11.112) (2025-09-16)
========================================================================================================
Fix [CVE-2025-59161](https://www.cve.org/CVERecord?id=CVE-2025-59161) / [GHSA-m6c8-98f4-75rr](https://github.com/element-hq/element-web/security/advisories/GHSA-m6c8-98f4-75rr)
## This is the last release compatible with macOS Big Sur. It will not update further. Big Sur is End of Life for almost 2 years and the next version of Electron crashes upon startup on Big Sur.
## ✨ Features
* [Backport staging] Handle unsupported macOS versions better ([#2555](https://github.com/element-hq/element-desktop/pull/2555)). Contributed by @RiotRobot.
Changes in [1.11.111](https://github.com/element-hq/element-desktop/releases/tag/v1.11.111) (2025-09-10)
========================================================================================================
## ✨ Features
* Do not hide media from your own user by default ([#29797](https://github.com/element-hq/element-web/pull/29797)). Contributed by @Half-Shot.
* Remember whether sidebar is shown for calls when switching rooms ([#30262](https://github.com/element-hq/element-web/pull/30262)). Contributed by @bojidar-bg.
* Open the proper integration settings on integrations disabled error ([#30538](https://github.com/element-hq/element-web/pull/30538)). Contributed by @Half-Shot.
* Show a "progress" dialog while invites are being sent ([#30561](https://github.com/element-hq/element-web/pull/30561)). Contributed by @richvdh.
* Move the room list to the new ListView(backed by react-virtuoso) ([#30515](https://github.com/element-hq/element-web/pull/30515)). Contributed by @langleyd.
## 🐛 Bug Fixes
* [Backport staging] Ensure container starts if it is mounted with an empty /modules directory. ([#30705](https://github.com/element-hq/element-web/pull/30705)). Contributed by @RiotRobot.
* Fix room joining over federation not specifying vias or using aliases ([#30641](https://github.com/element-hq/element-web/pull/30641)). Contributed by @t3chguy.
* Fix stable-suffixed MSC4133 support ([#30649](https://github.com/element-hq/element-web/pull/30649)). Contributed by @dbkr.
* Fix i18n of message when a setting is disabled ([#30646](https://github.com/element-hq/element-web/pull/30646)). Contributed by @dbkr.
* ListView should not handle the arrow keys if there is a modifier applied ([#30633](https://github.com/element-hq/element-web/pull/30633)). Contributed by @langleyd.
* Make BaseDialog's div keyboard focusable and fix test. ([#30631](https://github.com/element-hq/element-web/pull/30631)). Contributed by @langleyd.
* Fix: Allow triple-click text selection to flow around pills ([#30349](https://github.com/element-hq/element-web/pull/30349)). Contributed by @AlirezaMrtz.
* Watch for a 'join' action to know when the call is connected ([#29492](https://github.com/element-hq/element-web/pull/29492)). Contributed by @robintown.
* Fix: add missing tooltip and aria-label to lock icon next to composer ([#30623](https://github.com/element-hq/element-web/pull/30623)). Contributed by @florianduros.
* Don't render context menu when scrolling ([#30613](https://github.com/element-hq/element-web/pull/30613)). Contributed by @langleyd.
Changes in [1.11.110](https://github.com/element-hq/element-desktop/releases/tag/v1.11.110) (2025-08-27)
========================================================================================================
## ✨ Features
* Hide recovery key when re-entering it while creating or changing it ([#30499](https://github.com/element-hq/element-web/pull/30499)). Contributed by @andybalaam.
* Add `?no_universal_links=true` to OIDC url so EX doesn't try to handle it ([#29439](https://github.com/element-hq/element-web/pull/29439)). Contributed by @t3chguy.
* Show a blue lock for unencrypted rooms and hide the grey shield for encrypted rooms ([#30440](https://github.com/element-hq/element-web/pull/30440)). Contributed by @langleyd.
* Add support for Module API 1.4 ([#30185](https://github.com/element-hq/element-web/pull/30185)). Contributed by @t3chguy.
* MVVM - Introduce some helpers for snapshot management ([#30398](https://github.com/element-hq/element-web/pull/30398)). Contributed by @MidhunSureshR.
## 🐛 Bug Fixes
* A11y: move focus to right panel when opened ([#30553](https://github.com/element-hq/element-web/pull/30553)). Contributed by @florianduros.
* Fix e2e warning icon should be white ([#30539](https://github.com/element-hq/element-web/pull/30539)). Contributed by @florianduros.
* Remove NoOneHere disabled reason. ([#30524](https://github.com/element-hq/element-web/pull/30524)). Contributed by @toger5.
* Fix downloading files with authenticated media API ([#30520](https://github.com/element-hq/element-web/pull/30520)). Contributed by @t3chguy.
* Fix call permissions check confusion around element call ([#30521](https://github.com/element-hq/element-web/pull/30521)). Contributed by @t3chguy.
* Fix line wrap around emoji verification ([#30523](https://github.com/element-hq/element-web/pull/30523)). Contributed by @t3chguy.
* Don't highlight redacted events ([#30519](https://github.com/element-hq/element-web/pull/30519)). Contributed by @t3chguy.
* Fix matrix.to links not being handled in the app ([#30522](https://github.com/element-hq/element-web/pull/30522)). Contributed by @t3chguy.
* Fix issue of new room list taking up the full width ([#30459](https://github.com/element-hq/element-web/pull/30459)). Contributed by @langleyd.
* Fix widget persistence in React development mode ([#30509](https://github.com/element-hq/element-web/pull/30509)). Contributed by @robintown.
* Fix widget initialization in React development mode ([#30463](https://github.com/element-hq/element-web/pull/30463)). Contributed by @robintown.
Changes in [1.11.109](https://github.com/element-hq/element-desktop/releases/tag/v1.11.109) (2025-08-11)
========================================================================================================
This release supports the upcoming v12 ("hydra") Matrix room version and is necessary to view and participate in these rooms.
## ✨ Features
* [Backport staging] Allow /upgraderoom command without developer mode enabled ([#30529](https://github.com/element-hq/element-web/pull/30529)). Contributed by @RiotRobot.
* [Backport staging] Support for creator/owner power level ([#30526](https://github.com/element-hq/element-web/pull/30526)). Contributed by @RiotRobot.
* New room list: change icon and label of menu item for to start a DM ([#30470](https://github.com/element-hq/element-web/pull/30470)). Contributed by @florianduros.
* Implement the member list with virtuoso ([#29869](https://github.com/element-hq/element-web/pull/29869)). Contributed by @langleyd.
* Add labs option for history sharing on invite ([#30313](https://github.com/element-hq/element-web/pull/30313)). Contributed by @richvdh.
* Bump wysiwyg to 2.39.0 adding support for pasting rich text content in the Rich Text Edtior ([#30421](https://github.com/element-hq/element-web/pull/30421)). Contributed by @langleyd.
* Support `EventShieldReason.MISMATCHED_SENDER` ([#30403](https://github.com/element-hq/element-web/pull/30403)). Contributed by @richvdh.
* Change unencrypted and public pills to blue ([#30399](https://github.com/element-hq/element-web/pull/30399)). Contributed by @florianduros.
* Change color of public room icon ([#30390](https://github.com/element-hq/element-web/pull/30390)). Contributed by @florianduros.
* Script for updating storybook screenshots ([#30340](https://github.com/element-hq/element-web/pull/30340)). Contributed by @dbkr.
* Add toggle to hide empty state in devtools ([#30352](https://github.com/element-hq/element-web/pull/30352)). Contributed by @toger5.
## 🐛 Bug Fixes
* [Backport staging] Use userId to filter users in non-federated rooms when showing the InviteDialog ([#30537](https://github.com/element-hq/element-web/pull/30537)). Contributed by @RiotRobot.
* [Backport staging] Catch error when encountering invalid m.room.pinned\_events event ([#30536](https://github.com/element-hq/element-web/pull/30536)). Contributed by @RiotRobot.
* Update for compatibility with v12 rooms ([#30452](https://github.com/element-hq/element-web/pull/30452)). Contributed by @dbkr.
* New room list: fix tooltip on presence ([#30474](https://github.com/element-hq/element-web/pull/30474)). Contributed by @florianduros.
* New room list: add tooltip for presence and room status ([#30472](https://github.com/element-hq/element-web/pull/30472)). Contributed by @florianduros.
* Fix: Clicking on an item in the member list causes it to scroll to the top rather than show the profile view ([#30455](https://github.com/element-hq/element-web/pull/30455)). Contributed by @langleyd.
* Put the 'decrypting' tooltip back ([#30446](https://github.com/element-hq/element-web/pull/30446)). Contributed by @dbkr.
* Use server name explicitly for via. ([#30362](https://github.com/element-hq/element-web/pull/30362)). Contributed by @Half-Shot.
* fix: replace hardcoded string in poll history dialog ([#30402](https://github.com/element-hq/element-web/pull/30402)). Contributed by @florianduros.
* fix: replace hardcoded string on qr code back button ([#30401](https://github.com/element-hq/element-web/pull/30401)). Contributed by @florianduros.
* Fix color of icon button with outline ([#30361](https://github.com/element-hq/element-web/pull/30361)). Contributed by @florianduros.
Changes in [1.11.108](https://github.com/element-hq/element-desktop/releases/tag/v1.11.108) (2025-07-30)
========================================================================================================
## 🐛 Bug Fixes
* [Backport staging] Fix downloaded attachments not being decrypted ([#30434](https://github.com/element-hq/element-web/pull/30434)). Contributed by @RiotRobot.
Changes in [1.11.107](https://github.com/element-hq/element-desktop/releases/tag/v1.11.107) (2025-07-29)
========================================================================================================
## ✨ Features
* Add support for overlaying notification badges on the Windows Taskbar icon. ([#2443](https://github.com/element-hq/element-desktop/pull/2443)). Contributed by @Half-Shot.
* Reduce macos titlebar height with the new room list and expand the existing border ([#2446](https://github.com/element-hq/element-desktop/pull/2446)). Contributed by @florianduros.
* Message preview should show tooltip with the full message on hover ([#30265](https://github.com/element-hq/element-web/pull/30265)). Contributed by @MidhunSureshR.
* Support rendering notification badges on platforms that do their own icon overlays ([#30315](https://github.com/element-hq/element-web/pull/30315)). Contributed by @Half-Shot.
* Add SubscriptionViewModel base class ([#30297](https://github.com/element-hq/element-web/pull/30297)). Contributed by @dbkr.
* Enhancement: Save image on CTRL+S ([#30330](https://github.com/element-hq/element-web/pull/30330)). Contributed by @ioalexander.
* Add quote functionality to MessageContextMenu (#29893) ([#30323](https://github.com/element-hq/element-web/pull/30323)). Contributed by @AlirezaMrtz.
* Initial structure for shared component views ([#30216](https://github.com/element-hq/element-web/pull/30216)). Contributed by @dbkr.
## 🐛 Bug Fixes
* Reduce macos titlebar height with the new room list and expand the existing border ([#2446](https://github.com/element-hq/element-desktop/pull/2446)). Contributed by @florianduros.
* [Backport staging] Fix e2e shield being invisible in white mode for encrypted room ([#30411](https://github.com/element-hq/element-web/pull/30411)). Contributed by @RiotRobot.
* Force ED titlebar color for new room list ([#30332](https://github.com/element-hq/element-web/pull/30332)). Contributed by @florianduros.
* Add a background color to left panel for macos titlebar in element desktop ([#30328](https://github.com/element-hq/element-web/pull/30328)). Contributed by @florianduros.
* Fix: Prevent page refresh on Enter key in right panel member search ([#30312](https://github.com/element-hq/element-web/pull/30312)). Contributed by @AlirezaMrtz.
Changes in [1.11.106](https://github.com/element-hq/element-desktop/releases/tag/v1.11.106) (2025-07-15)
========================================================================================================
## ✨ Features
* [Backport staging] Fix e2e icon colour ([#30304](https://github.com/element-hq/element-web/pull/30304)). Contributed by @RiotRobot.
* Add support for module message hint `allowDownloadingMedia` ([#30252](https://github.com/element-hq/element-web/pull/30252)). Contributed by @Half-Shot.
* Update the mobile\_guide page to the new design and link out to Element X by default. ([#30172](https://github.com/element-hq/element-web/pull/30172)). Contributed by @pixlwave.
* Filter settings exported when rageshaking ([#30236](https://github.com/element-hq/element-web/pull/30236)). Contributed by @Half-Shot.
* Allow Element Call to learn the room name ([#30213](https://github.com/element-hq/element-web/pull/30213)). Contributed by @robintown.
## 🐛 Bug Fixes
* [Backport staging] Fix missing image download button ([#30322](https://github.com/element-hq/element-web/pull/30322)). Contributed by @RiotRobot.
* Fix transparent verification checkmark in dark mode ([#30235](https://github.com/element-hq/element-web/pull/30235)). Contributed by @Banbuii.
* Fix logic in DeviceListener ([#30230](https://github.com/element-hq/element-web/pull/30230)). Contributed by @uhoreg.
* Disable file drag-and-drop if insufficient permissions ([#30186](https://github.com/element-hq/element-web/pull/30186)). Contributed by @t3chguy.
Changes in [1.11.105](https://github.com/element-hq/element-desktop/releases/tag/v1.11.105) (2025-07-01)
========================================================================================================
## ✨ Features
* Add support for migrating to kwallet6 ([#2390](https://github.com/element-hq/element-desktop/pull/2390)). Contributed by @t3chguy.
* New room list: add context menu to room list item ([#29952](https://github.com/element-hq/element-web/pull/29952)). Contributed by @florianduros.
* Support for custom message components via Module API ([#30074](https://github.com/element-hq/element-web/pull/30074)). Contributed by @Half-Shot.
* Prompt users to set up recovery ([#30075](https://github.com/element-hq/element-web/pull/30075)). Contributed by @uhoreg.
* Update `IconButton` colors ([#30124](https://github.com/element-hq/element-web/pull/30124)). Contributed by @florianduros.
* New room list: filter list can be collapsed ([#29992](https://github.com/element-hq/element-web/pull/29992)). Contributed by @florianduros.
* Show `EmptyRoomListView` when low priority filter matches zero rooms ([#30122](https://github.com/element-hq/element-web/pull/30122)). Contributed by @MidhunSureshR.
## 🐛 Bug Fixes
* Fix element-desktop-ssoid profile deeplinking for OIDC ([#2396](https://github.com/element-hq/element-desktop/pull/2396)). Contributed by @t3chguy.
* Add support for migrating to kwallet6 ([#2390](https://github.com/element-hq/element-desktop/pull/2390)). Contributed by @t3chguy.
* Fix untranslatable string "People" in notifications beta ([#30165](https://github.com/element-hq/element-web/pull/30165)). Contributed by @t3chguy.
* Force verification even after logging in via delegate ([#30141](https://github.com/element-hq/element-web/pull/30141)). Contributed by @andybalaam.
* Hide add integrations button based on UIComponent.AddIntegrations ([#30140](https://github.com/element-hq/element-web/pull/30140)). Contributed by @t3chguy.
* Use nav for new room list and label sections ([#30134](https://github.com/element-hq/element-web/pull/30134)). Contributed by @dbkr.
* Spacestore should emit event after rebuilding home space ([#30132](https://github.com/element-hq/element-web/pull/30132)). Contributed by @MidhunSureshR.
* Handle m.room.pinned\_events being invalid ([#30129](https://github.com/element-hq/element-web/pull/30129)). Contributed by @t3chguy.
Changes in [1.11.104](https://github.com/element-hq/element-desktop/releases/tag/v1.11.104) (2025-06-17)
========================================================================================================
## ✨ Features
* Update the mobile\_guide page to the new design. ([#30006](https://github.com/element-hq/element-web/pull/30006)). Contributed by @pixlwave.
* Provide a devtool for manually verifying other devices ([#30094](https://github.com/element-hq/element-web/pull/30094)). Contributed by @andybalaam.
* Implement MSC4155: Invite filtering ([#29603](https://github.com/element-hq/element-web/pull/29603)). Contributed by @Half-Shot.
* Add low priority avatar decoration to room tile ([#30065](https://github.com/element-hq/element-web/pull/30065)). Contributed by @MidhunSureshR.
* Add ability to prevent window content being captured by other apps (Desktop) ([#30098](https://github.com/element-hq/element-web/pull/30098)). Contributed by @t3chguy.
* New room list: move message preview in user settings ([#30023](https://github.com/element-hq/element-web/pull/30023)). Contributed by @florianduros.
* New room list: change room options icon ([#30029](https://github.com/element-hq/element-web/pull/30029)). Contributed by @florianduros.
* RoomListStore: Sort low priority rooms to the bottom of the list ([#30070](https://github.com/element-hq/element-web/pull/30070)). Contributed by @MidhunSureshR.
* Add low priority filter pill to the room list UI ([#30060](https://github.com/element-hq/element-web/pull/30060)). Contributed by @MidhunSureshR.
* New room list: remove color gradient in space panel ([#29721](https://github.com/element-hq/element-web/pull/29721)). Contributed by @florianduros.
* /share?msg=foo endpoint using forward message dialog ([#29874](https://github.com/element-hq/element-web/pull/29874)). Contributed by @ara4n.
## 🐛 Bug Fixes
* Fix restart loop in safeStorage ([#2373](https://github.com/element-hq/element-desktop/pull/2373)). Contributed by @dbkr.
* Do not send empty auth when setting up cross-signing keys ([#29914](https://github.com/element-hq/element-web/pull/29914)). Contributed by @gnieto.
* Settings: flip local video feed by default ([#29501](https://github.com/element-hq/element-web/pull/29501)). Contributed by @jbtrystram.
* AccessSecretStorageDialog: various fixes ([#30093](https://github.com/element-hq/element-web/pull/30093)). Contributed by @richvdh.
* AccessSecretStorageDialog: fix inability to enter recovery key ([#30090](https://github.com/element-hq/element-web/pull/30090)). Contributed by @richvdh.
* Fix failure to upload thumbnail causing image to send as file ([#30086](https://github.com/element-hq/element-web/pull/30086)). Contributed by @t3chguy.
* Low priority menu item should be a toggle ([#30071](https://github.com/element-hq/element-web/pull/30071)). Contributed by @MidhunSureshR.
* Add sanity checks to prevent users from ignoring themselves ([#30079](https://github.com/element-hq/element-web/pull/30079)). Contributed by @MidhunSureshR.
* Fix issue with duplicate images ([#30073](https://github.com/element-hq/element-web/pull/30073)). Contributed by @fatlewis.
* Handle errors returned from Seshat ([#30083](https://github.com/element-hq/element-web/pull/30083)). Contributed by @richvdh.
Changes in [1.11.103](https://github.com/element-hq/element-desktop/releases/tag/v1.11.103) (2025-06-10)
========================================================================================================
## 🐛 Bug Fixes
+ Check the sender of an event matches owner of session, preventing sender spoofing by homeserver owners.
[13c1d20](https://github.com/matrix-org/matrix-rust-sdk/commit/13c1d2048286bbabf5e7bc6b015aafee98f04d55) (High, [GHSA-x958-rvg6-956w](https://github.com/matrix-org/matrix-rust-sdk/security/advisories/GHSA-x958-rvg6-956w)).
Changes in [1.11.102](https://github.com/element-hq/element-desktop/releases/tag/v1.11.102) (2025-06-03)
========================================================================================================
## ✨ Features

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,6 +1,6 @@
# Docker image to facilitate building Element Desktop's native bits using a glibc version (2.31)
# with broader compatibility, down to Debian bullseye & Ubuntu focal.
FROM rust:bullseye@sha256:f40b8cc3195deda321031e8dfe23c7d2586e3db7c4103fa36946982d9fd6d588
FROM rust:bullseye@sha256:5b0defc2e3b26c97c917406f3d7c682028f87b2ae9adee184694b5c0279e2740
ENV DEBIAN_FRONTEND=noninteractive

View File

@@ -1,12 +1,12 @@
import * as os from "node:os";
import * as fs from "node:fs";
import * as path from "node:path";
import { type Configuration as BaseConfiguration, type Protocol } from "electron-builder";
/**
* This script has different outputs depending on your os platform.
*
* On Windows:
* Prefixes the nightly version with `0.0.1-nightly.` as it breaks if it is not semver
* Passes $ED_SIGNTOOL_THUMBPRINT and $ED_SIGNTOOL_SUBJECT_NAME to
* build.win.signtoolOptions.signingHashAlgorithms and build.win.signtoolOptions.certificateSubjectName respectively if specified.
*
@@ -16,32 +16,68 @@ import { type Configuration as BaseConfiguration, type Protocol } from "electron
* Passes $ED_DEBIAN_CHANGELOG to build.deb.fpm if specified
*/
const DEFAULT_APP_ID = "im.riot.app";
const NIGHTLY_APP_ID = "im.riot.nightly";
const NIGHTLY_DEB_NAME = "element-nightly";
const DEFAULT_PROTOCOL_SCHEME = "io.element.desktop";
const NIGHTLY_PROTOCOL_SCHEME = "io.element.nightly";
/**
* Interface describing relevant fields of the package.json file.
*/
interface Pkg {
version: string;
}
/**
* Base metadata fields, used in both package.json and the variant configuration.
*/
interface Metadata {
name: string;
productName: string;
description: string;
version: string;
}
/**
* Extra metadata fields that are injected into the build to pass to the app at runtime.
*/
interface ExtraMetadata extends Metadata {
electron_appId: string;
electron_protocol: string;
}
/**
* Interface describing the variant configuration format.
*/
interface Variant extends Metadata {
"appId": string;
"linux.executableName"?: string;
"linux.deb.name"?: string;
"protocols": string[];
}
type Writable<T> = NonNullable<
T extends Function ? T : T extends object ? { -readonly [K in keyof T]: Writable<T[K]> } : T
>;
const pkg: Pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
// Load the default variant as a base configuration
const DEFAULT_VARIANT = path.join("element.io", "release", "build.json");
let variant: Variant = JSON.parse(fs.readFileSync(DEFAULT_VARIANT, "utf8"));
/**
* If a variant is specified, we will use it to override the build-specific values.
* This allows us to have different builds for different purposes (e.g. stable, nightly).
*/
if (process.env.VARIANT_PATH) {
console.log(`Using variant configuration from '${process.env.VARIANT_PATH}':`);
variant = {
...variant,
...JSON.parse(fs.readFileSync(`${process.env.VARIANT_PATH}`, "utf8")),
};
} else {
console.warn(`No VARIANT_PATH specified, using default variant configuration '${DEFAULT_VARIANT}':`);
}
for (const key in variant) {
console.log(`${key}: ${variant[key]}`);
}
interface Configuration extends BaseConfiguration {
extraMetadata: Partial<Pick<Pkg, "version">> &
Omit<Pkg, "version"> & {
electron_appId: string;
electron_protocol: string;
};
extraMetadata: Partial<Pick<Pkg, "version">> & ExtraMetadata;
linux: BaseConfiguration["linux"];
win: BaseConfiguration["win"];
mac: BaseConfiguration["mac"];
@@ -58,7 +94,7 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
// Make all fuses required to ensure they are all explicitly specified
electronFuses: Required<Configuration["electronFuses"]>;
} = {
appId: DEFAULT_APP_ID,
appId: variant.appId,
asarUnpack: "**/*.node",
electronFuses: {
enableCookieEncryption: true,
@@ -82,25 +118,19 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
},
"lib/**",
],
extraResources: [
{
from: "res/img",
to: "img",
},
"webapp.asar",
],
extraResources: ["build/icon.*", "webapp.asar"],
extraMetadata: {
name: pkg.name,
productName: pkg.productName,
description: pkg.description,
electron_appId: DEFAULT_APP_ID,
electron_protocol: DEFAULT_PROTOCOL_SCHEME,
name: variant.name,
productName: variant.productName,
description: variant.description,
electron_appId: variant.appId,
electron_protocol: variant.protocols[0],
},
linux: {
target: ["tar.gz", "deb"],
category: "Network;InstantMessaging;Chat",
maintainer: "support@element.io",
icon: "build/icons",
icon: "build/icon.png",
executableName: variant.name, // element-desktop or element-desktop-nightly
},
deb: {
packageCategory: "net",
@@ -118,14 +148,7 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
"libgbm1",
],
recommends: ["libsqlcipher0", "element-io-archive-keyring"],
fpm: [
"--deb-field",
"Replaces: riot-desktop (<< 1.7.0), riot-web (<< 1.7.0)",
"--deb-field",
"Breaks: riot-desktop (<< 1.7.0), riot-web (<< 1.7.0)",
"--deb-pre-depends",
"libc6 (>= 2.31)",
],
fpm: ["--deb-pre-depends", "libc6 (>= 2.31)"],
},
mac: {
category: "public.app-category.social-networking",
@@ -135,7 +158,7 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
// XXX: we cannot specify this due to https://github.com/electron/osx-sign/issues/344
// strictVerify: true,
entitlements: "./build/entitlements.mac.plist",
icon: "build/icons/icon.icns",
icon: "build/icon.icns",
mergeASARs: true,
x64ArchFiles: "**/matrix-seshat/*.node", // hak already runs lipo
},
@@ -144,7 +167,7 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
signtoolOptions: {
signingHashAlgorithms: ["sha256"],
},
icon: "build/icons/icon.ico",
icon: "build/icon.ico",
},
msi: {
perMachine: true,
@@ -153,14 +176,27 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
output: "dist",
},
protocols: {
name: "element",
schemes: [DEFAULT_PROTOCOL_SCHEME, "element"],
name: variant.productName,
schemes: variant.protocols,
},
nativeRebuilder: "sequential",
nodeGypRebuild: false,
npmRebuild: true,
};
/**
* Allow specifying the version via env var.
* If unspecified, it will default to the version in package.json.
* @param {string} process.env.VERSION
*/
if (process.env.VERSION) {
config.extraMetadata.version = process.env.VERSION;
}
if (variant["linux.deb.name"]) {
config.deb.fpm.push("--name", variant["linux.deb.name"]);
}
/**
* Allow specifying windows signing cert via env vars
* @param {string} process.env.ED_SIGNTOOL_SUBJECT_NAME
@@ -171,32 +207,6 @@ if (process.env.ED_SIGNTOOL_SUBJECT_NAME && process.env.ED_SIGNTOOL_THUMBPRINT)
config.win.signtoolOptions!.certificateSha1 = process.env.ED_SIGNTOOL_THUMBPRINT;
}
/**
* Allow specifying nightly version via env var
* @param {string} process.env.ED_NIGHTLY
*/
if (process.env.ED_NIGHTLY) {
config.deb.fpm = []; // Clear the fpm as the breaks deb fields don't apply to nightly
config.appId = config.extraMetadata.electron_appId = NIGHTLY_APP_ID;
config.extraMetadata.productName += " Nightly";
config.extraMetadata.name += "-nightly";
config.extraMetadata.description += " (nightly unstable build)";
config.deb.fpm.push("--name", NIGHTLY_DEB_NAME);
(config.protocols as Protocol).schemes[0] = config.extraMetadata.electron_protocol = NIGHTLY_PROTOCOL_SCHEME;
let version = process.env.ED_NIGHTLY;
if (os.platform() === "win32") {
// The windows packager relies on parsing this as semver, so we have to make it look like one.
// This will give our update packages really stupid names, but we probably can't change that either
// because squirrel windows parses them for the version too. We don't really care: nobody sees them.
// We just give the installer a static name, so you'll just see this in the 'about' dialog.
// Turns out if you use 0.0.0 here it makes Squirrel windows crash, so we use 0.0.1.
version = "0.0.1-nightly." + version;
}
config.extraMetadata.version = version;
}
if (os.platform() === "linux") {
// Electron crashes on debian if there's a space in the path.
// https://github.com/vector-im/element-web/issues/13171

View File

@@ -0,0 +1,9 @@
{
"appId": "im.riot.nightly",
"name": "element-desktop-nightly",
"productName": "Element Nightly",
"description": "Element: the future of secure communication (nightly unstable build)",
"protocols": ["io.element.nightly", "element"],
"linux.executableName": "element-desktop-nightly",
"linux.deb.name": "element-nightly"
}

View File

@@ -0,0 +1,7 @@
{
"appId": "im.riot.app",
"name": "element-desktop",
"productName": "Element",
"description": "Element: the future of secure communication",
"protocols": ["io.element.desktop", "element"]
}

View File

@@ -3,9 +3,12 @@
"productName": "Element",
"main": "lib/electron-main.js",
"exports": "./lib/electron-main.js",
"version": "1.11.102",
"version": "1.12.0",
"description": "Element: the future of secure communication",
"author": "Element",
"author": {
"name": "Element",
"email": "support@element.io"
},
"homepage": "https://element.io",
"repository": {
"type": "git",
@@ -58,14 +61,13 @@
},
"dependencies": {
"@sentry/electron": "^6.0.0",
"@standardnotes/electron-clear-data": "^1.0.5",
"auto-launch": "^5.0.5",
"counterpart": "^0.18.6",
"electron-store": "^10.0.0",
"electron-window-state": "^5.0.3",
"keytar-forked": "7.10.0",
"minimist": "^1.2.6",
"png-to-ico": "^2.1.1",
"png-to-ico": "^3.0.0",
"uuid": "^11.0.0"
},
"devDependencies": {
@@ -74,22 +76,22 @@
"@babel/core": "^7.18.10",
"@babel/preset-env": "^7.18.10",
"@babel/preset-typescript": "^7.18.6",
"@electron/asar": "3.4.1",
"@playwright/test": "1.52.0",
"@stylistic/eslint-plugin": "^4.0.0",
"@electron/asar": "4.0.1",
"@playwright/test": "1.55.0",
"@stylistic/eslint-plugin": "^5.0.0",
"@types/auto-launch": "^5.0.1",
"@types/counterpart": "^0.18.1",
"@types/minimist": "^1.2.1",
"@types/node": "18.19.100",
"@types/node": "18.19.123",
"@types/pacote": "^11.1.1",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"app-builder-lib": "26.0.15",
"app-builder-lib": "26.0.20",
"chokidar": "^4.0.0",
"detect-libc": "^2.0.0",
"electron": "36.2.0",
"electron-builder": "26.0.15",
"electron-builder-squirrel-windows": "26.0.15",
"electron": "38.1.0",
"electron-builder": "26.0.20",
"electron-builder-squirrel-windows": "26.0.20",
"electron-devtools-installer": "^4.0.0",
"eslint": "^8.26.0",
"eslint-config-google": "^0.14.0",
@@ -109,14 +111,14 @@
"rimraf": "^6.0.0",
"tar": "^7.0.0",
"tsx": "^4.19.2",
"typescript": "5.8.3"
"typescript": "5.9.2"
},
"hakDependencies": {
"matrix-seshat": "^4.0.1"
},
"resolutions": {
"@types/node": "18.19.100",
"@types/node": "18.19.123",
"config-file-ts": "0.2.8-rc1",
"node-abi": "4.8.0"
"node-abi": "4.12.0"
}
}

View File

@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/playwright:v1.52.0-jammy@sha256:ff2946177f0756c87482c0ef958b7cfbf389b92525ace78a1c9890281d0d60f4
FROM mcr.microsoft.com/playwright:v1.55.0-jammy@sha256:55db7b712a981e9cc1ec757a4511cd01c5ed4e20bd7c84b2dee4e1d320102b9d
WORKDIR /work/element-desktop

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

49
src/badge.ts Normal file
View File

@@ -0,0 +1,49 @@
/*
Copyright 2025 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import { app, ipcMain, type IpcMainEvent, nativeImage } from "electron";
import { _t } from "./language-helper.js";
// Handles calculating the correct "badge" for the window, for notifications and error states.
// Tray icon updates are handled in tray.ts
if (process.platform === "win32") {
// We only use setOverlayIcon on Windows as it's only supported on that platform, but has good support
// from all the Windows variants we support.
// https://www.electronjs.org/docs/latest/api/browser-window#winsetoverlayiconoverlay-description-windows
ipcMain.on(
"setBadgeCount",
function (_ev: IpcMainEvent, count: number, imageBuffer?: Buffer, isError?: boolean): void {
if (count === 0) {
// Flash frame is set to true in ipc.ts "loudNotification"
global.mainWindow?.flashFrame(false);
}
if (imageBuffer) {
global.mainWindow?.setOverlayIcon(
nativeImage.createFromBuffer(Buffer.from(imageBuffer)),
isError
? _t("icon_overlay|description_error")
: _t("icon_overlay|description_notifications", { count }),
);
} else {
global.mainWindow?.setOverlayIcon(null, "");
}
},
);
} else {
// only set badgeCount on Mac/Linux, the docs say that only those platforms support it but turns out Electron
// has some Windows support too, and in some Windows environments this leads to two badges rendering atop
// each other. See https://github.com/vector-im/element-web/issues/16942
ipcMain.on("setBadgeCount", function (_ev: IpcMainEvent, count: number): void {
if (count === 0) {
// Flash frame is set to true in ipc.ts "loudNotification"
global.mainWindow?.flashFrame(false);
}
app.badgeCount = count;
});
}

View File

@@ -1,5 +1,5 @@
/*
Copyright 2018-2024 New Vector Ltd.
Copyright 2018-2025 New Vector Ltd.
Copyright 2017-2019 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd
@@ -10,7 +10,18 @@ Please see LICENSE files in the repository root for full details.
// Squirrel on windows starts the app with various flags as hooks to tell us when we've been installed/uninstalled etc.
import "./squirrelhooks.js";
import { app, BrowserWindow, Menu, autoUpdater, dialog, type Input, type Event, session, protocol } from "electron";
import {
app,
BrowserWindow,
Menu,
autoUpdater,
dialog,
type Input,
type Event,
session,
protocol,
desktopCapturer,
} from "electron";
// eslint-disable-next-line n/file-extension-in-import
import * as Sentry from "@sentry/electron/main";
import AutoLaunch from "auto-launch";
@@ -23,6 +34,7 @@ import minimist from "minimist";
import "./ipc.js";
import "./seshat.js";
import "./settings.js";
import "./badge.js";
import * as tray from "./tray.js";
import Store from "./store.js";
import { buildMenuTemplate } from "./vectormenu.js";
@@ -232,19 +244,10 @@ async function setupGlobals(): Promise<void> {
const asarPath = await getAsarPath();
await loadConfig();
// we assume the resources path is in the same place as the asar
const resPath = await tryPaths("res", path.dirname(asarPath), [
// If run from the source checkout
"res",
// if run from packaged application
"",
]);
// The tray icon
// It's important to call `path.join` so we don't end up with the packaged asar in the final path.
const iconFile = `element.${process.platform === "win32" ? "ico" : "png"}`;
// Figure out the tray icon path & brand name
const iconFile = `icon.${process.platform === "win32" ? "ico" : "png"}`;
global.trayConfig = {
icon_path: path.join(resPath, "img", iconFile),
icon_path: path.join(path.dirname(asarPath), "build", iconFile),
brand: global.vectorConfig.brand || "Element",
};
@@ -258,25 +261,6 @@ async function setupGlobals(): Promise<void> {
});
}
// Look for an auto-launcher under 'Riot' and if we find one,
// port its enabled/disabled-ness over to the new 'Element' launcher
async function moveAutoLauncher(): Promise<void> {
if (!global.vectorConfig.brand || global.vectorConfig.brand === "Element") {
const oldLauncher = new AutoLaunch({
name: "Riot",
isHidden: true,
mac: {
useLaunchAgent: true,
},
});
const wasEnabled = await oldLauncher.isEnabled();
if (wasEnabled) {
await oldLauncher.disable();
await global.launcher.enable();
}
}
}
global.appQuitting = false;
const exitShortcuts: Array<(input: Input, platform: string) => boolean> = [
@@ -363,7 +347,6 @@ app.on("ready", async () => {
try {
asarPath = await getAsarPath();
await setupGlobals();
await moveAutoLauncher();
} catch (e) {
console.log("App setup failed: exiting", e);
process.exit(1);
@@ -441,7 +424,6 @@ app.on("ready", async () => {
if (argv["update"] === false) {
console.log("Auto update disabled via command line flag");
} else if (global.vectorConfig["update_base_url"]) {
console.log(`Starting auto update with base URL: ${global.vectorConfig["update_base_url"]}`);
void updater.start(global.vectorConfig["update_base_url"]);
} else {
console.log("No update_base_url is defined: auto update is disabled");
@@ -453,14 +435,6 @@ app.on("ready", async () => {
store,
});
try {
console.debug("Ensuring storage is ready");
await store.safeStorageReady();
} catch (e) {
console.error(e);
app.exit(1);
}
// Load the previous window state with fallback to defaults
const mainWindowState = windowStateKeeper({
defaultWidth: 1024,
@@ -492,6 +466,17 @@ app.on("ready", async () => {
webgl: true,
},
});
global.mainWindow.setContentProtection(store.get("enableContentProtection"));
try {
console.debug("Ensuring storage is ready");
if (!(await store.prepareSafeStorage(global.mainWindow.webContents.session))) return;
} catch (e) {
console.error(e);
app.exit(1);
}
void global.mainWindow.loadURL("vector://vector/webapp/");
if (process.platform === "darwin") {
@@ -579,10 +564,28 @@ app.on("ready", async () => {
webContentsHandler(global.mainWindow.webContents);
session.defaultSession.setDisplayMediaRequestHandler((_, callback) => {
global.mainWindow?.webContents.send("openDesktopCapturerSourcePicker");
setDisplayMediaCallback(callback);
});
session.defaultSession.setDisplayMediaRequestHandler(
(_, callback) => {
if (process.env.XDG_SESSION_TYPE === "wayland") {
// On Wayland, calling getSources() opens the xdg-desktop-portal picker.
// The user can only select a single source there, so Electron will return an array with exactly one entry.
desktopCapturer
.getSources({ types: ["screen", "window"] })
.then((sources) => {
callback({ video: sources[0] });
})
.catch((err) => {
// If the user cancels the dialog an error occurs "Failed to get sources"
console.error("Wayland: failed to get user-selected source:", err);
callback({ video: { id: "", name: "" } }); // The promise does not return if no dummy is passed here as source
});
} else {
global.mainWindow?.webContents.send("openDesktopCapturerSourcePicker");
}
setDisplayMediaCallback(callback);
},
{ useSystemPicker: true },
); // Use Mac OS 15+ native picker
setupMediaAuth(global.mainWindow);
});

View File

@@ -35,6 +35,14 @@
"file_menu": {
"label": "Soubor"
},
"icon_overlay": {
"description_error": "Chyba",
"description_notifications": {
"one": "Máte %(count)s nepřečtené oznámení.",
"few": "Máte %(count)s nepřečtená oznámení.",
"other": "Máte %(count)s nepřečtených oznámení."
}
},
"menu": {
"hide": "Skrýt",
"hide_others": "Skrýt ostatní",

View File

@@ -35,6 +35,9 @@
"file_menu": {
"label": "Ffeil"
},
"icon_overlay": {
"description_error": "Gwall"
},
"menu": {
"hide": "Cuddio",
"hide_others": "Cuddio'r Gweddill",
@@ -61,7 +64,9 @@
"backend_no_encryption_title": "Dim cefnogaeth amgryptio",
"unsupported_keyring": "Mae gan eich system allweddell nad yw'n cael ei chefnogi sy'n golygu nad oes modd agor y gronfa ddata.",
"unsupported_keyring_detail": "Heb ganfod allweddell Electron gefn. Gallwch geisio ffurfweddu'r gefn â llaw trwy gychwyn %(brand)s gyda dadl llinell orchymyn, gweithrediad untro. Gweler %(link)s.",
"unsupported_keyring_title": "System heb ei chefnogi"
"unsupported_keyring_title": "System heb ei chefnogi",
"unsupported_keyring_use_basic_text": "Defnyddiwch amgryptio gwannach",
"unsupported_keyring_use_plaintext": "Peidiwch â defnyddio amgryptio"
}
},
"view_menu": {

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Datei"
},
"icon_overlay": {
"description_error": "Fehler",
"description_notifications": {
"one": "Du hast %(count)s ungelesene Benachrichtigung.",
"other": "Du hast %(count)s ungelesene Benachrichtigungen."
}
},
"menu": {
"hide": "Verstecken",
"hide_others": "Andere verstecken",
@@ -57,11 +64,13 @@
"backend_changed_detail": "Zugriff auf Schlüssel im Systemschlüsselbund nicht möglich, er scheint sich geändert zu haben.",
"backend_changed_title": "Datenbank konnte nicht geladen werden",
"backend_no_encryption": "Ihr System verfügt über einen unterstützten Keyring, aber die Verschlüsselung ist nicht verfügbar.",
"backend_no_encryption_detail": "Electron hat festgestellt, dass Verschlüsselung in Ihrem Keyring %(backend)s nicht verfügbar ist. Bitte stellen Sie sicher, dass Sie den Keyringinstalliert haben. Wenn Sie den Keyring installiert haben, starten Sie ihn bitte neu und versuchen Sie es erneut. Optional können Sie die Verwendung einer schwächeren Form der Verschlüsselung zulassen %(brand)s.",
"backend_no_encryption_detail": "Electron hat festgestellt, dass der Keyring von %(backend)s keine Verschlüsselung bietet. Wenn du den Keyring installiert hast, starte den Rechner bitte neu und versuche es erneut. Optional kann %(brand)s auch eine abgeschwächte Verschlüsselung nutzen.",
"backend_no_encryption_title": "Keine Verschlüsselungsunterstützung",
"unsupported_keyring": "Der Schlüsselbund ihres Systems wird nicht unterstützt, wodurch die Datenbank nicht geöffnet werden kann.",
"unsupported_keyring_detail": "Die Schlüsselbunderkennung von Electron hat kein unterstütztes Backend gefunden. Möglicherweise können sie dennoch den ihres Systemes verwenden. Infos unter %(link)s.",
"unsupported_keyring_title": "System nicht unterstützt"
"unsupported_keyring": "Der Keyring des Systems wird nicht unterstützt. Daher kann die Datenbank nicht geöffnet werden kann.",
"unsupported_keyring_detail": "Die Keyring-Erkennung von Electron hat kein unterstütztes Backend gefunden. Du kannst einmalig versuchen, eine manuelle Konfiguration von %(brand)s über die Kommandozeile vorzunehmen. Infos unter %(link)s.",
"unsupported_keyring_title": "System nicht unterstützt",
"unsupported_keyring_use_basic_text": "Schwächere Verschlüsselung verwenden",
"unsupported_keyring_use_plaintext": "Verwende keine Verschlüsselung"
}
},
"view_menu": {

View File

@@ -32,9 +32,21 @@
"speech_start_speaking": "Start Speaking",
"speech_stop_speaking": "Stop Speaking"
},
"eol": {
"no_more_updates": "You are running an unsupported version of macOS. Please upgrade to receive %(brand)s updates.",
"title": "System unsupported",
"warning": "You are running an unsupported version of macOS. Please upgrade to ensure %(brand)s keeps working."
},
"file_menu": {
"label": "File"
},
"icon_overlay": {
"description_error": "Error",
"description_notifications": {
"one": "You have %(count)s unread notification.",
"other": "You have %(count)s unread notifications."
}
},
"menu": {
"hide": "Hide",
"hide_others": "Hide Others",

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Fail"
},
"icon_overlay": {
"description_error": "Viga",
"description_notifications": {
"one": "Sul on %(count)s lugemata teavitus",
"other": "Sul on %(count)s lugemata teavitust"
}
},
"menu": {
"hide": "Peida",
"hide_others": "Peida muud",

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Fichier"
},
"icon_overlay": {
"description_error": "Erreur",
"description_notifications": {
"one": "Vous avez %(count)s notification non lue.",
"other": "Vous avez %(count)s notifications non lues."
}
},
"menu": {
"hide": "Masquer",
"hide_others": "Masquer les autres",
@@ -48,7 +55,7 @@
"copy_image_url": "Copier l'adresse de l'image",
"copy_link_url": "Copier ladresse du lien",
"save_image_as": "Enregistrer limage sous…",
"save_image_as_error_description": "Limage na pas pu être sauvegardée",
"save_image_as_error_description": "Limage na pas pu être enregistrée",
"save_image_as_error_title": "Échec de la sauvegarde de limage"
},
"store": {
@@ -56,9 +63,14 @@
"backend_changed": "Effacer les données et recharger ?",
"backend_changed_detail": "Impossible d'accéder aux secrets depuis le trousseau de clés du système, il semble avoir changé.",
"backend_changed_title": "Impossible de charger la base de données",
"backend_no_encryption": "Votre système dispose d'un trousseau de clés compatible mais le chiffrement est indisponible.",
"backend_no_encryption_detail": "Electron a détecté que le chiffrement n'est pas disponible pour le trousseau %(backend)s. Veuillez vérifier que votre trousseau est installé. Si c'est le cas, redémarrez et réessayez. Comme alternative, vous pouvez autoriser %(brand)s à utiliser une option de chiffrement moins sécurisée.",
"backend_no_encryption_title": "Aucune prise en charge du chiffrement",
"unsupported_keyring": "Votre système possède un trousseau de clés non pris en charge, la base de données ne peut pas être ouverte.",
"unsupported_keyring_detail": "La détection du porte-clés par Electron n'a pas permis de trouver de backend compatible. Vous pouvez essayer de configurer manuellement le backend en utilisant %(brand)s avec un argument de ligne de commande. Cette opération doit être effectuer une seule fois. Voir%(link)s.",
"unsupported_keyring_title": "Système non pris en charge"
"unsupported_keyring_title": "Système non pris en charge",
"unsupported_keyring_use_basic_text": "Utiliser un chiffrement plus faible",
"unsupported_keyring_use_plaintext": "N'utilise pas de chiffrement"
}
},
"view_menu": {

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Fájl"
},
"icon_overlay": {
"description_error": "Hiba",
"description_notifications": {
"one": "%(count)s olvasatlan értesítése van.",
"other": "%(count)s olvasatlan értesítése van."
}
},
"menu": {
"hide": "Elrejtés",
"hide_others": "Mások elrejtése",
@@ -56,9 +63,14 @@
"backend_changed": "Adatok törlése és újratöltés?",
"backend_changed_detail": "Nem sikerült hozzáférni a rendszerkulcstartó titkos kódjához, úgy tűnik, megváltozott.",
"backend_changed_title": "Nem sikerült betölteni az adatbázist",
"backend_no_encryption": "A rendszer támogatott kulcstartóval rendelkezik, de a titkosítás nem érhető el.",
"backend_no_encryption_detail": "Az Electron észlelte, hogy a titkosítás nem érhető el a(z) %(backend)s kulcstartóján. Győződjön meg róla, hogy telepítve van-e a kulcstartó. Ha telepítve van, indítsa újra és próbálja újra. Esetleg engedélyezheti a gyengébb titkosítást az %(brand)s számára.",
"backend_no_encryption_title": "Nincs titkosítási támogatás",
"unsupported_keyring": "A rendszer nem támogatott kulcstartóval rendelkezik, ami azt jelenti, hogy az adatbázis nem nyitható meg.",
"unsupported_keyring_detail": "Az Electron kulcstartóészlelése nem talált támogatott háttérrendszert. Megpróbálhatja kézileg beállítani a háttérrendszert az %(brand)s egyszeri, parancssori argumentummal való indításával. Lásd: %(link)s.",
"unsupported_keyring_title": "A rendszer nem támogatott"
"unsupported_keyring_title": "A rendszer nem támogatott",
"unsupported_keyring_use_basic_text": "Gyengébb titkosítás használata",
"unsupported_keyring_use_plaintext": "Ne használjon titkosítást"
}
},
"view_menu": {

View File

@@ -35,6 +35,12 @@
"file_menu": {
"label": "Berkas"
},
"icon_overlay": {
"description_error": "Kesalahan",
"description_notifications": {
"other": "Anda memiliki %(count)s notifikasi yang belum dibaca."
}
},
"menu": {
"hide": "Sembunyikan",
"hide_others": "Sembunyikan yang Lain",

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Fil"
},
"icon_overlay": {
"description_error": "Feil",
"description_notifications": {
"one": "Du har %(count)s ulest varsel.",
"other": "Du har %(count)s uleste varsler."
}
},
"menu": {
"hide": "Skjul",
"hide_others": "Skjul andre",

View File

@@ -35,6 +35,14 @@
"file_menu": {
"label": "Plik"
},
"icon_overlay": {
"description_error": "Błąd",
"description_notifications": {
"one": "Masz %(count)s nieprzeczytane powiadomienie.",
"few": "Masz %(count)s nieprzeczytane powiadomienia.",
"many": "Masz %(count)s nieprzeczytanych powiadomień."
}
},
"menu": {
"hide": "Ukryj",
"hide_others": "Ukryj inne",
@@ -56,9 +64,14 @@
"backend_changed": "Wyczyścić dane i przeładować?",
"backend_changed_detail": "Nie można uzyskać dostępu do sekretnego magazynu, wygląda na to, że uległ zmianie.",
"backend_changed_title": "Nie udało się załadować bazy danych",
"backend_no_encryption": "Twój system posiada wspierany keyring, ale szyfrowanie nie jest dostępne.",
"backend_no_encryption_detail": "Elektron wykrył, że szyfrowanie nie jest dostępne w twoim keyring'u %(backend)s. Upewnij się, że keyring został zainstalowany. Jeśli tak, uruchom ponownie urządzenie i spróbuj ponownie. Opcjonalnie, zezwól %(brand)s, aby korzystał ze słabszego szyfrowania.",
"backend_no_encryption_title": "Szyfrowanie nie jest obsługiwane",
"unsupported_keyring": "System zawiera niewspierany keyring, nie można otworzyć bazy danych.",
"unsupported_keyring_detail": "Wykrywanie keyringu Electron nie znalazł wspieranego backendu. Możesz spróbować ręcznie ustawić backed, uruchamiając %(brand)s za pomocą wiesza poleceń. Zobacz %(link)s.",
"unsupported_keyring_title": "System niewspierany"
"unsupported_keyring_title": "System niewspierany",
"unsupported_keyring_use_basic_text": "Użyj słabszego szyfrowania",
"unsupported_keyring_use_plaintext": "Nie używaj szyfrowania"
}
},
"view_menu": {

View File

@@ -35,6 +35,13 @@
"file_menu": {
"label": "Arquivo"
},
"icon_overlay": {
"description_error": "Erro",
"description_notifications": {
"one": "Você tem %(count)s notificação não lida.",
"other": "Você tem %(count)s notificações não lidas."
}
},
"menu": {
"hide": "Esconder",
"hide_others": "Esconder Outras(os)",

View File

@@ -22,7 +22,9 @@
"about": "О программе",
"brand_help": "Помощь %(brand)s",
"help": "Помощь",
"preferences": "Предпочтения"
"no": "Нет",
"preferences": "Предпочтения",
"yes": "Да"
},
"confirm_quit": "Вы уверены, что хотите выйти?",
"edit_menu": {

View File

@@ -35,6 +35,14 @@
"file_menu": {
"label": "Súbor"
},
"icon_overlay": {
"description_error": "Chyba",
"description_notifications": {
"one": "Máte %(count)s neprečítané oznámenie.",
"few": "Máte %(count)s neprečítané oznámenia.",
"other": "Máte %(count)s neprečítaných oznámení."
}
},
"menu": {
"hide": "Skryť",
"hide_others": "Skryť ostatné",

View File

@@ -22,7 +22,9 @@
"about": "Om",
"brand_help": "%(brand)s-hjälp",
"help": "Hjälp",
"preferences": "Inställningar"
"no": "Nej",
"preferences": "Inställningar",
"yes": "Ja"
},
"confirm_quit": "Är du säker att du vill avsluta?",
"edit_menu": {
@@ -33,6 +35,13 @@
"file_menu": {
"label": "Arkiv"
},
"icon_overlay": {
"description_error": "Fel",
"description_notifications": {
"one": "Du har %(count)s oläst avisering.",
"other": "Du har %(count)s olästa aviseringar."
}
},
"menu": {
"hide": "Göm",
"hide_others": "Göm övriga",
@@ -49,6 +58,21 @@
"save_image_as_error_description": "Bilden sparades inte",
"save_image_as_error_title": "Misslyckades med att spara bilden"
},
"store": {
"error": {
"backend_changed": "Rensa data och ladda om?",
"backend_changed_detail": "Kunde inte komma åt hemligheten från systemnyckelringen, det verkar ha ändrats.",
"backend_changed_title": "Misslyckades att ladda databasen",
"backend_no_encryption": "Ditt system har en nyckelring som stöds men kryptering är inte tillgänglig.",
"backend_no_encryption_detail": "Electron har upptäckt att kryptering inte är tillgänglig på din nyckelring %(backend)s. Se till att du har nyckelringen installerad. Om du har nyckelringen installerad, starta om och försök igen. Alternativt kan du tillåta %(brand)s att använda en svagare form av kryptering.",
"backend_no_encryption_title": "Inget krypteringsstöd",
"unsupported_keyring": "Ditt system har en nyckelring som inte stöds, vilket innebär att databasen inte kan öppnas.",
"unsupported_keyring_detail": "Electrons nyckelringsdetektering hittade inte en backend som stöds. Du kan försöka konfigurera backend manuellt genom att starta %(brand)s med ett kommandoradsargument, en engångsåtgärd. Se %(link)s.",
"unsupported_keyring_title": "Systemet stöds inte",
"unsupported_keyring_use_basic_text": "Använd svagare kryptering",
"unsupported_keyring_use_plaintext": "Använd ingen kryptering"
}
},
"view_menu": {
"actual_size": "Verklig storlek",
"toggle_developer_tools": "Växla utvecklarverktyg",

View File

@@ -35,6 +35,14 @@
"file_menu": {
"label": "Файл"
},
"icon_overlay": {
"description_error": "Помилка",
"description_notifications": {
"one": "У вас є %(count)s непрочитане сповіщення.",
"few": "У вас є %(count)s непрочитані сповіщення.",
"many": "У вас є %(count)s непрочитаних сповіщень."
}
},
"menu": {
"hide": "Сховати",
"hide_others": "Сховати інші",
@@ -56,9 +64,14 @@
"backend_changed": "Очистити дані та перезавантажити?",
"backend_changed_detail": "Не вдається отримати доступ до таємного ключа з системного набору ключів, видається, він змінився.",
"backend_changed_title": "Не вдалося завантажити базу даних",
"backend_no_encryption": "Ваша система підтримує сховище ключів, але шифрування недоступне.",
"backend_no_encryption_detail": "Electron виявив, що шифрування недоступне у вашому сховищі ключів %(backend)s. Переконайтеся, що у вас встановлено сховище ключів. Якщо так, тоді перезавантажте комп'ютер і повторіть спробу. За бажанням, ви можете дозволити %(brand)s використовувати слабшу форму шифрування.",
"backend_no_encryption_title": "Шифрування не підтримується",
"unsupported_keyring": "Ваша система має непідтримуваний набір ключів. Це означає, що базу даних неможливо відкрити.",
"unsupported_keyring_detail": "Electron не виявив підтримуваного бекенда для роботи зі сховищем паролів. Ви можете вручну налаштувати його, запустивши %(brand)s з відповідним аргументом у командному рядку. Цю дію потрібно виконати лише один раз. Докладніше %(link)s.",
"unsupported_keyring_title": "Система не підтримується"
"unsupported_keyring_title": "Система не підтримується",
"unsupported_keyring_use_basic_text": "Використовувати слабше шифрування",
"unsupported_keyring_use_plaintext": "Не використовувати шифрування"
}
},
"view_menu": {

View File

@@ -1,5 +1,5 @@
/*
Copyright 2022-2024 New Vector Ltd.
Copyright 2022-2025 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
@@ -9,22 +9,9 @@ import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker, TouchBar,
import IpcMainEvent = Electron.IpcMainEvent;
import { randomArray } from "./utils.js";
import { Settings } from "./settings.js";
import { getDisplayMediaCallback, setDisplayMediaCallback } from "./displayMediaCallback.js";
import Store, { clearDataAndRelaunch } from "./store.js";
ipcMain.on("setBadgeCount", function (_ev: IpcMainEvent, count: number): void {
if (process.platform !== "win32") {
// only set badgeCount on Mac/Linux, the docs say that only those platforms support it but turns out Electron
// has some Windows support too, and in some Windows environments this leads to two badges rendering atop
// each other. See https://github.com/vector-im/element-web/issues/16942
app.badgeCount = count;
}
if (count === 0) {
global.mainWindow?.flashFrame(false);
}
});
let focusHandlerAttached = false;
ipcMain.on("loudNotification", function (): void {
if (process.platform === "win32" || process.platform === "linux") {
@@ -69,18 +56,6 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) {
case "getUpdateFeedUrl":
ret = autoUpdater.getFeedURL();
break;
case "getSettingValue": {
const [settingName] = args;
const setting = Settings[settingName];
ret = await setting.read();
break;
}
case "setSettingValue": {
const [settingName, value] = args;
const setting = Settings[settingName];
await setting.write(value);
break;
}
case "setLanguage":
global.appLocalization.setAppLocale(args[0]);
break;
@@ -174,7 +149,7 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) {
break;
case "clearStorage":
await clearDataAndRelaunch();
await clearDataAndRelaunch(global.mainWindow.webContents.session);
return; // the app is about to stop, we don't need to reply to the IPC
case "breadcrumbs": {
@@ -243,3 +218,10 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) {
});
ipcMain.handle("getConfig", () => global.vectorConfig);
const initialisePromiseWithResolvers = Promise.withResolvers<void>();
export const initialisePromise = initialisePromiseWithResolvers.promise;
ipcMain.once("initialise", () => {
initialisePromiseWithResolvers.resolve();
});

View File

@@ -52,8 +52,10 @@ export function setupMacosTitleBar(window: BrowserWindow): void {
-webkit-app-region: drag;
}
/* Exclude the main content elements from being drag handles */
.mx_AuthPage .mx_AuthPage_modalContent,
.mx_AuthPage .mx_AuthPage_modalBlur,
.mx_AuthPage .mx_AuthFooter > * {
.mx_AuthPage .mx_AuthFooter > *,
.mx_AuthPage .mx_Dropdown_menu {
-webkit-app-region: no-drag;
}
@@ -117,6 +119,12 @@ export function setupMacosTitleBar(window: BrowserWindow): void {
height: 20px;
-webkit-app-region: drag;
}
.mx_LeftPanel_newRoomList::before {
/* Aligned with the room header */
height: 13px;
border-right: 1px solid var(--cpd-color-bg-subtle-primary);
}
.mx_RoomView::before,
.mx_SpaceRoomView::before {

View File

@@ -32,6 +32,7 @@ const CHANNELS = [
"userAccessToken",
"homeserverUrl",
"serverSupportedVersions",
"showToast",
];
contextBridge.exposeInMainWorld("electron", {
@@ -54,11 +55,25 @@ contextBridge.exposeInMainWorld("electron", {
protocol: string;
sessionId: string;
config: IConfigOptions;
supportedSettings: Record<string, boolean>;
/**
* Do we need to render badge overlays for new notifications?
*/
supportsBadgeOverlay: boolean;
}> {
const [{ protocol, sessionId }, config] = await Promise.all([
ipcRenderer.emit("initialise");
const [{ protocol, sessionId }, config, supportedSettings] = await Promise.all([
ipcRenderer.invoke("getProtocol"),
ipcRenderer.invoke("getConfig"),
ipcRenderer.invoke("getSupportedSettings"),
]);
return { protocol, sessionId, config };
return { protocol, sessionId, config, supportedSettings, supportsBadgeOverlay: process.platform === "win32" };
},
async setSettingValue(settingName: string, value: any): Promise<void> {
return ipcRenderer.invoke("setSettingValue", settingName, value);
},
async getSettingValue(settingName: string): Promise<any> {
return ipcRenderer.invoke("getSettingValue", settingName);
},
});

View File

@@ -121,7 +121,7 @@ export default class ProtocolHandler {
public getProfileFromDeeplink(args: string[]): string | undefined {
// check if we are passed a profile in the SSO callback url
const deeplinkUrl = args.find(
(arg) => arg.startsWith(`${this.protocol}://`) || arg.startsWith(`${LEGACY_PROTOCOL}://`),
(arg) => arg.startsWith(`${this.protocol}:/`) || arg.startsWith(`${LEGACY_PROTOCOL}://`),
);
if (deeplinkUrl?.includes(SEARCH_PARAM)) {
const parsedUrl = new URL(deeplinkUrl);

View File

@@ -43,7 +43,7 @@ const seshatDefaultPassphrase = "DEFAULT_PASSPHRASE";
async function getOrCreatePassphrase(store: Store, key: string): Promise<string> {
try {
const storedPassphrase = await store.getSecret(key);
if (storedPassphrase !== null) {
if (storedPassphrase !== undefined) {
return storedPassphrase;
}
} catch (e) {

View File

@@ -5,15 +5,18 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
Please see LICENSE files in the repository root for full details.
*/
import { ipcMain } from "electron";
import * as tray from "./tray.js";
import Store from "./store.js";
interface Setting {
read(): Promise<any>;
write(value: any): Promise<void>;
supported?(): boolean; // if undefined, the setting is always supported
}
export const Settings: Record<string, Setting> = {
const Settings: Record<string, Setting> = {
"Electron.autoLaunch": {
async read(): Promise<any> {
return global.launcher.isEnabled();
@@ -35,7 +38,10 @@ export const Settings: Record<string, Setting> = {
},
},
"Electron.alwaysShowMenuBar": {
// not supported on macOS
// This isn't relevant on Mac as Menu bars don't live in the app window
supported(): boolean {
return process.platform !== "darwin";
},
async read(): Promise<any> {
return !global.mainWindow!.autoHideMenuBar;
},
@@ -46,7 +52,10 @@ export const Settings: Record<string, Setting> = {
},
},
"Electron.showTrayIcon": {
// not supported on macOS
// Things other than Mac support tray icons
supported(): boolean {
return process.platform !== "darwin";
},
async read(): Promise<any> {
return tray.hasTray();
},
@@ -68,4 +77,43 @@ export const Settings: Record<string, Setting> = {
Store.instance?.set("disableHardwareAcceleration", !value);
},
},
"Electron.enableContentProtection": {
// Unsupported on Linux https://www.electronjs.org/docs/latest/api/browser-window#winsetcontentprotectionenable-macos-windows
// Broken on macOS https://github.com/electron/electron/issues/19880
supported(): boolean {
return process.platform === "win32";
},
async read(): Promise<any> {
return Store.instance?.get("enableContentProtection");
},
async write(value: any): Promise<void> {
global.mainWindow?.setContentProtection(value);
Store.instance?.set("enableContentProtection", value);
},
},
};
ipcMain.handle("getSupportedSettings", async () => {
const supportedSettings: Record<string, boolean> = {};
for (const [key, setting] of Object.entries(Settings)) {
supportedSettings[key] = setting.supported?.() ?? true;
}
return supportedSettings;
});
ipcMain.handle("setSettingValue", async (_ev, settingName: string, value: any) => {
const setting = Settings[settingName];
if (!setting) {
throw new Error(`Unknown setting: ${settingName}`);
}
console.debug(`Writing setting value for: ${settingName} = ${value}`);
await setting.write(value);
});
ipcMain.handle("getSettingValue", async (_ev, settingName: string) => {
const setting = Settings[settingName];
if (!setting) {
throw new Error(`Unknown setting: ${settingName}`);
}
const value = await setting.read();
console.debug(`Reading setting value for: ${settingName} = ${value}`);
return value;
});

View File

@@ -16,8 +16,7 @@ limitations under the License.
import ElectronStore from "electron-store";
import keytar from "keytar-forked";
import { app, safeStorage, dialog, type SafeStorage } from "electron";
import { clearAllUserData, relaunchApp } from "@standardnotes/electron-clear-data";
import { app, safeStorage, dialog, type SafeStorage, type Session } from "electron";
import { _t } from "./language-helper.js";
@@ -51,22 +50,27 @@ type SaneSafeStorageBackend = Exclude<SafeStorageBackend, "unknown">;
* kwallet6 cannot be specified via command line
* https://www.electronjs.org/docs/latest/api/safe-storage#safestoragegetselectedstoragebackend-linux
*/
const safeStorageBackendMap: Omit<
Record<SafeStorageBackend, string>,
"unknown" | "kwallet6" | "system" | "plaintext"
> = {
const safeStorageBackendMap: Omit<Record<SaneSafeStorageBackend, string>, "system" | "plaintext"> = {
basic_text: "basic",
gnome_libsecret: "gnome-libsecret",
kwallet: "kwallet",
kwallet5: "kwallet5",
kwallet6: "kwallet6",
};
function relaunchApp(): void {
console.info("Relaunching app...");
app.relaunch();
app.exit();
}
/**
* Clear all data and relaunch the app.
*/
export async function clearDataAndRelaunch(): Promise<void> {
export async function clearDataAndRelaunch(electronSession: Session): Promise<void> {
Store.instance?.clear();
clearAllUserData();
electronSession.flushStorageData();
await electronSession.clearStorageData();
relaunchApp();
}
@@ -77,6 +81,7 @@ interface StoreData {
autoHideMenuBar: boolean;
locale?: string | string[];
disableHardwareAcceleration: boolean;
enableContentProtection: boolean;
safeStorage?: Record<string, string>;
/** the safeStorage backend used for the safeStorage data as written */
safeStorageBackend?: SafeStorageBackend;
@@ -100,7 +105,7 @@ class StorageWriter {
this.store.set(this.getKey(key), secret);
}
public get(key: string): string | null {
public get(key: string): string | undefined {
return this.store.get(this.getKey(key));
}
@@ -117,7 +122,7 @@ class SafeStorageWriter extends StorageWriter {
this.store.set(this.getKey(key), safeStorage.encryptString(secret).toString("base64"));
}
public get(key: string): string | null {
public get(key: string): string | undefined {
const ciphertext = this.store.get<string, string | undefined>(this.getKey(key));
if (ciphertext) {
try {
@@ -127,7 +132,7 @@ class SafeStorageWriter extends StorageWriter {
console.error("...ciphertext:", JSON.stringify(ciphertext));
}
}
return null;
return undefined;
}
}
@@ -211,6 +216,10 @@ class Store extends ElectronStore<StoreData> {
type: "boolean",
default: false,
},
enableContentProtection: {
type: "boolean",
default: false,
},
safeStorage: {
type: "object",
},
@@ -227,10 +236,10 @@ class Store extends ElectronStore<StoreData> {
});
}
private safeStorageReadyPromise?: Promise<unknown>;
private safeStorageReadyPromise?: Promise<boolean>;
public async safeStorageReady(): Promise<void> {
if (!this.safeStorageReadyPromise) {
this.safeStorageReadyPromise = this.prepareSafeStorage();
throw new Error("prepareSafeStorage must be called before using storage methods");
}
await this.safeStorageReadyPromise;
}
@@ -270,8 +279,18 @@ class Store extends ElectronStore<StoreData> {
* Prepare the safeStorage backend for use.
* We don't eagerly import from keytar as that would bring in data for all Element profiles and not just the current one,
* so we import lazily in getSecret.
*
* This will relaunch the app in some cases, in which case it will return false and the caller should abort startup.
*
* @param electronSession - The Electron session to use for storage (will be used to clear storage if necessary).
* @returns true if safeStorage was initialised successfully or false if the app will be relaunched
*/
private async prepareSafeStorage(): Promise<void> {
public async prepareSafeStorage(electronSession: Session): Promise<boolean> {
this.safeStorageReadyPromise = this.reallyPrepareSafeStorage(electronSession);
return this.safeStorageReadyPromise;
}
private async reallyPrepareSafeStorage(electronSession: Session): Promise<boolean> {
await app.whenReady();
// The backend the existing data is written with if any
@@ -282,11 +301,13 @@ class Store extends ElectronStore<StoreData> {
// Handle migrations
if (existingSafeStorageBackend) {
if (existingSafeStorageBackend === "basic_text" && backend !== "plaintext" && backend !== "basic_text") {
return this.prepareMigrateBasicTextToPlaintext();
this.prepareMigrateBasicTextToPlaintext();
return false;
}
if (this.get("safeStorageBackendMigrate") && backend === "basic_text") {
return this.migrateBasicTextToPlaintext();
this.migrateBasicTextToPlaintext();
return false;
}
if (existingSafeStorageBackend === "plaintext" && backend !== "plaintext") {
@@ -305,13 +326,21 @@ class Store extends ElectronStore<StoreData> {
// Store the backend used for the safeStorage data so we can detect if it changes, and we know how the data is encoded
this.recordSafeStorageBackend(backend);
} else if (existingSafeStorageBackend !== backend) {
// We already appear to have started using a backend other than the one that we picked, so
// set the override flag and relaunch with the backend we were previously using, unless we
// already have the override flag, in which case we must assume the previous backend is no
// longer usable, in which case we should fall into the next block and warn the user we can't
// migrate.
console.warn(`safeStorage backend changed from ${existingSafeStorageBackend} to ${backend}`);
if (existingSafeStorageBackend in safeStorageBackendMap) {
if (existingSafeStorageBackend in safeStorageBackendMap && !this.get("safeStorageBackendOverride")) {
this.set("safeStorageBackendOverride", true);
return relaunchApp();
relaunchApp();
return false;
} else {
await this.consultUserBackendChangedUnableToMigrate();
// This will either relaunch the app or throw an execption
await this.consultUserBackendChangedUnableToMigrate(electronSession);
return false;
}
}
@@ -321,9 +350,11 @@ class Store extends ElectronStore<StoreData> {
} else {
this.secrets = new StorageWriter(this);
}
return true;
}
private async consultUserBackendChangedUnableToMigrate(): Promise<void> {
private async consultUserBackendChangedUnableToMigrate(electronSession: Session): Promise<void> {
const { response } = await dialog.showMessageBox({
title: _t("store|error|backend_changed_title"),
message: _t("store|error|backend_changed"),
@@ -336,7 +367,7 @@ class Store extends ElectronStore<StoreData> {
if (response === 0) {
throw new Error("safeStorage backend changed and cannot migrate");
}
return clearDataAndRelaunch();
return clearDataAndRelaunch(electronSession);
}
private async consultUserConsentDegradedMode(backend: "plaintext" | "basic_text"): Promise<void> {
@@ -431,7 +462,7 @@ class Store extends ElectronStore<StoreData> {
*
* @returns A promise for the secret string.
*/
public async getSecret(key: string): Promise<string | null> {
public async getSecret(key: string): Promise<string | undefined> {
await this.safeStorageReady();
let secret = this.secrets!.get(key);
if (secret) return secret;
@@ -487,9 +518,11 @@ class Store extends ElectronStore<StoreData> {
/**
* @deprecated will be removed in the near future
*/
private async getSecretKeytar(key: string): Promise<string | null> {
private async getSecretKeytar(key: string): Promise<string | undefined> {
return (
(await keytar.getPassword(KEYTAR_SERVICE, key)) ?? (await keytar.getPassword(LEGACY_KEYTAR_SERVICE, key))
(await keytar.getPassword(KEYTAR_SERVICE, key)) ??
(await keytar.getPassword(LEGACY_KEYTAR_SERVICE, key)) ??
undefined
);
}

View File

@@ -1,5 +1,5 @@
/*
Copyright 2024 New Vector Ltd.
Copyright 2024-2025 New Vector Ltd.
Copyright 2017 Karl Glatz <karl@glatz.biz>
Copyright 2017 OpenMarket Ltd
@@ -8,10 +8,10 @@ Please see LICENSE files in the repository root for full details.
*/
import { app, Tray, Menu, nativeImage } from "electron";
import { v5 as uuidv5 } from "uuid";
import { writeFile } from "node:fs/promises";
import pngToIco from "png-to-ico";
import path from "node:path";
import fs from "node:fs";
import { v5 as uuidv5 } from "uuid";
import { _t } from "./language-helper.js";
@@ -38,18 +38,13 @@ function toggleWin(): void {
}
}
interface IConfig {
icon_path: string; // eslint-disable-line camelcase
brand: string;
}
function getUuid(): string {
// The uuid field is optional and only needed on unsigned Windows packages where the executable path changes
// The hardcoded uuid is an arbitrary v4 uuid generated on https://www.uuidgenerator.net/version4
return global.vectorConfig["uuid"] || "eba84003-e499-4563-8e9d-166e34b5cc25";
}
export function create(config: IConfig): void {
export function create(config: (typeof global)["trayConfig"]): void {
// no trays on darwin
if (process.platform === "darwin" || trayIcon) return;
const defaultIcon = nativeImage.createFromPath(config.icon_path);
@@ -71,6 +66,7 @@ export function create(config: IConfig): void {
initApplicationMenu();
trayIcon.on("click", toggleWin);
// See also, badge.ts
let lastFavicon: string | null = null;
global.mainWindow?.webContents.on("page-favicon-updated", async function (ev, favicons) {
if (!favicons || favicons.length <= 0 || !favicons[0].startsWith("data:")) {
@@ -92,15 +88,17 @@ export function create(config: IConfig): void {
if (process.platform === "win32") {
try {
const icoPath = path.join(app.getPath("temp"), "win32_element_icon.ico");
fs.writeFileSync(icoPath, await pngToIco(newFavicon.toPNG()));
await writeFile(icoPath, await pngToIco(newFavicon.toPNG()));
newFavicon = nativeImage.createFromPath(icoPath);
} catch (e) {
console.error("Failed to make win32 ico", e);
}
// Always update the tray icon for Windows.
trayIcon?.setImage(newFavicon);
} else {
trayIcon?.setImage(newFavicon);
global.mainWindow?.setIcon(newFavicon);
}
trayIcon?.setImage(newFavicon);
global.mainWindow?.setIcon(newFavicon);
});
global.mainWindow?.webContents.on("page-title-updated", function (ev, title) {

View File

@@ -7,8 +7,11 @@ Please see LICENSE files in the repository root for full details.
import { app, autoUpdater, ipcMain } from "electron";
import fs from "node:fs/promises";
import os from "node:os";
import { getSquirrelExecutable } from "./squirrelhooks.js";
import { _t } from "./language-helper.js";
import { initialisePromise } from "./ipc.js";
const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
@@ -69,7 +72,8 @@ async function pollForUpdates(): Promise<void> {
}
export async function start(updateBaseUrl: string): Promise<void> {
if (!(await available(updateBaseUrl))) return;
if (!(await available())) return;
console.log(`Starting auto update with base URL: ${updateBaseUrl}`);
if (!updateBaseUrl.endsWith("/")) {
updateBaseUrl = updateBaseUrl + "/";
}
@@ -111,10 +115,15 @@ export async function start(updateBaseUrl: string): Promise<void> {
}
}
async function available(updateBaseUrl?: string): Promise<boolean> {
/**
* Check if auto update is available on this platform.
* Has a side effect of firing showToast on EOL platforms so must only be called once!
* @returns True if auto update is available
*/
async function available(): Promise<boolean> {
if (process.platform === "linux") {
// Auto update is not supported on Linux
console.log("Auto update not supported on this platform");
console.warn("Auto update not supported on this platform");
return false;
}
@@ -122,13 +131,42 @@ async function available(updateBaseUrl?: string): Promise<boolean> {
try {
await fs.access(getSquirrelExecutable());
} catch {
console.log("Squirrel not found, auto update not supported");
console.warn("Squirrel not found, auto update not supported");
return false;
}
}
// Otherwise we're either on macOS or Windows with Squirrel
return !!updateBaseUrl;
if (process.platform === "darwin") {
// OS release returns the Darwin kernel version, not the macOS version, see
// https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history to interpret it
const release = os.release();
const major = parseInt(release.split(".")[0], 10);
if (major < 21) {
// If the macOS version is too old for modern Electron support then disable auto update to prevent the app updating and bricking itself.
// The oldest macOS version supported by Chromium/Electron 38 is Monterey (12.x) which started with Darwin 21.0
initialisePromise.then(() => {
ipcMain.emit("showToast", {
title: _t("eol|title"),
description: _t("eol|no_more_updates", { brand: global.trayConfig.brand }),
});
});
console.warn("Auto update not supported, macOS version too old");
return false;
} else if (major < 22) {
// If the macOS version is EOL then show a warning message.
// The oldest macOS version still supported by Apple is Ventura (13.x) which started with Darwin 22.0
initialisePromise.then(() => {
ipcMain.emit("showToast", {
title: _t("eol|title"),
description: _t("eol|warning", { brand: global.trayConfig.brand }),
});
});
}
}
return true;
}
ipcMain.on("install_update", installUpdate);

View File

@@ -11,7 +11,7 @@
"rootDir": "./src",
"declaration": true,
"typeRoots": ["src/@types", "node_modules/@types"],
"lib": ["es2022"],
"lib": ["es2022", "es2024.promise"],
"types": ["node"],
"strict": true
},

1842
yarn.lock
View File

File diff suppressed because it is too large Load Diff