00.75.20
Release date: 2026-06-25 Previous release: 00.75.10 Maven coordinates (parent):
com.svenruppert.jsentinel:jSentinel-parent:00.75.20Full changelog: GitHub release v00.75.20
It works the remaining open findings of the 2026-06-24 production review
(R006–R044) that 00.75.10 did not already close — correctness, security
and consistency fixes, risk-first.
Highlights
- Secret-leak redaction (High) —
BootstrapToken.toString()masks the one-time admin secret;LoggingNotificationSenderredacts token/secret/password attributes (CWE-532); the VaadinForbiddenreason no longer reaches the user-facing error view. - Concurrency races (High) — atomic sequence reservation in
PublishPipeline;InMemoryReplayStoreevicts soonest-to-expire (not by recency, which allowed in-window replay);InMemoryPepperServiceandInMemoryAbuseDetectionServicemade race-safe. - DoS guards (High) —
CanonicalJsonnesting-depth limit (StackOverflow); Argon2id/scryptverify()clamps memory/N parsed from the envelope. - AuthZ consistency — subject id from the registered
SubjectIdResolver(notuser.toString()); wildcard-awarePermissionMatcherin the action layer; per-adapterAuthorizationDecisionmapping documented and pinned; REST adapter uses theHttpStatusenum (no magic numbers). - REST / OIDC / CORS — null-safe, locale-stable operation derivation; CORS wildcard-origin +
allowCredentials(true)flagged; OIDC strategies stop leaking the token-endpoint body; token-exchange cache key hashed, never the raw bearer. - Standalone / processor / DX —
SecuredProxyhandlesequals/hashCode/toStringby proxy identity; processors fail on conflicting annotations / write-once Filer merge; idempotent Eclipse-Storeclose().
Deliberate hardening (behaviour changes)
@SecureRoute()with no constraints now denies anonymous access — it means “any authenticated subject”, never “anyone”.- KDF floors raised to OWASP minimums — scrypt default
N2¹⁵ → 2¹⁷; below-floor stored hashes rehash on the next successful verify. - Audit / notification logging moved to named SLF4J loggers (
com.svenruppert.jsentinel.audit/.accountlifecycle) instead ofjava.util.logging— route them to a dedicated appender if desired. - DX
rateLimit/apiKeys/refreshTokensno longer appear as registered services; they surface asINFOand remain readable fromBootstrapState.
Quality
PIT was re-measured over every touched module; acceptance was “no module
more than 3 % below its baseline”. The tick is test-additive, so coverage is
stable-or-up across the board (jSentinel-core 86 %, -rest 95 %,
-standalone 98 %, -events 85 %, -dx 71 %). Two modules dip 3 pp at the
threshold — pure denominator effects where a new branch needs a real adapter
runtime to exercise. Full-reactor clean install green across all 40 modules;
-Pstatic-analysis SpotBugs gate green. No mocks.
Migration
None beyond the deliberate hardening above. Just bump the version to
00.75.20.