public bool Unblock(BlockedEntry entry) { var firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2")); var policy = policyFactory.GetPolicy(entry); var ruleName = $"{policy.GetRuleName()} [{entry.Protocol}-{String.Join(",", entry.Ports)}]"; var rules = GetRules(firewallPolicy, ruleName); var toRemove = new List <INetFwRule>(); foreach (var rule in rules.Where(r => CleanIps(r.RemoteAddresses).Contains(entry.Ip))) { var ips = CleanIps(rule.RemoteAddresses); ips.Remove(entry.Ip); if (ips.Count() == 0) { toRemove.Add(rule); } else { rule.RemoteAddresses = String.Join(",", ips); } } foreach (var rule in toRemove) { firewallPolicy.Rules.Remove(rule.Name); rules.Remove(rule); } return(true); }
public void Run() { var fromDate = GetLastRunDate(); if (fromDate.Date != DateTime.Now.Date) { fromDate = DateTime.Today; } Console.WriteLine($"[{DateTime.Now}] {nameof(BlockService)} - Starting from {fromDate}"); var badIps = logFileDataSource.GetBadIps(fromDate); var runtime = badIps.LastOrDefault()?.Time.AddSeconds(1) ?? DateTime.Now; foreach (var ipEntry in badIps) { var isBlocked = dataStore.IsIPBlocked(ipEntry.IP, logFileDataSource.GetName(), ipEntry.Ports, ipEntry.Protocol.ToString()); if (!isBlocked) { var blockEntry = new BlockedEntry(ipEntry, logFileDataSource.GetName()); blockEntry.IpLocation = ipLocator.GetIpLocation(blockEntry.Ip); var policy = policyFactory.GetPolicy(blockEntry); if (policy.ShouldBlock() && ipBlocker.Block(blockEntry, policy, out var ruleName)) { blockEntry.RuleName = ruleName; blockEntry.IsBLocked = true; dataStore.Add(blockEntry, policy, logFileDataSource.GetName()); } } } dataStore.SaveConfigValue("LastRunDate", runtime.ToString()); Console.WriteLine($"[{DateTime.Now}] {nameof(BlockService)} - Complete"); }