Handle multi-line headers in delayed dsns.

This commit is contained in:
Stuart Gathman
2006-06-21 22:22:00 +00:00
parent 8c4cca8f55
commit d38cf5885e
+27 -17
View File
@@ -1,6 +1,10 @@
#!/usr/bin/env python #!/usr/bin/env python
# A simple milter that has grown quite a bit. # A simple milter that has grown quite a bit.
# $Log$ # $Log$
# Revision 1.64 2006/06/21 21:12:04 customdesigned
# More delayed reject token headers.
# Don't require HELO pass for CBV.
#
# Revision 1.63 2006/05/21 03:41:44 customdesigned # Revision 1.63 2006/05/21 03:41:44 customdesigned
# Fail dsn # Fail dsn
# #
@@ -1569,27 +1573,33 @@ class bmsMilter(Milter.Milter):
# check for delayed bounce # check for delayed bounce
if self.delayed_failure: if self.delayed_failure:
self.fp.seek(0) self.fp.seek(0)
lastln = None
for ln in self.fp: for ln in self.fp:
# FIXME: handle multi-line header field if lastln:
if ln[0].isspace() and ln[0] != '\n':
lastln += ln
continue
name,val = lastln.rstrip().split(None,1)
pos = val.find('<SRS')
if pos >= 0:
try:
sender = srs.reverse(val[pos+1:-1])
cbv_cache[sender] = 500,self.delayed_failure,time.time()
try:
# save message for debugging
fname = tempfile.mktemp(".dsn")
os.rename(self.tempname,fname)
except:
fname = self.tempname
self.tempname = None
self.log('BLACKLIST:',sender,fname)
return Milter.DISCARD
except: continue
lnl = ln.lower() lnl = ln.lower()
for k in ('message-id','x-mailer','sender'): for k in ('message-id','x-mailer','sender'):
if lnl.startswith(k): if lnl.startswith(k):
name,val = ln.split(None,1) lastln = ln
pos = val.find('<SRS') break
if pos >= 0:
try:
sender = srs.reverse(val[pos+1:-1])
cbv_cache[sender] = 500,self.delayed_failure,time.time()
try:
# save message for debugging
fname = tempfile.mktemp(".dsn")
os.rename(self.tempname,fname)
except:
fname = self.tempname
self.tempname = None
self.log('BLACKLIST:',sender,fname)
return Milter.DISCARD
except: continue
# analyze external mail for spam # analyze external mail for spam
spam_checked = self.check_spam() # tag or quarantine for spam spam_checked = self.check_spam() # tag or quarantine for spam