00.79.30
Release date: 2026-07-02 Previous release: 00.79.20 Maven coordinates (parent):
com.svenruppert.jsentinel:jSentinel-parent:00.79.30Full changelog: GitHub release v00.79.30
Five themes
- Session integrity —
LoginViewnow rotates the session id on every login regardless of theSessionPolicydecision (CWE-384); a mid-session role/permission revocation actually terminates the cached subject, not just deflects one navigation (CWE-613). - Audit PII — the two remaining session-audit paths derive
subjectIdvia the registeredSubjectIdResolver, neversubject.toString()(CWE-532). - JWT / OIDC / DPoP spec-fidelity —
HttpJwksClientthrottles an unauthenticated unknown-kidrefresh flood; the JWKS trust root is https-enforced at the client boundary;critheaders are rejected uniformly across all algorithm families; an OIDC-layeriss/audbackstop is enforced; DPoPhtu/athhandling is tightened; back-channel-logout replay protection is on by default. - Fail-closed defaults — empty
@RequiresPermission({})and empty-role evaluators now fail closed (were fail-open); CRLF is rejected at the step-up and event-decode trust boundaries; propagation caches are scope-keyed and bounded; on-disk stores are owner-only where the platform allows. - Honest guarantees — JavaDoc that over-stated the
JtiStore, dummy-KDF timing, and login-attempt-lockout guarantees was corrected so it no longer drives insecure deployment decisions.
Deliberate behaviour changes
Both close a fail-open footgun and only affect mis-configured code:
RoleBasedAccessEvaluatorwith an empty required-role set now requires an authenticated subject (was: anyone).@RequiresPermission({})now denies (was: any authenticated subject).DefaultLogoutTokenValidator(JwtValidator)installs an in-memoryjtistore by default — replay protection on; a multi-node RP passes a shared store via the 2-arg constructor.IdTokenValidationErrorgains two additive sealed variants:IssuerMismatch,AudienceMismatch.
Findings closed (28)
Severity distribution: 0 Critical · 0 High · 4 Medium · 15 Low · 9 Info. Highlights (full detail in the GitHub release):
- Medium — session-id rotation on every login (JS-SEC-003); drift-triggered subject eviction, not just navigation deflection (JS-SEC-002);
SubjectIdResolver-derived audit ids (JS-SEC-004); JWKS unknown-kidrefresh throttling (JS-SEC-001). - Low — https-enforced JWKS trust root; fail-closed empty-constraint evaluators; CRLF rejection at trust boundaries; control-char scrubbing in event-decode error logs; OIDC
iss/audbackstop; bounded introspection cache; owner-only file/dir permissions for the bootstrap token store and Eclipse-Store tree; bounded, scope-keyed token-exchange cache; corrected over-claimed JavaDoc (DPoPjtistore, dummy-KDF timing, login-attempt policy scope). - Info — unified
crit-header rejection; DPoPhturaw-path handling; DPoP fails closed onath-without-token; CORS lint for the credentialed"null"origin; documented recorded-not-wired decision-mapper hooks; one-time drift-detection-inert WARN; OIDC logout clears the local subject by default; documented allow-by-omission authorization model.
Exit production-review
A three-reviewer adversarial review of the full 28-fix delta returned a
clean verdict — no High/Medium regression, no new fail-open, no
failure-hiding exception swallow. Two findings on delivered paths, both
fixed in-cycle: an over-claimed HttpJwksClient JavaDoc softened (rotation
can be delayed ≤ 20 s in a narrow window, bounded and self-limiting), and
AbstractOidcLogoutView reordered so the OP logout request builds while the
subject is still bound.
What it does not do
No opt-in deny-by-default authorization mode; no auto-wiring of a custom
RestDecisionMapper / RestErrorBodyStrategy; no per-outcome cost-floor for
the mixed-algorithm timing caveat (forced-rehash migration is the mitigation);
no shared-atomic jti store for single-JVM DPoP (Redis/JDBC remains the
production recommendation for multi-node). All documented as backlog for a
future maintenance tick.
Quality
jSentinel-core (the most-touched module) re-measured at 84 % (2156/2566)
mutation / 89 % line. Every actionable finding shipped a new
real-implementation regression test and no test was removed, so mutation
coverage cannot regress by construction; other touched modules
(jSentinel-vaadin, -jwt, -oauth2, -identity-oidc, -dpop,
-propagation-oidc, -events-rest, -persistence-eclipsestore, -dx,
-dx-rest, -identity-oidc-vaadin) retain their prior baseline for the same
reason. Full reactor clean install green; standards pass already-compliant.
No mocks.
Migration
None beyond the two deliberate fail-closed changes above — both only
affect configurations that were relying on the fail-open behaviour. Just bump
the version to 00.79.30.