namespace SQLInsight.Licensing; /// /// Checks a license text offline. Never throws on bad input: an invalid license is a state, not an error, and never /// stops monitoring. /// public sealed class LicenseVerifier(TrustedKeys keys, TimeProvider time) { public static readonly TimeSpan GracePeriod = TimeSpan.FromDays(30); public LicenseStatus Check(string? licenseText) { if (string.IsNullOrWhiteSpace(licenseText)) { return new LicenseStatus(LicenseState.None, null, "Ingen licens: Community. Al overvågning er gratis; Hub-synkronisering og prioriteret support kræver et abonnement."); } var license = SignedDocument.Verify(licenseText, keys, l => l.KeyId); if (license is null) { return new LicenseStatus(LicenseState.Invalid, null, "Licensen er ugyldig: signaturen passer ikke, eller teksten er beskadiget. Overvågningen fortsætter."); } var now = time.GetUtcNow(); if (now <= license.ExpiresAt) { return new LicenseStatus(LicenseState.Valid, license, $"{license.Plan} til {license.Customer}, gyldig til {license.ExpiresAt:yyyy-MM-dd}."); } return now <= license.ExpiresAt + GracePeriod ? new LicenseStatus(LicenseState.ExpiredInGrace, license, $"Licensen udløb {license.ExpiresAt:yyyy-MM-dd}. Hub-synkronisering fortsætter til {(license.ExpiresAt + GracePeriod):yyyy-MM-dd}; forny venligst.") : new LicenseStatus(LicenseState.Expired, license, $"Licensen udløb {license.ExpiresAt:yyyy-MM-dd}. Overvågningen fortsætter; Hub-synkronisering er stoppet."); } }