This release includes 7 security fixes for security teams reviewing exposed deployments.
Topics
+4 more
Affected surfaces
ReleasePort's take
Moderate signal1.7.0 makes server-managed plugin bundles require Ed25519 signatures and admin approval before loading (breaking change). Bundle hashes auto-migrate to SHA-256; verify plugin marketplace and configuration in staging.
Why it matters: Server-managed plugin bundles now require cryptographic signatures and admin approval (breaking change). Legacy hashes auto-migrate to SHA-256. Admins must validate plugin bundles before production deployment; marketplace validation prevents traversal attacks.
Summary
AI summaryUpdates Breaking Changes, 1.7.0, and i18n across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | High |
`ui.openExternalUrl` ignores plugin‑supplied `target` to prevent host‑frame hijack. `ui.openExternalUrl` ignores plugin‑supplied `target` to prevent host‑frame hijack. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Security | High |
Plugin configuration is restricted to admin users only. Plugin configuration is restricted to admin users only. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Security | Medium |
Validate plugin and theme IDs in marketplace to prevent traversal. Validate plugin and theme IDs in marketplace to prevent traversal. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Security | Medium |
Validate OAuth discovery endpoints against SSRF attacks. Validate OAuth discovery endpoints against SSRF attacks. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Security | Medium |
Ignore plugin-supplied target in ui.openExternalUrl. Ignore plugin-supplied target in ui.openExternalUrl. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Prevent plugin configuration from leaking to non-admin users. Prevent plugin configuration from leaking to non-admin users. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Bind Stalwart auth context to credential, not username. Bind Stalwart auth context to credential, not username. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Stop persisting passphrases in sessionStorage. Stop persisting passphrases in sessionStorage. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Pin parent origin in plugin iframe bridge to prevent hijacking. Pin parent origin in plugin iframe bridge to prevent hijacking. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Gate admin routes against cross-origin CSRF attacks. Gate admin routes against cross-origin CSRF attacks. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Tighten HTML sanitization for email, signature, i18n. Tighten HTML sanitization for email, signature, i18n. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Block script-bearing MIME types from inline attachment preview. Block script-bearing MIME types from inline attachment preview. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Escape print-window fields and re-sanitize body to prevent XSS. Escape print-window fields and re-sanitize body to prevent XSS. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Security | Medium |
Stalwart auth context is bound to the credential rather than the claimed username. Stalwart auth context is bound to the credential rather than the claimed username. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Security | Medium |
S/MIME passphrases are no longer persisted in `sessionStorage`. S/MIME passphrases are no longer persisted in `sessionStorage`. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Breaking | High |
Server‑managed plugin bundles must be Ed25519‑signed and admin‑approved before loading. Server‑managed plugin bundles must be Ed25519‑signed and admin‑approved before loading. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Breaking | Medium |
Bundle hash is now full SHA-256; legacy hashes auto-migrated. Bundle hash is now full SHA-256; legacy hashes auto-migrated. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Breaking | Medium |
Server-managed bundles require Ed25519 signature verification. Server-managed bundles require Ed25519 signature verification. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Breaking | Medium |
Plugins run in sandboxed iframe with postMessage RPC bridge. Plugins run in sandboxed iframe with postMessage RPC bridge. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Tabbed multi-pane interface with drag-to-reorder and split. Tabbed multi-pane interface with drag-to-reorder and split. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Cross-account email moves within Pro mode. Cross-account email moves within Pro mode. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Multi-account calendar sidebar split by owned vs shared. Multi-account calendar sidebar split by owned vs shared. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Multi-account contacts and cross-account file picker. Multi-account contacts and cross-account file picker. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Composer From dropdown grouped by account. Composer From dropdown grouped by account. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Per-plugin admin approval with Ed25519 signature verification. Per-plugin admin approval with Ed25519 signature verification. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Marketplace update flow for installed plugins and themes. Marketplace update flow for installed plugins and themes. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
List and reorder logged-in accounts from settings. List and reorder logged-in accounts from settings. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Mobile handoff page with JMAP authentication verification. Mobile handoff page with JMAP authentication verification. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Support multiple flexible event reminders in calendar. Support multiple flexible event reminders in calendar. Source: llm_adapter@2026-05-22 Confidence: high |
— |
| Feature | Medium |
Multi-account mail sidebar with unified inbox and search. Multi-account mail sidebar with unified inbox and search. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Allow setup wizard over plain HTTP with dismissable warning. Allow setup wizard over plain HTTP with dismissable warning. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Warn when JMAP URL points at local-only host. Warn when JMAP URL points at local-only host. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Pluggable reply and forward quote header in composer. Pluggable reply and forward quote header in composer. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Expose PWA, app identity, and extension directory keys. Expose PWA, app identity, and extension directory keys. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Surface OAuth scope settings and wire admin policy gates. Surface OAuth scope settings and wire admin policy gates. Source: llm_adapter@2026-05-22 Confidence: low |
— |
| Feature | Medium |
Unified inbox with full‑text search across all logged‑in accounts in Pro mode. Unified inbox with full‑text search across all logged‑in accounts in Pro mode. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
Full changelog
1.7.0 (2026-05-21)
New: Pro mode (experimental)
Opt-in tabbed multi-pane interface for power users. Open multiple mail, calendar, contacts, and file views side-by-side, drag tabs to reorder or split panes at the edges, and work across all logged-in accounts in one shell, cross-account email moves, a unified inbox with search, account-split calendar/contacts/files sidebars, and a per-account "From" dropdown in the composer. Enable from Settings → Appearance; the proInterface preference is per-device and not synced.
Pro mode is experimental and we need your feedback to shape it. If something feels off, breaks, or is missing, please don't hesitate to open an issue or start a discussion on GitHub!
Breaking Changes
- Plugins: Plugins now run inside a null-origin iframe sandbox and talk to the host over a postMessage RPC bridge. The in-process plugin runtime is gone; the bundled in-tree plugins have been migrated. Third-party plugins built against the old in-process API need to be ported to the sandboxed runtime.
- Plugins: Server-managed bundles must be Ed25519-signed by the host and approved by an admin before they load. The host public key is served from
/api/plugin-signing-pubkeyand each bundle response carries the signature in theX-Bundle-Signatureheader. User-uploaded bundles still load unsigned, but managed marketplace and dev-folder bundles do not. - Plugins:
bundleHashis now a full SHA-256 over the bundle. Legacy short hashes are migrated on first load; any out-of-band tooling that pinned the old hash format needs to be updated.
Features
- Pro: Tabbed shell with drag-to-reorder, drag-to-edge to split, side-by-side panes, and pane-aware responsive layout with a scoped sidebar overlay
- Pro: Auto-redirect to the Pro shell when Pro mode is on;
proInterfaceis kept per-device instead of syncing - Pro: Multi-account mail sidebar with client routing and a per-account mailbox cache
- Pro: Unified mailbox always visible, with full-text search
- Pro: Cross-account email moves
- Pro: Multi-account calendar sidebar split into owned vs shared per account
- Pro: Multi-account contacts and a cross-account file picker
- Pro: Composer From dropdown grouped by account
- Plugins: Per-plugin admin approval workflow with Ed25519 bundle signing verified on load
- Plugins: Marketplace update flow for installed plugins and themes
- Setup: Allow the setup wizard over plain HTTP with a dismissable warning gate
- Setup: Warn when the JMAP URL points at a local-only host
- Account: List and reorder logged-in accounts from settings (#282)
- Mail: Mobile handoff page with JMAP authentication verification for cross-device OAuth
- Mail: Pluggable reply/forward quote header (#295)
- Calendar: Support multiple flexible event reminders (#170)
- Admin: Expose PWA, app identity, and extension directory keys in the JSON config (#312)
- Admin: Surface OAuth scope settings and wire up orphaned admin policy gates
Security
- Plugins: Pin parent origin in the iframe bridge to block cross-frame postMessage
- Plugins: Ignore plugin-supplied
targetinui.openExternalUrlto block host-frame hijack - Plugins: Validate plugin/theme id in marketplace install to block path traversal
- Plugins: Prevent plugin config from leaking to non-admin users
- Admin: Gate admin routes against cross-origin CSRF
- Auth: Bind Stalwart auth context to the credential, not the cookie-claimed username
- Auth: Validate OAuth discovery endpoints against SSRF
- Mail: Tighten HTML sanitization at plain-text email, signature, and i18n render sites
- Mail: Block script-bearing MIME types from inline attachment preview
- Mail: Escape print-window fields and re-sanitize body to block XSS
- S/MIME: Stop persisting passphrases in
sessionStorage - API: Correct regex for valid API POST path validation
Fixes
- Mail: Serialize draft autosave with send to stop replies stalling in Drafts (#303)
- Mail: Omit empty cc/bcc from
Email/setso the server does not emit a bareCc:header (#301) - Mobile: Allow adding contacts from the mail recipient popover (#306)
- Mobile: Prevent dual-scroll and use full width for mail content
- Mobile: OAuth handoff flow
- Calendar: Scope iCal subscriptions per JMAP account; fix refresh and clear
- Calendar: iCal subscription refresh, rollback, and URL normalization
- Calendar: Show avatars in the calendar/address book sharing menu
- Contacts: Normalize malformed contact photo data URIs (#307)
- Identity: Clear identity signature fields when emptied
- Identity: Show size cap on identity signature fields
- Identity: Allow table-based layouts in the HTML signature sanitizer
- Plugins: Load
globals.cssand Geist font in the plugin sandbox iframe - Plugins: Sync plugin slot iframe height with reported content height
- Plugins: Use plugin slot offer snapshots for
useSyncExternalStore - Plugins: Trust the directory version on marketplace install and update
- Filters: Prevent duplication of Bulwark rules with literal braces in values
- Setup: Defer setup wizard HTTP detection to avoid hydration mismatch
- Routing: Anchor unmatched URLs into
mainso 404 renders - Routing: Respect server-resolved locale on first visit (#309)
- Routing: Split app into
(main)/(sandbox)route groups so the plugin iframe hydrates properly - Files: Stop parent directory navigation from jumping to root
- Build: Stop pulling
node:dnsinto the client bundle via OAuth discovery - UI: Toggle recipient popover when clicking the name again
- UI: Remove white halo around photo avatars
i18n
- Add missing translation keys across 16 locales
Breaking Changes
- Plugins now run inside a null-origin iframe sandbox with postMessage RPC; the in-process plugin runtime is removed, requiring porting of third‑party plugins to the sandboxed API.
- `bundleHash` for server‑managed plugin bundles changed to full SHA-256 (legacy short hashes migrated on first load).
- Server‑managed plugin bundles must be Ed25519‑signed by the host and approved by an admin before loading; unsigned user‑uploaded bundles still load.
Security Fixes
- Pin parent origin in iframe bridge to block cross‑frame postMessage attacks.
- Ignore plugin‑supplied `target` in `ui.openExternalUrl` to prevent host‑frame hijacking.
- Validate plugin/theme ID on marketplace install to block path traversal.
- Prevent plugin config from leaking to non‑admin users.
- Gate admin routes against CSRF.
- Bind Stalwart auth context to credential, not cookie‑claimed username; validate OAuth discovery endpoints against SSRF.
- Tighten HTML sanitization at plain‑text email, signature, and i18n render sites; block script‑bearing MIME types in inline attachment preview.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About webmail
Webmail built for the 21st Century. A modern, self-hosted email client for Stalwart Mail Server powered by the JMAP protocol. Email, calendar, contacts and files. Fast, private, and open source.
Beta — feedback welcome: [email protected]