From 88c17516d902e337786f7ec3e19652d3bb01615c Mon Sep 17 00:00:00 2001 From: Scott Kitterman Date: Mon, 20 Apr 2020 15:51:10 -0400 Subject: [PATCH] Improve resilience to malformed email addresses --- CHANGES | 1 + dkimpy_milter/__init__.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 6cfeb0b..57a3ac6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,5 @@ 1.2.2 + - Improve resilience to malformed email addresses - Improve README.md formating for markdown display on pypi - Improve documentation in dkimpy-milter.conf (5) and README.md for signing for multiple domains (Thanks to Stefano Rivera) diff --git a/dkimpy_milter/__init__.py b/dkimpy_milter/__init__.py index 5118ae8..a0db433 100644 --- a/dkimpy_milter/__init__.py +++ b/dkimpy_milter/__init__.py @@ -141,6 +141,8 @@ class dkimMilter(Milter.Base): self.fdomain = self.author.split('@')[1].lower() except IndexError as er: pass # self.author was not a proper email address + # This keeps non-ascii characters out of the From domain + self.fdomain = str(codecs.encode(self.fdomain, 'ascii', 'replace'), 'ascii', 'ignore') if (self.conf.get('Syslog') and self.conf.get('debugLevel') >= 1): syslog.syslog("{0}: {1}".format(name, val)) @@ -148,7 +150,11 @@ class dkimMilter(Milter.Base): self.arheaders.append(val) if self.fp: try: - self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'ascii'))) + if lname == 'from': + # Non-ascii in email address localpart is legal, so this is a special case + self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'UTF-8', 'replace'))) + else: + self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'ascii'))) except: # Don't choke on header fields with non-ascii garbage in them. pass