App Suite Releases
  • 8.47
  • 8.35
  • 7.10.6
Imprint
  • 8.47
  • 8.35
  • 7.10.6
Imprint
  • Release 8.52Upcoming
  • Release 8.51
  • Release 8.50
  • Release 8.49
  • Release 8.48
    • Noteworthy Changes
      • Important Changes
      • App Suite Middleware
    • Changelogs
      • App Suite UI
      • App Suite Middleware
      • Additional Components
        • AI Service
        • OX Guard UI
        • Switchboard
    • Helm Charts
      • AI-Service documentation
      • App Suite Stack Chart
      • Helm Chart core-cacheservice
      • Helm Chart core-documentconverter
      • Helm Chart core-imageconverter
      • core-mw
      • Switchboard
  • Release 8.47LTS
  • Release 8.46
  • Release 8.45
  • Release 8.44
  • Release 8.43
Maintained. Older releases are best effort.
Upcoming
Not released yet
LTS
Long-term support branch

App Suite Middleware

8.48.124 - 2026-07-24

Fixed

  • Report exact attachment sizes for composition space drafts (support#1585)

8.48.123 - 2026-07-22

Fixed

  • Never skip sender validation when transmitting via action=new (support#1531)

8.48.122 - 2026-07-22

Fixed

  • Repoint openapi plugins to gitlab.com registry and bump to latest
  • Validate From/Sender ownership on mail bounce (support#1531)
  • Throw FOLDER_NOT_FOUND instead of NPE for missing calendar folder (support#1577)
  • Guard composite LDAP filter construction against non-representable search term operands (support#1578)
  • Merge multiple results during peer attendee lookup (support#1579)
  • Corrected column offsets when reading permission records into condition tree cache (support#1580)
  • Stray placeholder in SQL UPDATE for sent folder in RdbMailAccountStorage (support#1581)
  • Single-pass, escaping URI token compression to keep proxy registrations round-trip safe (support#1582)

8.48.118 - 2026-07-16

Changed

  • SCR-1793: Harden Redis connection lifecycle against stale/orphaned connected clients

Fixed

  • Bump About-box default copyright year to 2026 (support#1553)
  • Store DB-assignment and schema-update-state cache entries as plain per-context/per-schema keys instead of one global group hash (support#1562)

8.48.115 - 2026-06-25

Changed

  • Add owner-trace diagnostic logging for filestore snippets (support#1329)

Fixed

  • Make a failed scheduled-mail failure-notification visible (support#1515)

8.48.114 - 2026-06-23

Fixed

  • DB pool exhaustion during autoscaler scale-up (support#1477)
  • Add opt-in overload protection for cache-outage DB stampedes (support#1517)

8.48.113 - 2026-06-23

Fixed

  • ExistingUISettingsSecret checksum and document existing*Secret values
    • Backport of main commit ab96e610c2f to stable-8.48.
    • The existingUISettingsSecret was missing from core-mw.existingSecretsChecksum, so content changes to that secret did not trigger a rolling restart unlike the other existing* secrets. Added the missing block.
    • Also added a guide on the existing*Secret values to the chart README, clarified the additive-vs-replace behavior in the values.yaml comments, and bumped the chart version to 6.19.8.

8.48.112 - 2026-06-19

Fixed

  • Add missing import for LogProperties in TransportPerformer
  • Retry/back-off for retryable mail access errors when transporting scheduled mails (support#1495)
  • Stop DB heart-beat after a failed keep-alive instead of retrying on a dead connection (support#1501)

8.48.111 - 2026-06-03

Fixed

  • CP-572: Avoid full Redis key-space scan when closing sessions by user/context filter

8.48.110 - 2026-05-29

Fixed

  • IOL-2841: Reconnect mail access when attachment handling takes too long

8.48.109 - 2026-05-28

Fixed

  • Scheduled mail date_to_send returns null in action=all when IMAP server drops $CurrentlyScheduled user flag (support#1444)

8.48.108 - 2026-05-28

Fixed

  • Merge schema lists in Java to avoid collation mismatch in update task listing (support#1467)

8.48.107 - 2026-05-28

Fixed

  • Data: URL inline images rendered with empty src in display path (support#931)

8.48.106 - 2026-05-21

Fixed

  • Movecontextdatabase fails on large contexts due to configdb wait_timeout (support#1218)

8.48.104 - 2026-05-21

Fixed

  • Use more generic error code in failure notification to avoid possibly exposing sensitive information (support#1461)

8.48.103 - 2026-05-21

Fixed

  • Re-verify cached schema state when blocking updates remain pending (support#1162)
  • Use more generic error code in failure notification to avoid possibly exposing sensitive information (support#1461)

8.48.102 - 2026-05-20

Fixed

  • NPE in OXFolderManagerImpl.parseTruncated() for truncated 'meta' folder column; enlarge meta BLOB to MEDIUMBLOB (core#512)
    • SCR-1709: Enlarge the "meta" column from BLOB to MEDIUMBLOB for the "oxfolder_tree" and "del_oxfolder_tree" tables
  • Externalize data: URL inline images into managed files (support#931)
  • Sanitize illegal filename characters when saving mail attachments to Drive (support#1459)
    • The "Save to Drive" action (PUT /mail?action=attachment) only replaced "/" with "_" in the attachment file name, leaving other characters that are illegal in file-storage names (":", "", "?", "*", """, "<", ">", "|") to flow down into the storage layer which then rejected the request with FILE_NAME contains illegal characters.
    • Reuse FilenameValidationUtils.sanitizeName to replace every illegal character with "_", trim trailing dots/whitespace and fall back to a generated default name for reserved names; use MailMessageParser.generateFilename as the fallback so the original sequence id and MIME type drive the substitute name.
    • Adds FilenameValidationUtilsTest covering the colon scenario from the support ticket plus the existing replacement, trim, reserved-name and Unicode cases.
  • Send failure notification for scheduled mails even when transport setup fails (support#1460)
  • Surface legacy single-schema pools in listdatabaseschema and runallupdate (support#1462)
  • Harden Redis Failsafe defaults to prevent bulkhead-full floods (support#1464)
    • The previous defaults turned a brief Redis latency spike into a mass REDIS-0014 ("Too many concurrent commands") flood:
    • bulkhead.maxWaitTimeMillis = 5 made the bulkhead a hard reject limit instead of providing backpressure
    • breaker.enabled = false left no recovery net once the bulkhead saturated
    • retry.maxRetries = 0 propagated single transient reconnect errors straight to callers
    • The common circuit breaker's failure predicate ignored BulkheadFullException, so sustained saturation never tripped it
    • Changes:
    • RedisProperty: bulkhead.maxWaitTimeMillis 5 -> 2000, breaker.enabled false -> true, retry.maxRetries 0 -> 1
    • FailsafePolicies: extend the common breaker predicate to include BulkheadFullException (and the wrapped TOO_MANY_COMMANDS code) so sustained bulkhead-full conditions open the breaker and let the end-point recover
    • Redis.yml: align documented defaults with RedisProperty (connect.breaker thresholds/delay and the three new defaults)
    • Add FailsafePoliciesTest covering all three predicates incl. the new bulkhead-full case

8.48.101 - 2026-05-20

Fixed

  • User proper order for charset and collation

8.48.100 - 2026-05-12

Fixed

  • Orphaned mail accounts with oauth=0 disappear from account list
    • Reject 0 as a valid OAuth account identifier across all mail account read/write paths (DB layer, cache codec, user-copy provisioning) and add an update task that migrates pre-existing 0 values to NULL.

8.48.99 - 2026-05-07

Fixed

  • Properly handle null values in jslob storage

8.48.98 - 2026-05-06

Added

  • PBSR-1603: Support migration of user accounts with deputy permissions to shared accounts

8.48.97 - 2026-05-05

Added

  • Optional aggressive ACL cleanup when revoking a deputy permission (support#1004)
    • Introduces "com.openexchange.deputy.provider.imap.aggressiveAclCleanupOnRevoke" (default: false). When enabled, the revocation flow unconditionally removes the deputy's ACL entry from every considerable personal mailbox instead of consulting the ACL directory captured at grant time.
    • This is intended for deployments that grant ACLs solely via the deputy feature: because servers like Dovecot inherit ACLs from parent folders and from INBOX (acl_defaults_from_inbox), the captured directory cannot reliably distinguish deputy-induced from pre-existing ACLs once subfolders are involved. Any remaining ACL entry for a former deputy is then treated as a leftover and wiped.
    • Property is honored by both the IMAP-direct (DeputyImapProvider) and the DoveAdm-based (DoveAdmProvider) deputy provider.

Fixed

  • Movecontextdatabase failed with "Table '<oxdb>.context' doesn't exist"
    • When disabling the context at the start of doMoveDatabaseContextInternal(), the source user-DB connection (oxDbWriteCon) was passed to myEnableDisableContext(), which executes UPDATE context SET enabled = 0. The context table only exists in configdb, so the statement was issued against the user schema (e.g. oxdatabase_444) and failed.
    • Pass null instead so myEnableDisableContext() acquires its own configdb write connection -- restoring the pre-e316526b33a behaviour of disable(ctx, reason). The mutual exclusion of concurrent provisioning is already handled by the surrounding context claim, so no transactional coupling with oxDbWriteCon is needed here.
    • Closes appsuite/platform/core#509
  • Invalidate cached MailAccess instances when mail account is changed (core#504)
    • After a SOAP provisioning operation that changes a user's PrimaryEmail, the generated iOS/MacOS onboarding mobileconfig profile contained the previous login in IncomingMailServerUsername / OutgoingMailServerUsername, while EmailAddress reflected the new address. Cause: the node-local SingletonMailAccessCache holds MailAccess instances whose MailConfig has the login eagerly populated from the MailAccount and was not invalidated when the underlying MailAccount or user changed; the cache only expired via its idle timeout.
    • CachingMailAccountStorage.invalidateMailAccount(s) now also clears the node-local MailAccess cache for the affected user and broadcasts a cluster-wide invalidation event over the existing MAIL_SESSION_EVENTS channel, so other nodes drop their cached MailAccess instances too.
    • New MailAccessCacheInvalidator listens on the same channel and drops cached MailAccess entries on remote events.
    • New MailSessionCache.fireMailCacheInvalidationEvent publishes the event unconditionally (in contrast to clearFor, which only publishes when the publishing node has matching local sessions - not the case for the admin node performing SOAP provisioning).
    • Defense in depth: MailOnboardingProvider now refreshes the MailConfig via MailConfig.getConfig(...) analog to the existing TransportConfig refresh, so the onboarding plist is correct even if the cache invalidation does not reach this node.
  • Lenient behavior when dropping ACL permission (leftovers from deputy permission) from considerable mailboxes (support#1004)

8.48.96 - 2026-05-05

Added

  • Optional aggressive ACL cleanup when revoking a deputy permission (support#1004)
    • Introduces "com.openexchange.deputy.provider.imap.aggressiveAclCleanupOnRevoke" (default: false).
    • When enabled, the revocation flow unconditionally removes the deputy's ACL entry from every
    • considerable personal mailbox instead of consulting the ACL directory captured at grant time.
    • This is intended for deployments that grant ACLs solely via the deputy feature: because servers
    • like Dovecot inherit ACLs from parent folders and from INBOX (acl_defaults_from_inbox), the
    • captured directory cannot reliably distinguish deputy-induced from pre-existing ACLs once
    • subfolders are involved. Any remaining ACL entry for a former deputy is then treated as a
    • leftover and wiped.
    • Property is honored by both the IMAP-direct (DeputyImapProvider) and the DoveAdm-based
    • (DoveAdmProvider) deputy provider.

Fixed

  • Invalidate cached MailAccess instances when mail account is changed (core#504)
    • After a SOAP provisioning operation that changes a user's PrimaryEmail, the
    • generated iOS/MacOS onboarding mobileconfig profile contained the previous
    • login in IncomingMailServerUsername / OutgoingMailServerUsername, while
    • EmailAddress reflected the new address. Cause: the node-local
    • SingletonMailAccessCache holds MailAccess instances whose MailConfig has
    • the login eagerly populated from the MailAccount and was not invalidated
    • when the underlying MailAccount or user changed; the cache only expired
    • via its idle timeout.
    • CachingMailAccountStorage.invalidateMailAccount(s) now also clears the
    • node-local MailAccess cache for the affected user and broadcasts a
    • cluster-wide invalidation event over the existing MAIL_SESSION_EVENTS
    • channel, so other nodes drop their cached MailAccess instances too.
    • New MailAccessCacheInvalidator listens on the same channel and drops
    • cached MailAccess entries on remote events.
    • New MailSessionCache.fireMailCacheInvalidationEvent publishes the event
    • unconditionally (in contrast to clearFor, which only publishes when the
    • publishing node has matching local sessions - not the case for the
    • admin node performing SOAP provisioning).
    • Defense in depth: MailOnboardingProvider now refreshes the MailConfig
    • via MailConfig.getConfig(...) analog to the existing TransportConfig
    • refresh, so the onboarding plist is correct even if the cache
    • invalidation does not reach this node.
  • Lenient behavior when dropping ACL permission (leftovers from deputy permission) from considerable mailboxes (support#1004)

8.48.95 - 2026-05-04

Added

  • PBSR-1677: Overall "set" Method to Apply all Shared Account Permissions for Target

8.48.94 - 2026-04-30

Changed

  • Added possibility to log all connection-using thread on "too many connections" error (support#1363)
    • Changed: Added possibility to log all connection-using thread on "too many connections" error - /appsuite/support#1363
    • Changed: Add jitter/offset to periodic (general) clean-up jobs to avoid start burst - /appsuite/support#1363
    • Fixed: Reduce configdb pressure of nightly cleanup runs - appsuite/support#1363
    • Mitigates the synchronized configdb-connection burst at the beginning of the nightly cleanup window that surfaces as DBP-0001 / "too many connections" against the cluster:
    • Mix a per-node salt (hostname + random component) into the deterministic per-job offset so that the same job is started in a different slot on every pod, preventing the cluster-wide synchronized burst that pure jobId.hashCode()-based offsets produced.
    • Make the per-job schema concurrency configurable via com.openexchange.database.cleanup.schemaConcurrencyLevel (default 4 instead of the previously hard-coded 10), which is the main multiplier for parallel configdb access per pod.
    • Add a global hard cap on concurrent configdb schema look-ups via com.openexchange.database.cleanup.maxConcurrentSchemaLookups (default 8), independent of concurrencylevel/schemaConcurrencyLevel.
    • Pre-resolve representativeContextId -> PoolAndSchema in a single batch lookup per cleanup run and pass it through to CleanUpJobRunnable, so per-schema cleanup no longer issues an additional configdb roundtrip per schema.
    • Add a soft submission ramp-up at the start of the schedule window via com.openexchange.database.cleanup.rampUpMillis (default 60s) on top of the existing jitter, eliminating the exact window-boundary spike independent of hash collisions.
    • Treat Category.CATEGORY_SERVICE_DOWN (e.g. DBP-0001 "Cannot get connection to config DB" / "Cannot create pooled object") as retry-able with exponential back-off and jitter both for per-schema execution and for uncached configdb schema look-ups, so the pool can recover instead of being hammered while saturated.

8.48.90 - 2026-04-28

Fixed

  • Limit number of concurrent transport attempts for scheduled mails (core#497)
    • Changed: Avoid premature permit release - /appsuite/platform/core#497
    • Changed: Introduced simple SMTP connection pool & Use PIPELINING extension for MAIL-FROM and RCPT-TO commands - /appsuite/platform/core#497
    • Changed: Added configuration switch to allow per node/JVM to perform the check and transport of due scheduled mails - /appsuite/platform/core#497
    • Fixed: Limit number of concurrent transport attempts for scheduled mails - /appsuite/platform/core#497
    • Added property documentation

8.48.89 - 2026-04-24

Fixed

  • IAE-133: Orderly apply punycode decoding for OAUTHBEARER user name if "com.openexchange.mail.filter.punycode" is set to "true"

8.48.87 - 2026-04-23

Added

  • "davx5manual" onboarding scenario for manual DAVx5 Select setup
  • Expose "davx5" capability when both DAVx5 onboarding scenarios are enabled

8.48.86 - 2026-04-22

Fixed

  • Prevent possible IMAP injection vulnerability (core#502)

8.48.85 - 2026-04-21

Fixed

  • Avoid writing periodic save-points (by default) to avoid possible access problems (core#486)

8.48.84 - 2026-04-16

Changed

  • Ensure consistent connection pool state (support#1363)

8.48.83 - 2026-04-15

Fixed

  • PBSR-1664: Orderly consider mail login resolver when dealing with a user's ACL name

8.48.82 - 2026-04-15

Fixed

  • PBSR-1664: Orderly consider mail login resolver when dealing with a user's ACL name

8.48.80 - 2026-04-14

Changed

  • SCR-1691: Added command-line tools for mail signatures

8.48.79 - 2026-04-10

Changed

  • Build descriptive app-specific password names during DAVx5 onboarding

Removed

  • Remove com.openexchange.davx5.rest bundle and adopt lean configuration for DAV onboarding providers
    • SCR-1687: Renamed DAVx5 Select configuration properties

8.48.77 - 2026-04-09

Added

  • Translation updates 8.48: cs_CZ, da_DK, el_GR, en_GB, es_ES, es_MX, fi_FI, fr_CA, fr_FR, hu_HU, it_IT, ja_JP, lv_LV, nl_NL, pl_PL, pt_BR, ro_RO, ru_RU, sk_SK, sv_SE, tr_TR, zh_CN, zh_TW

Changed

  • Use module-agnostic capabilities in shared accounts

8.48.76 - 2026-04-02

Fixed

  • Removed accidental debug output remnants (core#492)

8.48.74 - 2026-03-31

Fixed

  • Skip system permissions when inheriting permissions for mail subfolders

8.48.73 - 2026-03-30

Fixed

  • Don't drop stack trace if "includeStackTraceOnError=true" is present in request parameters (support#1166)

8.48.72 - 2026-03-26

Fixed

  • Detect Java version without additional JVM options (core#490)

8.48.70 - 2026-03-25

Fixed

  • Keep user in recipient list when replying to a mail in a shared folder (core#473)

8.48.68 - 2026-03-20

Added

  • German translation 8.48

8.48.67 - 2026-03-20

Added

  • Add DAVx5 Select integration for Android CalDAV/CardDAV onboarding
    • SCR-1678: Added new bundle com.openexchange.davx5.rest for DAVx5 Select integration
    • SCR-1679: Removed Sync App onboarding bundle
    • SCR-1680: Introduced new REST endpoint for DAVx5 Select configuration
    • SCR-1681: Added DAVX5 constant to BuiltInProvider enum and deprecated SYNC_APP
    • SCR-1682: Replaced Sync App with DAVx5 Select in Android onboarding scenarios
    • SCR-1683: Added configuration properties for DAVx5 Select integration

8.48.66 - 2026-03-19

Added

  • INF-581: Always apply default HTTP headers in WebDAV responses, including new 'X-Powered-By' header
  • Extend Multifactor implementation to store successful authentication in a cookie (support#1242)
  • Allowing to enable IMAP trace logging by request
  • Estonian backend translation updates
  • Helm chart support for PodDisruptionBudget
    • SCR-1677: Added Helm chart support for PodDisruptionBudget
  • Translation updates 8.47: cs_CZ, da_DK, de_DE, el_GR, en_GB, es_ES, es_MX, fi_FI, fr_CA, fr_FR, hu_HU, it_IT, ja_JP, lv_LV, nl_NL, pl_PL, pt_BR, ro_RO, ru_RU, sk_SK, sv_SE, tr_TR, zh_CN, zh_TW
  • SCR-1664: New Properties for Shared Accounts Configuration
  • SCR-1665: New Module 'sharedaccount' in HTTP API
  • SCR-1666: New Package 'open-xchange-sharedaccount'
  • SCR-1667: New SOAP Service for Shared Accounts
  • SCR-1668: New Commandline Utilities for Shared Accounts
  • SCR-1669: Update Tasks for Shared Account Tables
  • SCR-1675: New Properties for Mailfilter Secondary Accounts
  • SCR-1676: New Parameter 'accountid' in Actions of Module 'mailfilter/v2' Module of HTTP API

Changed

  • IAE-129: Added support for \Archive SPECIAL-USE on initial standard folder detection
  • PBSR-1415: Use new EntityType from User instead of guestCreatedBy/mail to derive the entity type wherever feasible
    • SCR-1670: Update Task to add "type" column for Tables "user" and "del_user"
  • Updated core-mw chart dependencies
    • Updated Gotenberg image to v8.27.0
    • Updated Gotenberg chart to v1.18.0
    • Updated Collabora image to v25.04.9.2.1
    • Updated Collabora chart to v1.1.58
  • Some refactoring for Redis health check
  • Signal if a deputy permission has not been applied to a certain module since there is already a duplicate deputy permission on each affected folder (support#1195)

Fixed

  • Docker image missing stable-8.x tag when pushing release image
  • IOL-2841: Periodically touch composition space cache during file upload to ensure it does not vanish from cache
  • Added webp support for JDK-based image transformation (core#485)
    • SCR-1685: Updated & enhanced TwelveMonkeys ImageIO readers/writers
  • Collect embedded files from all PDF name tree kid nodes in ExportPDFTest
  • Consider original request properties in undo action
  • Treat added attendee as external in case an attendee copy already exists (core#464)
  • Added retry behavior in case a recoverable SQL error occurs that suggests restarting (core#465)
  • Fix potential IMAP connection permit leak due to end-point key mismatch through binding connection limiter permit to IMAPProtocol (lease-based release) (core#466)
  • Use more robust compare-and-set implementation when acquiring a unique sequence identifier (core#468)
  • Orderly consider user/context information when evaluating "com.openexchange.mail.filter.activated" property (core#469)
  • Pass proper thread context map on logout of a DAV session (core#470)
  • Added alternative faster symmetric encryption for less security use cases & rather fail-fast behavior for Reids connector policies (core#471)
  • Special handling when replying to a mail in a shared folder (core#473)
  • Move MYSQL_ROOT_PASSWORD from plaintext env var to Kubernetes Secret (core#480)
  • Ignore possible "file not found" error when moving entity-associated files due to deletion of that entity (e.g. user deletion) (core#481)
  • Improved direct INFORMATION_SCHEMA query and use custom connection having "useInformationSchema" set to "false" (to prefer SHOW commands for DDL) (core#482)
  • Empty data field in Secrets when no secret values are configured (core#483)
  • Orderly keep URIs to external images (core#484)
  • Avoid too many recursive calls when compiling IMAP SEARCH expression from a search term instance (support#1099)
  • Added config option to Redis-based session storage to control execution of timer tasks (support#1276)
  • Restored previous JAXB annotation for deputy module permissions (support#1288)
Prev
App Suite UI
Next
Additional Components