Skip to content

webmail

v1.7.0 Security

This release includes 7 security fixes for security teams reviewing exposed deployments.

Published 13d Communication & Email
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 7 known CVEs

Topics

calendar contacts email email-client jmap mail
+4 more
nextjs self-hosted typescript webmail

Affected surfaces

auth rbac deps breaking_upgrade

ReleasePort's take

Moderate signal
editorial:auto 13d

1.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 summary

Updates Breaking Changes, 1.7.0, and i18n across a mixed release.

Changes in this release

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-pubkey and each bundle response carries the signature in the X-Bundle-Signature header. User-uploaded bundles still load unsigned, but managed marketplace and dev-folder bundles do not.
  • Plugins: bundleHash is 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; proInterface is 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 target in ui.openExternalUrl to 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/set so the server does not emit a bare Cc: 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.css and 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 main so 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:dns into 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

Track webmail

Get notified when new releases ship.

Sign up free

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.

All releases →

Related context

Beta — feedback welcome: [email protected]