From aeff1f8ab5c8fdf1085e551c0971918c71ade27c Mon Sep 17 00:00:00 2001
From: Stuart Gathman <stuart@gathman.org>
Date: Sat, 4 Jul 2009 14:00:52 +0000
Subject: [PATCH] Skip source route in parseaddr.

---
 Milter/utils.py | 23 +++++++++++++++++++++--
 pymilter.spec   |  3 +++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/Milter/utils.py b/Milter/utils.py
index b9c4a41..9f077ef 100644
--- a/Milter/utils.py
+++ b/Milter/utils.py
@@ -1,3 +1,7 @@
+## @package Milter.utils
+# Miscellaneous functions.
+#
+
 import re
 import struct
 import socket
@@ -11,7 +15,7 @@ ip4re = re.compile(r'^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$')
 
 # from spf.py
 def addr2bin(str):
-  "Convert a string IPv4 address into an unsigned integer."
+  """Convert a string IPv4 address into an unsigned integer."""
   return struct.unpack("!L", socket.inet_aton(str))[0]
 
 MASK = 0xFFFFFFFFL
@@ -42,6 +46,10 @@ def iniplist(ipaddr,iplist):
       return True
   return False
 
+## Split email into Fullname and address.
+# This replaces <code>email.Utils.parseaddr</code> but fixes
+# some <a href="http://bugs.python.org/issue1025395">tricky test cases</a>.
+#
 def parseaddr(t):
   """Split email into Fullname and address.
 
@@ -91,13 +99,24 @@ def parse_addr(t):
   ['user@bar', 'example.com']
   >>> parse_addr('foo')
   ['foo']
+  >>> parse_addr('@mx.example.com:user@example.com')
+  ['user', 'example.com']
   """
   if t.startswith('<') and t.endswith('>'): t = t[1:-1]
   if t.startswith('"'):
     if t.endswith('"'): return [t[1:-1]]
     pos = t.find('"@')
     if pos > 0: return [t[1:pos],t[pos+2:]]
-  return t.split('@')
+  if t.startswith('@'):
+    t = t.split(':',1)[1]
+  return t.rsplit('@',1)
+
+## Decode headers gratuitously encoded to hide the content.
+# Spammers often encode headers to obscure the content from
+# spam filters.  This function decodes gratuitously encoded
+# headers.
+# @param val    the raw header value
+# @return the decoded value or the original raw value
 
 def parse_header(val):
   """Decode headers gratuitously encoded to hide the content.
diff --git a/pymilter.spec b/pymilter.spec
index 1427256..573710a 100644
--- a/pymilter.spec
+++ b/pymilter.spec
@@ -83,6 +83,9 @@ chmod a+x $RPM_BUILD_ROOT%{libdir}/start.sh
 rm -rf $RPM_BUILD_ROOT
 
 %changelog
+* Thu Jul 02 2009 Stuart Gathman <stuart@bmsi.com> 0.9.3-1
+- Handle source route in Milter.util.parse_addr()
+
 * Tue Jun 02 2009 Stuart Gathman <stuart@bmsi.com> 0.9.2-3
 - Change result of @noreply callbacks to NOREPLY when so negotiated.
 
-- 
GitLab