Commit Graph
2424 Commits
Author SHA1 Message Date
Linus Rath af53675191 feat: add plain-data views of messages, events, contacts, tasks and files for plugin hooks 2026-10-14 03:16:25 +02:00
Linus Rath a3cb9e630e refactor: describe every plugin hook in one catalogue
The hook buses, the permission each hook needs and the docs were three
separate lists that had drifted: 145 of 198 hooks were never fired and
nothing noticed. `lib/plugin-hook-catalog.ts` now names each hook with
its kind, permission, payload and when it fires; the permission check
reads it, and a test fails for any catalogued hook without a call site.
Groups still being wired in this branch are listed in that test.

Also:
- new before-hooks for archive, spam, read state, star, keywords, folder
  changes, RSVP, event import, tasks, file moves, settings, identities,
  filters and out-of-office, plus onComposerClose and onSyncStateChange
- removed hooks that can never fire: the S/MIME group (S/MIME is a
  plugin now), onMobileViewSwitch, onSidebarAppChange and the
  registerShortcut pseudo-hook
- smime:read no longer grants anything; manifests that name it still
  install, with a warning
2026-10-14 03:14:29 +02:00
Linus Rath 480a1bb226 fix: clear a plugin's stored data when the admin removes it, not only on uninstall 2026-10-14 03:05:05 +02:00
Linus Rath 8ef7ec022f fix: deliver a plugin OAuth callback only to the plugin that started the flow 2026-10-14 03:04:17 +02:00
Linus Rath bf1d8fd2c3 fix: stop keeping unanswered plugin hook calls and old slot callbacks around 2026-10-14 03:02:12 +02:00
Linus Rath ada81d5f8f fix: hide the Next.js dev badge inside plugin slots and warn that dev sandboxes are not isolated 2026-10-14 03:01:13 +02:00
Linus Rath fe4f809092 fix: keep a plugin side panel from squeezing the message too narrow to read 2026-10-14 03:00:46 +02:00
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