Catch more ascii encoding errors to improve resilience against bad data

(LP: #1844189)
This commit is contained in:
Scott Kitterman
2019-09-23 10:28:43 -04:00
parent 5800d25e0c
commit 47b7e9892f
2 changed files with 20 additions and 4 deletions
+2
View File
@@ -15,6 +15,8 @@
conversion issues conversion issues
- Fix variable initialization so mailformed mails missing body From do not - Fix variable initialization so mailformed mails missing body From do not
cause a traceback (LP: #1844161) cause a traceback (LP: #1844161)
- Catch more ascii encoding errors to improve resilience against bad data
(LP: #1844189)
1.1.0 2019-04-12 1.1.0 2019-04-12
- Add SubDomains option to enable signing for sub-domains (LP: #1811535) - Add SubDomains option to enable signing for sub-domains (LP: #1811535)
+15 -1
View File
@@ -149,7 +149,11 @@ class dkimMilter(Milter.Base):
elif lname == 'authentication-results': elif lname == 'authentication-results':
self.arheaders.append(val) self.arheaders.append(val)
if self.fp: if self.fp:
try:
self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'ascii'))) 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
return Milter.CONTINUE return Milter.CONTINUE
@Milter.noreply @Milter.noreply
@@ -305,8 +309,13 @@ class dkimMilter(Milter.Base):
self.header_i = codecs.decode(d.signature_fields.get(b'i'), 'ascii') self.header_i = codecs.decode(d.signature_fields.get(b'i'), 'ascii')
except TypeError as x: except TypeError as x:
self.header_i = None self.header_i = None
try:
self.header_d = codecs.decode(d.signature_fields.get(b'd'), 'ascii') self.header_d = codecs.decode(d.signature_fields.get(b'd'), 'ascii')
self.header_a = codecs.decode(d.signature_fields.get(b'a'), 'ascii') self.header_a = codecs.decode(d.signature_fields.get(b'a'), 'ascii')
except Exception as x:
self.dkim_comment = str(x)
if milterconfig.get('Syslog'):
syslog.syslog("check_dkim: {0}".format(x))
if res: if res:
if (milterconfig.get('Syslog') and if (milterconfig.get('Syslog') and
(milterconfig.get('SyslogSuccess') or (milterconfig.get('SyslogSuccess') or
@@ -326,7 +335,12 @@ class dkimMilter(Milter.Base):
syslog.syslog('DKIM: Fail (saved as {0})' syslog.syslog('DKIM: Fail (saved as {0})'
.format(fname)) .format(fname))
else: else:
syslog.syslog('DKIM: Fail ({0})'.format(d.domain.lower())) if milterconfig.get('Syslog'):
if d.domain:
syslog.syslog('DKIM: Fail ({0})'
.format(d.domain.lower()))
else:
syslog.syslog('DKIM: Fail, unextractable domain'
if res: if res:
result = 'pass' result = 'pass'
else: else: