Release notes

New available values

BDM data retention (GDPR)

For Teamwork, Efficiency, Performance, Enterprise and Scale editions only.

A new feature lets administrators configure data retention rules per BDM object type to automatically delete expired business data on a scheduled basis. For each top-level object type, you can choose the reference date (creation or last update) and a retention period in days; a scheduled cleanup job then removes every expired instance, cascading to composition children.

Rules are managed through the new Data Retention (GDPR) page in the Admin application. Each cleanup run is audited via the new BUSINESS_DATA_CLEANED_UP queriable log event, and the schedule is driven by the new bonita.runtime.retention.schedule.cron configuration property (default: 0 0 2 * * 6, every Saturday at 02:00 UTC).

Legacy BDM object instances created before this version are not tracked automatically. A migration procedure is documented to backfill them when you want them subject to retention rules.

When updating from an earlier version with the Bonita Update Tool, the new Data Retention (GDPR) page is installed automatically but must be added to your existing Admin application’s menu manually.

See BDM data retention for the complete reference.

Notable changes

BDM REST API response format standardization

Starting from this version, the response format for BDM queries via REST API has been standardized to follow REST conventions:

  • Scalar queries (COUNT, AVG, MAX, MIN, SUM): Now return {"value": n} instead of [n]

  • Single entity queries: Now return the object directly {…​} instead of wrapping it in an array [{…​}]

  • List queries: Unchanged, still return arrays [{…​}, {…​}]

This change affects REST API consumers (JavaScript clients, UI Designer pages, external applications). Server-side Groovy code using DAO methods is not affected.

To maintain backward compatibility, you can disable the new format by setting:

bonita.runtime.business-data.serialization.standard-shape.enabled=false

If you are updating from a previous version of Bonita, backward compatibility is maintained for you by disabling automatically this new property. You are free to activate it when you code is compatible by modifying file bonita-tenant-community-custom.properties

See BDM Query Response Formats for detailed migration guidance.

Rest API refactoring

Many Rest APIs have been refactored to better prepare evolutions in the future. (Technically, we moved the implementation from unmaintained Restlet to Spring MVC).

This concerns the following endpoints:

  • /API/accessControl/bdm

  • /API/bdm/businessDataReference

    • ⚠️ this API now returns HTTP 400 instead of HTTP 500:

      1. when caseId filter is not provided, or filter f completely absent

      2. when pagination parameter p is not provided

      3. when pagination parameter c is not provided

  • /API/bdm/businessDataReference/{caseId}/{dataName}

  • /API/bpm/activityReplay/{activityInstanceId}

  • /API/bpm/activityVariable/{activityId}/{dataName}

    • ⚠️ this API now returns HTTP 404 when activityId or dataName is not found (instead of HTTP 500)

  • /API/bpm/archivedActivityVariable/{activityId}/{variableName}

    • ⚠️ this API now returns HTTP 404 when activityId or variableName is not found (instead of HTTP 500)

  • /API/bpm/archivedCase/{archivedCaseId}/context

  • /API/bpm/archivedCaseVariable?f=case_id=12005&p=0&c=10

    • ⚠️ this API now returns HTTP 400 instead of HTTP 500:

      1. when case_id filter is not provided, or filter f completely absent

      2. when pagination parameter p is not provided

      3. when pagination parameter c is not provided

  • /API/bpm/archivedCaseVariable/{caseId}/{variableName}

    • ⚠️ this API now returns HTTP 404 when caseId or variableName is not found (instead of HTTP 500)

  • /API/bpm/archivedUserTask/{archivedTaskId}/context

  • /API/bpm/case/{caseId}/context

  • /API/bpm/diagram/{processId}

  • /API/bpm/message

  • /API/bpm/process/{processDefinitionId}/contract

  • /API/bpm/process/{processDefinitionId}/design

  • /API/bpm/process/{processDefinitionId}/expression/{expressionId}

  • /API/bpm/process/{processDefinitionId}/instantiation

  • /API/bpm/signal

  • /API/bpm/timerEventTrigger

  • /API/bpm/timerEventTrigger/{id}

  • /API/bpm/userTask/{taskId}/context

  • /API/bpm/userTask/{taskId}/contract

  • /API/bpm/userTask/{taskId}/execution

  • /API/form/mapping/{id}

  • /API/platform/license

  • /API/system/i18ntranslation

  • /API/tenant/bdm

The behaviour remains unchanged, even if some HTTP headers may be slightly different.

Support matrix changes

Deprecations and removals

API deprecations

API removals

Custom component changes

Configuration changes

Ehcache upgraded from 2.x to 3.11

Bonita Runtime internal caching system has been upgraded from Ehcache 2.x to Ehcache 3.11 to benefit from improved performance, better memory management, and continued vendor support.

Impact on configuration:

The migration process automatically:

  • Removes the deprecated cache-config.xml file (cache configuration is now programmatic in Java)

  • Removes 4 obsolete Ehcache 2 properties from configuration files:

    • inMemoryOnly, maxElementsOnDisk

    • copyOnRead, copyOnWrite

  • Adds new offHeapSizeMB=0 property to all cache configurations (defaults to on-heap caching)

What you need to know:

  • If you customized cache configuration in bonita-platform-community-custom.properties, bonita-tenant-community-custom.properties, or cluster configuration files, these obsolete properties will be automatically removed during platform update

  • The new Ehcache 3 configuration uses different property names and is managed programmatically - contact Bonitasoft Support if you need to tune cache behavior

  • Most Ehcache 3 properties (like maxElementsInMemory, eternal, timeToLiveSeconds) remain compatible and will be preserved

  • Off-heap caching is disabled by default (offHeapSizeMB=0) but can be enabled for performance optimization on large-scale deployments

Affected configuration files:

  • Community edition: bonita-platform-community-custom.properties, bonita-tenant-community-custom.properties

  • Subscription edition (cluster): bonita-platform-sp-cluster-custom.properties, bonita-tenant-sp-cluster-custom.properties

For advanced cache tuning after migration, refer to the Performance tuning documentation.

Bug fixes

Fixes in Bonita 2026.1-u3 (2026-09-23)

  • BPA-327 - java.lang.NullPointerException on bonita-ldap-synchronizer

  • BPA-686 - Webservice connector dependency not included by Studio in .bar file because already provided by Bonita engine, makes connector input groovy script fail

  • Several dependencies updated

Hazelcast 5.7.0

  • Hazelcast, the library used by the Cluster feature, is updated from 5.4.0 to 5.7.0. If you run a cluster, read Updating a cluster to 2026.1-u3 before updating.

  • Security hardening of the Hazelcast member. On a single node, the member Bonita starts for its second-level cache now listens on loopback only instead of on every interface. To restore the previous behaviour, for a deployment that attaches a Hazelcast client on purpose, set the property to an empty value in bonita-platform-sp-custom.properties: bonita.platform.hazelcast.interfaces.list= with nothing after the equals sign. Uncommenting the line as shipped in that file keeps the loopback default. In a cluster, bonita.platform.cluster.hazelcast.interfaces.list now binds the member to one address of the node matching the patterns it lists, which it never did before; its default no longer names an interface. If your cluster configuration sets that property, verify its value or unset it before updating: a value that matches no interface of the node, harmless until now, stops the node from starting. See Allow communication between servers for how to restrict the port.

Updating a cluster to 2026.1-u3

These points apply to Subscription editions running the Cluster feature. Installations that do not enable the Cluster feature are not affected, and Bonita Community edition does not use Hazelcast.

  • All nodes must be stopped to update. The Hazelcast edition bundled with Bonita does not support updating the members of a cluster one at a time, so a node running 5.4.0 cannot join a cluster running 5.7.0. Stop every node, update them, then start them again.

  • No configuration change is required. The update introduces two new cluster properties, both with default values, so nothing needs to be added to your configuration. See Work recovery when a node leaves the cluster if you want to tune them.

  • Work recovery is more robust. The recovery of a departed node’s work runs in the background instead of on a Hazelcast event thread, gives up on its own before its lock expires, and is tried again at the next departure or start for whatever it could not take over. A node that resumes after a tenant pause now resubmits the work that arrived while it was paused, which previously waited until the node left the cluster.

  • Clusters updated from an earlier version log a warning about the configuration schema at every start. Fresh installations do not. The message reports that the Hazelcast schema location is incorrect and that the default is used instead. It is harmless: your stored configuration still refers to the schema of the previous version, and the update does not rewrite it. To make it stop, update the version in the schema location in platform_engine/hazelcast.xml with the platform setup tool.

  • Two diagnostics change. The Number of locks column of the Hazelcast statistics file now counts the locks currently held on the node that writes the file, where it previously counted lock objects across the cluster, so expect a different magnitude and a value that varies with load. A lock whose lease expires before it is released is now reported as an error instead of a warning; if you raise alerts on errors from the cluster lock service, you may start seeing them for a condition that was already being reported at a lower level.

Security fixes

  • CVE-524: bcprov-jdk18on - In Bouncy Castle for Java before 1.85, RSA PKCS#1 verification skips last two hash bytes in NULL-omitte (public CVE-2026-12860)

  • CVE-525: bcprov-jdk18on - In Bouncy Castle for Java before 1.85, Lazy ASN.1 sequence forcing resets nesting-depth guard. This iss (public CVE-2026-13506)

  • CVE-527: bcprov-jdk18on - In Bouncy Castle for Java before 1.85, Possible OOM from unbounded up-front allocation on a definite-le (public CVE-2026-14682)

  • CVE-536: bcprov-jdk18on - In Bouncy Castle for Java before 1.85, Quadratic-time escaping when stringifying X.500 distinguished na (public CVE-2026-58059)

  • CVE-564: hazelcast - Authorization bypass in IMap Predicates API (public XRAY-1043284)

  • CVE-565: hazelcast - Arbitrary member memory access by low-privileged client (public XRAY-1043285)

  • CVE-578: postgresql - pgjdbc is an open source postgresql JDBC Driver. In releases 42.7.4 through 42.7.11, channelBinding=require (public CVE-2026-54291)

  • CVE-622: agetty - util-linux versions through 2.41.5 and 2.42.2 fail to check mount helper exit status before running post-mount (public CVE-2026-76642)

  • CVE-623: agetty - The nsenter --join-cgroup option opens the target cgroup.procs file as root and leaves that file descriptor ope (public CVE-2026-78408)

  • CVE-624: agetty - The X-mount.subdir option uses a detached-tree fast path on Linux 6.15 and later and passes the configured subd (public CVE-2026-78409)

  • CVE-625: agetty - A flaw was found in util-linux. Restricted bind mounts take the source path from fstab but do not pin that sour (public CVE-2026-78410)

  • CVE-627: curl - A flaw in the libcurl SASL negotiation for LDAP authentication allows an incomplete handshake sequence to be misi (public CVE-2026-13608)

  • CVE-628: curl - A flaw in libcurl’s handling of HTTP/2 Server Push streams, when the parent handle is set to share connections wi (public CVE-2026-18924)

  • CVE-629: curl - A flaw in libcurl makes it wrongly reuse an HTTP connection setup for a given hostname using Negotiate authentica (public CVE-2026-19931)

  • CVE-630: libexpat - In libexpat 2.8.2 and 2.8.3 before 2.8.4, misinterpretation of getentropy’s return code leads to insufficient (public CVE-2026-76956)

  • CVE-631: libexpat - libexpat before 2.8.4 lacks handler call depth tracking with custom encoding callbacks. Thus, a use-after-fre (public CVE-2026-76957)

  • CVE-632: curl - When performing transfers via libcurl’s multi interface, pooled TLS connections can outlive their originating eas (public CVE-2026-80229)

  • CVE-633: curl - When CURLOPT_PINNEDPUBLICKEY is configured alongside options that disable standard peer verification (`CURLOPT_ (public CVE-2026-80230)

  • CVE-634: curl - A flaw in libcurl makes it wrongly reuse an existing HTTPS connection setup for a given hostname even when using (public CVE-2026-80231)

  • CVE-635: curl - A Set-Cookie: header using tab (horizontal tab, ASCII code 9) instead of space (ascii code 32) immediately befo (public CVE-2026-80255)

  • CVE-636: curl - With the wolfSSL backend, when CA caching is enabled and an CURLOPT_SSL_CTX_FUNCTION callback replaces the trus (public CVE-2026-82208)

  • CVE-637: curl - When libpsl support is enabled, libcurl fails to enforce the Public Suffix List boundary check when processing a (public CVE-2026-82209)

Security fixes — LDAP Synchronizer

  • CVE-630: libexpat - In libexpat 2.8.2 and 2.8.3 before 2.8.4, misinterpretation of getentropy’s return code leads to insufficient (public CVE-2026-76956)

  • CVE-631: libexpat - libexpat before 2.8.4 lacks handler call depth tracking with custom encoding callbacks. Thus, a use-after-fre (public CVE-2026-76957)

Fixes in Bonita 2026.1-u1 (2026-07-17)

  • BPA-100 - Groovy evaluate : BDM object field is null whereas the column has a value in the database → SQL SELECT to retrieve the BO is not executed

  • BPA-445 - [SAML] authentication: race condition on /favicon.ico overwrites __REDIRECT_URI session attribute, causing 404 after successful SSO login

  • BPA-567 - OIDC callback fails with IllegalArgumentException - login never completes

  • BPA-633 - GET bpm/archivedCase returns HTTP 404 for the whole list when a deployed started_by / startedBySubstitute user no longer exists in the organization

  • BPA-680 - [Studio/Windows] Process deploy runs "mvn clean install" that fails to delete the locked BDM jar → BDM build output wiped → BAR build fails "unable to resolve <bdm package>"

  • Several dependencies updated

Security fixes

  • CVE-375: keycloak-saml-core - A remote, unauthenticated attacker can send a specially crafted XML input to the endpoint (public CVE-2026-7307)

  • CVE-431: keycloak-saml-adapter-core - An unauthenticated remote attacker can trigger an application level Denial of Service (public CVE-2026-2575)

Fixes in Bonita 2026.1-u0 (2026-04-28)

  • Brute-force login protection is now enabled by default. This security feature rate-limits failed login attempts per username and temporarily locks out accounts after too many failures.

  • BPA-100 - Groovy evaluate : BDM object field is null whereas the column has a value in the database → SQL SELECT to retrieve the BO is not executed

  • BPA-183 - Process instance never completes: row in FLOWNODE_INSTANCE table with stateid 28 and kind multi

  • BPA-199 - BDM Custom Query with Single Result Type Returns Array Instead of Single Object

  • BPA-203 - Automatic cleanup of TEMPORARY_CONTENT rows does not delete actual object stored in pg_largeobject table

  • BPA-297 - BDM REST API returns empty JSON for HibernateProxy entities

  • BPA-316 - Prograde Java policy is too restrictictive for AI connectors

  • BPA-321 - ThreadLocal EntityManager leak after JTA transaction timeout causes stale persistence context reuse

  • BPA-411 - [OIDC][Cluster] single-use refresh token invalidation causes repeated session loss

  • BPA-443 - [Cluster] NPE on HTTP API for every void method (retryTask, logout, …​)

  • BPA-449 - Studio: .bar built from a process with no declared dependencies contains all project dependencies

  • RUNTIME-410 - XA transaction timeout while performing db operation leaves thread in bad state, causing subsequent db operation attempts to fail with "Logical connection is closed" error

  • CVE-43 - Brute-force login protection

  • Several dependencies updated