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