11#nullable enable
22
33using Fail2Ban4Win . Config ;
4+ using Fail2Ban4Win . Data ;
45using Fail2Ban4Win . Facades ;
6+ using Fail2Ban4Win . Plugins ;
57using Fail2Ban4Win . Services ;
68using FakeItEasy ;
9+ using Plugins ;
710using System ;
811using System . Collections . Generic ;
912using System . Linq ;
@@ -25,9 +28,10 @@ public class BanManagerTest: IDisposable {
2528
2629 private const int MAX_ALLOWED_FAILURES = 2 ;
2730
28- private readonly BanManagerImpl banManager ;
29- private readonly EventLogListener eventLogListener = A . Fake < EventLogListener > ( ) ;
30- private readonly ITestOutputHelper testOutput ;
31+ private readonly BanManagerImpl banManager ;
32+ private readonly EventLogListener eventLogListener = A . Fake < EventLogListener > ( ) ;
33+ private readonly IPluginManager < IFail2Ban4WinPlugin > pluginManager = A . Fake < IPluginManager < IFail2Ban4WinPlugin > > ( ) ;
34+ private readonly ITestOutputHelper testOutput ;
3135
3236 private readonly Configuration configuration = new ( ) {
3337 isDryRun = false ,
@@ -48,7 +52,7 @@ public BanManagerTest(ITestOutputHelper testOutput) {
4852 XunitTestOutputTarget . start ( testOutput ) ;
4953
5054 A . CallTo ( ( ) => firewallFacade . Rules ) . Returns ( firewallRules ) ;
51- banManager = new BanManagerImpl ( eventLogListener , configuration , firewallFacade ) ;
55+ banManager = new BanManagerImpl ( eventLogListener , configuration , firewallFacade , pluginManager ) ;
5256 }
5357
5458 [ Fact ]
@@ -152,7 +156,7 @@ public void dontBanInDryRunMode() {
152156
153157 configuration . isDryRun = true ;
154158
155- BanManagerImpl manager = new ( eventLogListener , configuration , firewallFacade ) ;
159+ BanManagerImpl manager = new ( eventLogListener , configuration , firewallFacade , pluginManager ) ;
156160
157161 for ( int i = 0 ; i < MAX_ALLOWED_FAILURES + 1 ; i ++ ) {
158162 eventLogListener . failure += Raise . With ( null , SOURCE_ADDRESS ) ;
@@ -175,7 +179,7 @@ public void deleteExistingRulesOnStartup() {
175179
176180 Assert . NotEmpty ( firewallRules ) ;
177181
178- BanManagerImpl manager = new ( eventLogListener , configuration , firewallFacade ) ;
182+ BanManagerImpl manager = new ( eventLogListener , configuration , firewallFacade , pluginManager ) ;
179183
180184 Assert . NotEmpty ( firewallRules ) ;
181185
@@ -280,6 +284,50 @@ public void longDelaysDoNotCrash() {
280284 Assert . NotEmpty ( firewallRules ) ;
281285 }
282286
287+ [ Fact ]
288+ public void pluginBanCallback ( ) {
289+ configuration . banPeriod = TimeSpan . FromHours ( 1 ) ;
290+
291+ IFail2Ban4WinPlugin plugin = A . Fake < IFail2Ban4WinPlugin > ( ) ;
292+ Captured < BanParams > bans = A . Captured < BanParams > ( ) ;
293+ A . CallTo ( ( ) => pluginManager . Plugins ) . Returns ( [ plugin ] ) ;
294+ A . CallTo ( ( ) => plugin . OnSubnetBanned ( bans . _ ) ) . DoesNothing ( ) ;
295+
296+ for ( int i = 0 ; i < MAX_ALLOWED_FAILURES + 1 ; i ++ ) {
297+ eventLogListener . failure += Raise . With ( null , SOURCE_ADDRESS ) ;
298+ }
299+
300+ Assert . NotEmpty ( firewallRules ) ;
301+ BanParams actualBan = bans . GetLastValue ( ) ;
302+ Assert . Equal ( IPNetwork2 . Parse ( "192.0.2.0/24" ) , actualBan . Subnet ) ;
303+ Assert . Equal ( TimeSpan . FromHours ( 1 ) , actualBan . Duration ) ;
304+ Assert . Equal ( 1 , actualBan . OffenseCount ) ;
305+ Assert . Equal ( actualBan . Start , DateTime . Now , TimeSpan . FromSeconds ( 2 ) ) ;
306+ Assert . Equal ( actualBan . End , DateTime . Now + TimeSpan . FromHours ( 1 ) , TimeSpan . FromSeconds ( 2 ) ) ;
307+ }
308+
309+ [ Fact ]
310+ public void pluginUnbanCallback ( ) {
311+ IFail2Ban4WinPlugin plugin = A . Fake < IFail2Ban4WinPlugin > ( ) ;
312+ Captured < BanParams > bans = A . Captured < BanParams > ( ) ;
313+ A . CallTo ( ( ) => pluginManager . Plugins ) . Returns ( [ plugin ] ) ;
314+ using ManualResetEventSlim callbackFired = new ( ) ;
315+ A . CallTo ( ( ) => plugin . OnBanLifted ( bans . _ ) ) . Invokes ( ( ) => callbackFired . Set ( ) ) ;
316+
317+ for ( int i = 0 ; i < MAX_ALLOWED_FAILURES + 1 ; i ++ ) {
318+ eventLogListener . failure += Raise . With ( null , SOURCE_ADDRESS ) ;
319+ }
320+
321+ callbackFired . Wait ( TimeSpan . FromSeconds ( 10 ) ) ;
322+
323+ BanParams actualBan = bans . GetLastValue ( ) ;
324+ Assert . Equal ( IPNetwork2 . Parse ( "192.0.2.0/24" ) , actualBan . Subnet ) ;
325+ Assert . InRange ( actualBan . Duration , TimeSpan . Zero , TimeSpan . FromMilliseconds ( 200 ) ) ;
326+ Assert . Equal ( 1 , actualBan . OffenseCount ) ;
327+ Assert . Equal ( actualBan . Start , DateTime . Now , TimeSpan . FromSeconds ( 2 ) ) ;
328+ Assert . Equal ( actualBan . End , DateTime . Now + TimeSpan . FromMilliseconds ( 200 ) , TimeSpan . FromSeconds ( 2 ) ) ;
329+ }
330+
283331 private class FakeFirewallRulesCollection : List < FirewallWASRule > , IFirewallWASRulesCollection < FirewallWASRule > {
284332
285333 private readonly object mutex = new ( ) ;
0 commit comments