00.75.10
Release date: 2026-06-24 Previous release: 00.75.00 Maven coordinates (parent):
com.svenruppert.jsentinel:jSentinel-parent:00.75.10Full 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.
EclipseStoreRateLimitStoreandEclipseStoreRoleAssignmentStoremutated 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) —
ConsumePipelinecommitted 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→ aKeyExpiredresult; 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
TokenHashercontract +Sha256TokenHasherreplaces storing tokens under a saltedPasswordHasher(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-analysisprofile runs SpotBugs 4.9.8.3 + FindSecBugs 1.13.0 (effort=Max, threshold=Medium, fail-on-error) overjSentinel-core/-rest/-events/-events-rest; a baseline keeps the gate green so only new findings break the build. - H4 — Manual JSON-parser hardening.
WireJsonwraps every failure into the domainEventWireException(bounds-checked escapes, overflow); OIDCexpiresInoverflow →Optional.empty(). - H5 — Instantiable
JSentinelContextbehind the staticJSentinelServiceResolverfacade — 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
400instead 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.