package security import ( "path/filepath" "testing" "time" ) func TestGuardWhitelistSupportsIPAndCIDR(t *testing.T) { g := NewGuard() if err := g.Reload(Config{IPWhitelist: "203.0.113.10,10.0.0.0/8", AdminIPWhitelist: "192.168.1.0/24"}); err != nil { t.Fatalf("Reload returned error: %v", err) } if !g.IsWhitelisted("203.0.113.10") || !g.IsWhitelisted("10.2.3.4") { t.Fatal("expected IP and CIDR entries to match") } if !g.IsAdminWhitelisted("192.168.1.5") { t.Fatal("expected admin CIDR whitelist match") } } func TestGuardBanPersistenceAcrossRestart(t *testing.T) { dir := filepath.Join(t.TempDir(), "bans.badger") g1 := NewGuard() if err := g1.EnableBanPersistence(dir); err != nil { t.Fatalf("EnableBanPersistence returned error: %v", err) } g1.Ban("198.51.100.4", 3600) if err := g1.Close(); err != nil { t.Fatalf("Close returned error: %v", err) } g2 := NewGuard() if err := g2.EnableBanPersistence(dir); err != nil { t.Fatalf("EnableBanPersistence returned error: %v", err) } defer g2.Close() if !g2.IsBanned("198.51.100.4") { t.Fatal("expected ban to persist across guard restart") } } func TestGuardBanListPrunesExpired(t *testing.T) { g := NewGuard() g.BanUntil("198.51.100.7", time.Now().UTC().Add(-time.Minute)) if g.IsBanned("198.51.100.7") { t.Fatal("expected expired ban to be treated as inactive") } if len(g.BanList()) != 0 { t.Fatal("expected BanList to prune expired entries") } }