Skip to content

licensing infrastructure#72

Merged
fupelaqu merged 11 commits intomainfrom
feature/licensingInfrastructure
Apr 5, 2026
Merged

licensing infrastructure#72
fupelaqu merged 11 commits intomainfrom
feature/licensingInfrastructure

Conversation

@fupelaqu
Copy link
Copy Markdown
Contributor

@fupelaqu fupelaqu commented Apr 5, 2026

fupelaqu and others added 11 commits March 31, 2026 07:45
Implements Story 5.2: JwtLicenseManager validates JWT license keys offline
using Ed25519 (EdDSA) signatures via nimbus-jose-jwt. Includes LicenseKeyVerifier
for classpath JWK public key loading, licensingTestkit module with JwtTestHelper
for cross-project test reuse, and 40 unit tests on Scala 2.12 + 2.13.

Closed Issue #63

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add LicenseConfig (HOCON + env var loading), LicenseResolver (4-step
priority: static JWT → API key fetch → disk cache → Community), grace
period support in JwtLicenseManager, and LicenseKey.Community constant.

Closed Issue #64

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements automated JWT provisioning via API key (POST /api/v1/licenses/token),
persistent instance ID, API key format validation, and directional tier change
logging in LicenseResolver.

Closed Issue #65

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
LicenseCache provides atomic write (temp+rename), symlink/size guards,
and defensive error handling. LicenseResolver gains cacheWriter (Step 2)
and cacheInvalidator (Step 3) callbacks for write-on-fetch and
delete-on-stale semantics.

Closed Issue #66

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement 14-day configurable grace period after JWT expiry with two phases
(EarlyGrace/MidGrace), per-request warnings, restoration detection after
degradation, and POSIX file permissions for cache files.

Closed Issue #67

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ServiceLoader-based SPI architecture for pluggable license managers.
Core licensing module is now lightweight (no crypto deps). JWT implementation
moved to softclient4es-extensions. CommunityLicenseManager is the fallback
when no extensions JAR is present.

Key changes:
- LicenseManagerSpi trait with priority-based discovery
- LicenseMode (LongRunning/Driver) for runtime context
- CommunityLicenseManager replaces DefaultLicenseManager (deprecated alias kept)
- ExtensionApi uses lazy val with SPI resolution and error fallback
- refresh() method on LicenseManager trait (RefreshNotSupported for Community)
- licensingTestkit subproject removed (moved to extensions)

Closed Issue #71

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@fupelaqu fupelaqu marked this pull request as ready for review April 5, 2026 06:58
@fupelaqu fupelaqu merged commit 10ccfd9 into main Apr 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant