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.");
}
}