Linus Rath
3bfc0e69d0
fix: check attachments a plugin adds to the composer and keep callbacks out of shouldShow
2026-10-14 02:58:47 +02:00
Linus Rath
03e9846758
fix: stop remounting message-details plugin slots on every render
2026-10-14 02:56:15 +02:00
Linus Rath
2adb1e2b12
fix: size toolbar plugin slots to their content and give composer plugin buttons their own row
2026-10-14 02:53:46 +02:00
Linus Rath
cef2438c33
fix: let untrusted plugins upload attachments for the composer again
2026-10-14 02:34:31 +02:00
Linus Rath
f048db7b52
fix: count each plugin hook failure once and keep a plugin that kept failing turned off
2026-10-14 02:33:45 +02:00
Linus Rath
a491eab317
fix: hash WKD names with WebCrypto instead of shipping a Node crypto polyfill to the browser
2026-10-14 02:31:39 +02:00
Linus Rath
23c4c654d7
fix: limit what a plugin can store, download, toast and send to a WKD lookup, and report refused admin config writes
2026-10-14 02:30:54 +02:00
Linus Rath
22846b4a9b
fix: keep blob uploads privileged-only and derive the WebAuthn salt from the calling plugin
2026-10-14 02:28:11 +02:00
Linus Rath
15cec58a46
fix: serve plugin bundles only to signed-in users
2026-10-14 02:27:35 +02:00
Linus Rath
c4853a4bba
fix: check dev-directory plugins like uploads and keep their files inside the plugin folder
2026-10-14 02:26:56 +02:00
Linus Rath
9408daaf5e
fix: keep an extension's admin state on re-upload and remove its config when it is deleted
2026-10-14 02:25:45 +02:00
Linus Rath
bb562362b8
fix: lay out plugin slots right-to-left in Arabic, Hebrew and Persian and use the app font size
2026-10-14 02:24:45 +02:00
Linus Rath
a21dbc92ec
fix: switch running plugins to a new language right away and fall back from de-CH to de
2026-10-14 02:23:40 +02:00
Linus Rath
8f70951555
fix: give plugins their default settings and apply setting changes without a reload
2026-10-14 02:21:45 +02:00
Linus Rath
eadff464a3
fix: keep plugin shortcuts behind ui:keyboard and off the keys the app and browser use
2026-10-14 02:19:10 +02:00
Linus Rath
ff1d1f399d
fix: limit plugin dialogs to one at a time, name the plugin in each and offer to turn it off
2026-10-14 02:15:45 +02:00
Linus Rath
be3debdcb4
fix: never send a message when a plugin that checks it before sending fails or does not answer
2026-10-14 02:11:59 +02:00
Linus Rath
592db209db
fix: sign plugin bundles when they are installed and require the signature for privileged plugins
2026-10-14 02:05:47 +02:00
Linus Rath
e720be7e17
feat: let users install their own plugins, with admin review of the actual code
...
The admin page offered "User Plugin Uploads" and "Require Admin
Approval", but nothing in Settings used them: there was no upload, no
uninstall and no way to ask for approval, and the admin had no list of
requests. The approval code that existed pinned a hash of the code only
and showed the admin a manifest the browser sent, never the code.
Now:
- Settings > Plugins has an install button (when uploads are allowed),
a remove button for the user's own plugins, and lists in plain
language what each plugin may do, high-risk items first
- an install sends the ZIP to the server, which reads the manifest and
code itself and pins the request to a hash of both
- the admin Plugins tab lists requests with the code and approves or
denies them; a user may have 10 open requests
- a user plugin is checked again on every start, so a revoked approval
or turning user plugins off takes effect
- the consent dialog and the plugin settings are translated, use the
theme colours, and show the sites a plugin may send data to
2026-10-14 02:03:26 +02:00
Linus Rath
e9f87c7970
fix: install Theme API v2 themes and their skins from the admin page and the marketplace
2026-10-14 01:47:58 +02:00
Linus Rath
e57b7a2c18
fix: check plugin and theme packages the same way on every install path
...
The Settings upload, the admin upload, the marketplace install and the
marketplace preview each parsed the ZIP and manifest with their own copy
of the code, and the copies had drifted. A `permissions` string skipped
validation and was then matched by substring, a small ZIP could inflate
to hundreds of megabytes on the server, the Settings upload dropped
`locales` and took origin lists unchecked, and settings schemas were
never checked at all.
All of them now go through `lib/extension-package.ts`:
- every file is inflated through a byte cap, with a limit on entries
- one manifest check: types, permissions, entrypoint, version,
minAppVersion, settingsSchema, configSchema, locales and origin lists
- only checked fields are stored
2026-10-14 01:43:43 +02:00
Linus Rath
0dd04ed21d
fix: stop forcing a theme after the admin deletes or disables it
2026-10-14 01:34:40 +02:00
Linus Rath
468c1aac0c
fix: refuse marketplace bundles whose id differs from the directory entry
2026-10-14 01:32:44 +02:00
Linus Rath
c45533646e
fix: give slot plugins the message, event or contact only with the matching read permission
2026-10-14 01:31:30 +02:00
Linus Rath
9bff740a89
fix: keep plugin network access to the origins in its manifest
2026-10-14 01:27:02 +02:00
Linus Rath
67a36c59d9
fix: keep the contact name readable when the detail pane is narrow
2026-10-14 00:40:18 +02:00
Linus Rath
c9d2ba3d03
fix: stop offering ISO timestamps as verification codes #1236
2026-10-14 00:15:08 +02:00
Linus Rath
e99a633379
fix: translate the calendar default reminder strings into all languages #1209
2026-10-13 17:09:36 +02:00
Linus Rath
2a2caaaa90
Merge branch 'main' of https://github.com/bulwarkmail/webmail
2026-10-13 16:59:53 +02:00
Linus Rath
3138c2bd04
fix: stop dropped files from inserting their path into the message body
2026-10-13 16:58:19 +02:00
mmmeon
d35654cadb
fix: set the sender's Message-ID on calendar invitations and replies
2026-10-13 16:32:25 +02:00
Linus Rath
e0f60c0946
Merge branch 'main' of https://github.com/bulwarkmail/webmail
2026-10-13 15:58:52 +02:00
Linus Rath
c878e51fce
fix: clear a calendar's default reminders with an empty list instead of null #1209
2026-10-13 15:56:10 +02:00
Linus Rath
82450f3345
feat: apply the current calendar defaults when an event switches back to them #1209
2026-10-13 15:56:10 +02:00
Linus Rath
3e202e73fd
feat: list every reminder and the calendar defaults in the event popover #1209
2026-10-13 15:56:10 +02:00
Linus Rath
1730d7bab4
feat: set default reminders for each calendar in calendar management #1209
2026-10-13 15:56:10 +02:00
Linus Rath
8181f5ba0c
feat: start new events on the calendar's default reminders #1209
2026-10-13 15:56:10 +02:00
Linus Rath
4e983e3e4e
feat: choose notification or email for each event reminder #1209
2026-10-13 15:56:09 +02:00
Linus Rath
87c6b6762c
feat: add helpers for calendar default alerts and email alert rows #1209
2026-10-13 15:56:09 +02:00
Linus Rath
3788446271
feat: let users hide shared mail accounts from the sidebar #1228
2026-10-13 15:55:54 +02:00
Linus Rath
e09676126b
feat: keep the selection while reading a message in mountain view #1231
2026-10-13 15:40:13 +02:00
Linus Rath
9cae33e3cb
feat: keep the mountain view compose window open while reading other mail #1229
2026-10-13 15:25:56 +02:00
Linus Rath
693d9613c0
feat: let users turn off the prompt before deleting several messages #1225
2026-10-13 15:16:05 +02:00
Linus Rath
435c1e0929
fix: select the rows shown between the two ends on shift-click #1230
2026-10-13 15:02:21 +02:00
Linus Rath
25cbbf8c10
fix: restore the full screen height when the iOS app resumes #1226
2026-10-13 14:53:23 +02:00
Linus Rath
8daa316c18
fix: show a mountain view message together with its conversation #1223
2026-10-13 14:48:58 +02:00
Linus Rath
6f281ef10a
fix: open mountain view threads as a conversation on the phone #1224
2026-10-13 14:35:12 +02:00
Linus Rath
ddab7c781f
feat: open several messages of a conversation at once in mountain view #1222
2026-10-13 14:24:47 +02:00
Linus Rath
94095cf86a
fix: paste a cell range as a table instead of an image #1233
2026-10-13 13:57:30 +02:00
Linus Rath
4d733aa598
chore: remove unused exports and the dead plugin error boundary
2026-10-13 13:36:51 +02:00