From a43649f2ce5090f3ce7b7ebd991a062fc2ede516 Mon Sep 17 00:00:00 2001 From: Stuart Gathman <stuart@gathman.org> Date: Fri, 19 Aug 2011 04:53:56 +0000 Subject: [PATCH] Make addr2bin and dynip handle IP6. --- Milter/dynip.py | 3 ++- Milter/utils.py | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Milter/dynip.py b/Milter/dynip.py index f4dcfd5..0070567 100644 --- a/Milter/dynip.py +++ b/Milter/dynip.py @@ -48,9 +48,10 @@ def is_dynip(host,addr): True """ if host.startswith('[') and host.endswith(']'): - return True + return True # no ptr if addr: if host.find(addr) >= 0: return True + if addr.find(':') >= 0: return False # IP6 a = addr.split('.') ia = map(int,a) h = host diff --git a/Milter/utils.py b/Milter/utils.py index 6d6350c..d8d5516 100644 --- a/Milter/utils.py +++ b/Milter/utils.py @@ -28,16 +28,21 @@ ip6re = re.compile( '(?:%(hex4)s:){6}%(ls32)s$' }, re.IGNORECASE) # from spf.py -def addr2bin(str): +def addr2bin(s): """Convert a string IPv4 address into an unsigned integer.""" + if s.find(':') >= 0: + try: + return bin2long6(inet_pton(s)) + except: + raise socket.error("Invalid IP6 address: "+s) try: - return struct.unpack("!L", socket.inet_aton(str))[0] + return struct.unpack("!L", socket.inet_aton(s))[0] except socket.error: - raise socket.error("Invalid IP4 address: "+str) + raise socket.error("Invalid IP4 address: "+s) -def bin2long6(str): +def bin2long6(s): """Convert binary IP6 address into an unsigned Python long integer.""" - h, l = struct.unpack("!QQ", str) + h, l = struct.unpack("!QQ", s) return h << 64 | l if hasattr(socket,'has_ipv6') and socket.has_ipv6: -- GitLab