Add a pluggable ban seam: BanChannel fans locally-decided bans out to IBanReporter sinks (Report/Retract) and the accept path enforces locally. CrowdSec is a write-only reporter living in UOContent (registered into the Core seam via BanChannel.Register) — it batches decisions onto a bounded, coalescing, drop-on-overflow queue and POSTs /v1/alerts with watcher creds, retry/backoff, and a bounded flush-on-stop. CrowdSec never enforces in-app. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
44 lines
1.4 KiB
C#
44 lines
1.4 KiB
C#
using System;
|
|
using System.Text.Json;
|
|
using Server.Json;
|
|
using Server.Network.Bans;
|
|
using Xunit;
|
|
|
|
namespace Server.Tests;
|
|
|
|
public class BanConfigurationTests
|
|
{
|
|
// Locks the JsonConfig casing/converter contract: JsonConfig's options are case-SENSITIVE, so
|
|
// every settings member must carry an explicit [JsonPropertyName("camelCase")] or it silently
|
|
// binds nothing. These tests round-trip through the exact options the loader uses.
|
|
|
|
[Fact]
|
|
public void BanSettings_RoundTripsThroughJsonConfig()
|
|
{
|
|
var original = new BanSettings
|
|
{
|
|
ReportRateLimitTrips = false,
|
|
AutoBanDuration = TimeSpan.FromHours(2)
|
|
};
|
|
|
|
var json = JsonConfig.Serialize(original);
|
|
|
|
Assert.Contains("\"reportRateLimitTrips\"", json);
|
|
Assert.Contains("\"autoBanDuration\"", json);
|
|
|
|
var restored = JsonSerializer.Deserialize<BanSettings>(json, JsonConfig.DefaultOptions);
|
|
|
|
Assert.NotNull(restored);
|
|
Assert.Equal(original.ReportRateLimitTrips, restored.ReportRateLimitTrips);
|
|
Assert.Equal(original.AutoBanDuration, restored.AutoBanDuration); // TimeSpan survives
|
|
}
|
|
|
|
[Fact]
|
|
public void BanSettings_Defaults_AreReportRateLimitTripsFourHourAutoBan()
|
|
{
|
|
var settings = new BanSettings();
|
|
|
|
Assert.True(settings.ReportRateLimitTrips);
|
|
Assert.Equal(TimeSpan.FromHours(4), settings.AutoBanDuration);
|
|
}
|
|
}
|