More delayed reject token headers.
Don't require HELO pass for CBV.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user