diff --git a/ChangeLog b/ChangeLog index 92eb0825..cf38cbf5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -67,6 +67,7 @@ ver. 0.9.2 (2014/XX/XXX) - wanna-be-released * action.d/{sendmail-*,xarf-login-attack}.conf - report local timezone not UTC time/zone. Closes gh-911 * Conditionally log Ignore IP with reason (dns, ip, command). Closes gh-916 + * Absorbed DNSUtils.cidr into addr2bin in filter.py, added unittests ver. 0.9.1 (2014/10/29) - better, faster, stronger diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py index 8b1642b4..12379cd0 100644 --- a/fail2ban/server/filter.py +++ b/fail2ban/server/filter.py @@ -367,8 +367,8 @@ class Filter(JailThread): "(?<=b)1+", bin(DNSUtils.addr2bin(s[1]))).group()) s[1] = long(s[1]) try: - a = DNSUtils.cidr(s[0], s[1]) - b = DNSUtils.cidr(ip, s[1]) + a = DNSUtils.addr2bin(s[0], cidr=s[1]) + b = DNSUtils.addr2bin(ip, cidr=s[1]) except Exception: # Check if IP in DNS ips = DNSUtils.dnsToIp(i) @@ -913,22 +913,18 @@ class DNSUtils: return ipList @staticmethod - def cidr(i, n): - """ Convert an IP address string with a CIDR mask into a 32-bit - integer. + def addr2bin(ipstring, cidr=None): + """ Convert a string IPv4 address into binary form. + If cidr is supplied, return the network address for the given block """ - # 32-bit IPv4 address mask - MASK = 0xFFFFFFFFL - return ~(MASK >> n) & MASK & DNSUtils.addr2bin(i) + if cidr is None: + return struct.unpack("!L", socket.inet_aton(ipstring))[0] + else: + MASK = 0xFFFFFFFFL + return ~(MASK >> cidr) & MASK & DNSUtils.addr2bin(ipstring) @staticmethod - def addr2bin(string): - """ Convert a string IPv4 address into an unsigned integer. + def bin2addr(ipbin): + """ Convert a binary IPv4 address into string n.n.n.n form. """ - return struct.unpack("!L", socket.inet_aton(string))[0] - - @staticmethod - def bin2addr(addr): - """ Convert a numeric IPv4 address into string n.n.n.n form. - """ - return socket.inet_ntoa(struct.pack("!L", addr)) + return socket.inet_ntoa(struct.pack("!L", ipbin)) diff --git a/fail2ban/tests/filtertestcase.py b/fail2ban/tests/filtertestcase.py index 812a02cf..8fa13dfa 100644 --- a/fail2ban/tests/filtertestcase.py +++ b/fail2ban/tests/filtertestcase.py @@ -1026,6 +1026,22 @@ class DNSUtilsTests(unittest.TestCase): res = DNSUtils.ipToName('10.0.0.0') self.assertEqual(res, None) + def testAddr2bin(self): + res = DNSUtils.addr2bin('10.0.0.0') + self.assertEqual(res, 167772160L) + res = DNSUtils.addr2bin('10.0.0.0', cidr=None) + self.assertEqual(res, 167772160L) + res = DNSUtils.addr2bin('10.0.0.0', cidr=32L) + self.assertEqual(res, 167772160L) + res = DNSUtils.addr2bin('10.0.0.1', cidr=32L) + self.assertEqual(res, 167772161L) + res = DNSUtils.addr2bin('10.0.0.1', cidr=31L) + self.assertEqual(res, 167772160L) + + def testBin2addr(self): + res = DNSUtils.bin2addr(167772160L) + self.assertEqual(res, '10.0.0.0') + class JailTests(unittest.TestCase): def testSetBackend_gh83(self):