58 lines
2.4 KiB
C#
58 lines
2.4 KiB
C#
using Microsoft.Extensions.Options;
|
|
|
|
namespace ScadaLink.AuditLog.Configuration;
|
|
|
|
/// <summary>
|
|
/// Validates <see cref="AuditLogOptions"/> on startup. The caps drive payload
|
|
/// truncation in the M2+ writers, so an unset/zero cap would let arbitrarily
|
|
/// large blobs into the central <c>AuditLog</c> table. <see cref="AuditLogOptions.ErrorCapBytes"/>
|
|
/// must be at least as large as <see cref="AuditLogOptions.DefaultCapBytes"/>
|
|
/// because the error cap is meant to capture <em>more</em> detail than the
|
|
/// happy-path summary, not less. <see cref="AuditLogOptions.RetentionDays"/> is
|
|
/// bounded to <c>[30, 3650]</c> to keep purge windows sane: too short would
|
|
/// drop in-flight investigations, too long would defeat the partition-switch
|
|
/// purge's purpose.
|
|
/// </summary>
|
|
public sealed class AuditLogOptionsValidator : IValidateOptions<AuditLogOptions>
|
|
{
|
|
/// <summary>Inclusive lower bound for <see cref="AuditLogOptions.RetentionDays"/>.</summary>
|
|
public const int MinRetentionDays = 30;
|
|
|
|
/// <summary>Inclusive upper bound for <see cref="AuditLogOptions.RetentionDays"/>.</summary>
|
|
public const int MaxRetentionDays = 3650;
|
|
|
|
/// <inheritdoc />
|
|
public ValidateOptionsResult Validate(string? name, AuditLogOptions options)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(options);
|
|
|
|
var failures = new List<string>();
|
|
|
|
if (options.DefaultCapBytes <= 0)
|
|
{
|
|
failures.Add(
|
|
$"AuditLog:{nameof(AuditLogOptions.DefaultCapBytes)} ({options.DefaultCapBytes}) " +
|
|
"must be > 0; it drives payload-summary truncation in audit writers.");
|
|
}
|
|
|
|
if (options.ErrorCapBytes < options.DefaultCapBytes)
|
|
{
|
|
failures.Add(
|
|
$"AuditLog:{nameof(AuditLogOptions.ErrorCapBytes)} ({options.ErrorCapBytes}) " +
|
|
$"must be >= {nameof(AuditLogOptions.DefaultCapBytes)} ({options.DefaultCapBytes}); " +
|
|
"the error-row cap is intended to capture more detail than the happy-path summary.");
|
|
}
|
|
|
|
if (options.RetentionDays < MinRetentionDays || options.RetentionDays > MaxRetentionDays)
|
|
{
|
|
failures.Add(
|
|
$"AuditLog:{nameof(AuditLogOptions.RetentionDays)} ({options.RetentionDays}) " +
|
|
$"must be in [{MinRetentionDays}, {MaxRetentionDays}] days.");
|
|
}
|
|
|
|
return failures.Count == 0
|
|
? ValidateOptionsResult.Success
|
|
: ValidateOptionsResult.Fail(failures);
|
|
}
|
|
}
|