More delayed reject token headers.

Don't require HELO pass for CBV.
This commit is contained in:
Stuart Gathman
2006-06-21 21:12:04 +00:00
parent d50215d0ba
commit a20eeda04d
+37 -22
View File
@@ -1,6 +1,9 @@
#!/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.63 2006/05/21 03:41:44 customdesigned
# Fail dsn
#
# Revision 1.61 2006/05/17 21:28:07 customdesigned # Revision 1.61 2006/05/17 21:28:07 customdesigned
# Create GOSSiP record only when connection will procede to DATA. # Create GOSSiP record only when connection will procede to DATA.
# #
@@ -1007,7 +1010,8 @@ class bmsMilter(Milter.Milter):
if hres == 'none' and spf_best_guess \ if hres == 'none' and spf_best_guess \
and not dynip(self.hello_name,self.connectip): and not dynip(self.hello_name,self.connectip):
hres,hcode,htxt = h.best_guess() hres,hcode,htxt = h.best_guess()
else: hres = res else:
hres,hcode,htxt = res,code,txt
ores = res ores = res
if spf_best_guess and res == 'none': if spf_best_guess and res == 'none':
#self.log('SPF: no record published, guessing') #self.log('SPF: no record published, guessing')
@@ -1021,6 +1025,7 @@ class bmsMilter(Milter.Milter):
res,code,txt = q.best_guess() res,code,txt = q.best_guess()
if self.missing_ptr and ores == 'none' and res != 'pass' \ if self.missing_ptr and ores == 'none' and res != 'pass' \
and hres != 'pass': and hres != 'pass':
# this bad boy has no credentials whatsoever
policy = p.getNonePolicy() policy = p.getNonePolicy()
if policy == 'CBV': if policy == 'CBV':
if self.mailfrom != '<>': if self.mailfrom != '<>':
@@ -1037,7 +1042,7 @@ class bmsMilter(Milter.Milter):
return Milter.REJECT return Milter.REJECT
if res in ('deny', 'fail'): if res in ('deny', 'fail'):
policy = p.getFailPolicy() policy = p.getFailPolicy()
if hres == 'pass' and policy == 'CBV': if policy == 'CBV':
if self.mailfrom != '<>': if self.mailfrom != '<>':
self.cbv_needed = (q,res) self.cbv_needed = (q,res)
elif policy != 'OK': elif policy != 'OK':
@@ -1049,7 +1054,7 @@ class bmsMilter(Milter.Milter):
return Milter.REJECT return Milter.REJECT
if res == 'softfail': if res == 'softfail':
policy = p.getSoftfailPolicy() policy = p.getSoftfailPolicy()
if policy == 'CBV' and hres == 'pass': if policy == 'CBV':
if self.mailfrom != '<>': if self.mailfrom != '<>':
self.cbv_needed = (q,res) self.cbv_needed = (q,res)
elif policy != 'OK': elif policy != 'OK':
@@ -1064,7 +1069,7 @@ class bmsMilter(Milter.Milter):
return Milter.REJECT return Milter.REJECT
if res == 'neutral': if res == 'neutral':
policy = p.getNeutralPolicy() policy = p.getNeutralPolicy()
if policy == 'CBV' and hres == 'pass': if policy == 'CBV':
if self.mailfrom != '<>': if self.mailfrom != '<>':
self.cbv_needed = (q,res) self.cbv_needed = (q,res)
# FIXME: this makes Received-SPF show wrong result # FIXME: this makes Received-SPF show wrong result
@@ -1081,7 +1086,7 @@ class bmsMilter(Milter.Milter):
return Milter.REJECT return Milter.REJECT
if res in ('unknown','permerror'): if res in ('unknown','permerror'):
policy = p.getPermErrorPolicy() policy = p.getPermErrorPolicy()
if policy == 'CBV' and hres == 'pass': if policy == 'CBV':
if self.mailfrom != '<>': if self.mailfrom != '<>':
self.cbv_needed = (q,res) self.cbv_needed = (q,res)
elif policy != 'OK': elif policy != 'OK':
@@ -1565,23 +1570,26 @@ class bmsMilter(Milter.Milter):
if self.delayed_failure: if self.delayed_failure:
self.fp.seek(0) self.fp.seek(0)
for ln in self.fp: for ln in self.fp:
if ln.lower().startswith('message-id:'): # FIXME: handle multi-line header field
name,val = ln.split(None,1) lnl = ln.lower()
pos = val.find('<SRS') for k in ('message-id','x-mailer','sender'):
if pos >= 0: if lnl.startswith(k):
try: name,val = ln.split(None,1)
sender = srs.reverse(val[pos+1:-1]) pos = val.find('<SRS')
cbv_cache[sender] = 500,self.delayed_failure,time.time() if pos >= 0:
try: try:
# save message for debugging sender = srs.reverse(val[pos+1:-1])
fname = tempfile.mktemp(".dsn") cbv_cache[sender] = 500,self.delayed_failure,time.time()
os.rename(self.tempname,fname) try:
except: # save message for debugging
fname = self.tempname fname = tempfile.mktemp(".dsn")
self.tempname = None os.rename(self.tempname,fname)
self.log('BLACKLIST:',sender,fname) except:
return Milter.DISCARD fname = self.tempname
except: continue 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
@@ -1738,9 +1746,16 @@ class bmsMilter(Milter.Milter):
except IOError: template = None except IOError: template = None
m = dsn.create_msg(q,self.recipients,msg,template) m = dsn.create_msg(q,self.recipients,msg,template)
if srs: if srs:
# Add SRS coded sender to various headers. When (incorrectly)
# replying to our DSN, any of these which are preserved
# allow us to track the source.
msgid = srs.forward(sender,self.receiver) msgid = srs.forward(sender,self.receiver)
m.add_header('Message-Id','<%s>'%msgid) m.add_header('Message-Id','<%s>'%msgid)
#m.add_header('Sender','"Python Milter" <%s>'%msgid) if 'x-mailer' in m:
m.replace_header('x-mailer','"%s" <%s>' % (m['x-mailer'],msgid))
else:
m.add_header('X-Mailer','"Python Milter" <%s>'%msgid)
m.add_header('Sender','"Python Milter" <%s>'%msgid)
m = m.as_string() m = m.as_string()
print >>open(template_name+'.last_dsn','w'),m print >>open(template_name+'.last_dsn','w'),m
res = dsn.send_dsn(sender,self.receiver,m) res = dsn.send_dsn(sender,self.receiver,m)