Skip to content
Flag of Europe
Made in the European Union · Independently built · Released under EUPL 1.2

00.75.10

Available on Maven Central. A hardening & robustness tick on the 00.75 line after 00.75.00 (Security Event Bus). No new feature, no new module — type safety where comments used to guard, tested fail-paths, hardened parsers, and a sharp static-analysis gate. See the current release 00.79.41.

Release date: 2026-06-24 Previous release: 00.75.00 Maven coordinates (parent): com.svenruppert.jsentinel:jSentinel-parent:00.75.10 Full changelog: GitHub release v00.75.10

Two layers: the six Konzept hardening blocks H1–H6, plus four urgent review findings (R002–R005) on the freshly-shipped event bus and the Eclipse-Store persistence.

Urgent fixes (event bus + persistence)

  • R002 (High) — Eclipse-Store nested-collection mutations lost on restart. EclipseStoreRateLimitStore and EclipseStoreRoleAssignmentStore mutated a nested set in place; Eclipse Store doesn’t re-store an already-persisted nested set, so the change vanished on reopen (rate-limit under-reporting → bypassable; role grants/revokes reverting). Now stores the actually-mutated set; proven by close/reopen tests that fail on the old code.
  • R003 (High) — ConsumePipeline committed side effects before all gates passed. markSeen() / updateSequence() ran before the sequence and producer-policy gates. Gates are now read-only first; the two side effects commit only after every gate passes.
  • R004 (High) — EXPIRED signing keys were accepted. The key-status gate now whitelists ACTIVE / ACCEPTED_FOR_VERIFICATION; EXPIRED → a KeyExpired result; anything else fails closed.
  • R005 (Medium) — signing-base field injection. The signing base is now length-prefixed (key=<utf8-byte-length>:value\n), injective for any value content.

H1–H6 (Konzept hardening blocks)

  • H1 — Token-digest type safety. A new TokenHasher contract + Sha256TokenHasher replaces storing tokens under a salted PasswordHasher (which could never match on lookup). Four core services migrate; the deprecated constructors run a determinism probe and reject a salted KDF loudly (CWE-208 / CWE-640).
  • H2 — Negative tests per service (real impls, no mocks).
  • H3 — Static-analysis gate. A CI-only -Pstatic-analysis profile runs SpotBugs 4.9.8.3 + FindSecBugs 1.13.0 (effort=Max, threshold=Medium, fail-on-error) over jSentinel-core / -rest / -events / -events-rest; a baseline keeps the gate green so only new findings break the build.
  • H4 — Manual JSON-parser hardening. WireJson wraps every failure into the domain EventWireException (bounds-checked escapes, overflow); OIDC expiresIn overflow → Optional.empty().
  • H5 — Instantiable JSentinelContext behind the static JSentinelServiceResolver facade — parallel tests and multi-app embedding become possible, with no breaking change (the static facade stays the single-app default).
  • H6 — REST-bridge transport — query params URL-decoded; a mid-body client disconnect returns a clean 400 instead of propagating.

Compatibility note (wire format)

The signing base changed from key=value\n to length-prefixed key=<utf8-byte-length>:value\n, so signatures produced by 00.75.00 do not verify under 00.75.10. Sign and verify both go through the same base, so round-trip within a version is unaffected. The event bus is @ExperimentalJSentinelApi.

Additivity

Additive over 00.75.00. The only intended behavioural changes are the H1 determinism guard (rejecting a salted hasher passed to a token service) and the R005 wire-format change above. No 00.73 stable surface changed.

Migration

None beyond the two notes above. Just bump the version to 00.75.10.