Properly report hard PermError (lax mode fails also) by always setting
perm_error attribute with PermError exception. Improve reporting of invalid domain PermError.
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
Added Message-ID header to DSN with SRS signed sender. When seen on incoming
|
||||||
|
rfc ignorant failure message, blacklist sender.
|
||||||
|
|
||||||
Allow verified hostnames for trusted_relay. E.g. HELO name that
|
Allow verified hostnames for trusted_relay. E.g. HELO name that
|
||||||
passes SPF.
|
passes SPF.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
#!/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.55 2006/02/17 05:04:29 customdesigned
|
||||||
|
# Use SRS sign domain list.
|
||||||
|
# Accept but do not use for training whitelisted senders without SPF pass.
|
||||||
|
# Immediate rejection of unsigned bounces.
|
||||||
|
#
|
||||||
# Revision 1.54 2006/02/16 02:16:36 customdesigned
|
# Revision 1.54 2006/02/16 02:16:36 customdesigned
|
||||||
# User specific SPF receiver policy.
|
# User specific SPF receiver policy.
|
||||||
#
|
#
|
||||||
@@ -753,6 +758,8 @@ class bmsMilter(Milter.Milter):
|
|||||||
if hostname == 'GC':
|
if hostname == 'GC':
|
||||||
n = gc.collect()
|
n = gc.collect()
|
||||||
self.log("gc:",n,' unreachable objects')
|
self.log("gc:",n,' unreachable objects')
|
||||||
|
self.log("auto-whitelist:",len(auto_whitelist),' entries')
|
||||||
|
self.log("cbv_cache:",len(cbv_cache),' entries')
|
||||||
self.setreply('550','5.7.1','%d unreachable objects'%n)
|
self.setreply('550','5.7.1','%d unreachable objects'%n)
|
||||||
return Milter.REJECT
|
return Milter.REJECT
|
||||||
return Milter.CONTINUE
|
return Milter.CONTINUE
|
||||||
@@ -935,9 +942,6 @@ class bmsMilter(Milter.Milter):
|
|||||||
res,code,txt = q.best_guess('v=spf1 a/24 mx/24')
|
res,code,txt = q.best_guess('v=spf1 a/24 mx/24')
|
||||||
else:
|
else:
|
||||||
res,code,txt = q.best_guess()
|
res,code,txt = q.best_guess()
|
||||||
if q.perm_error: # FIXME: should never happen?
|
|
||||||
res,code,txt = q.perm_error.ext # extended result
|
|
||||||
txt = 'EXT: ' + txt
|
|
||||||
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':
|
||||||
policy = p.getNonePolicy()
|
policy = p.getNonePolicy()
|
||||||
@@ -1638,6 +1642,9 @@ class bmsMilter(Milter.Milter):
|
|||||||
template = file(template_name).read()
|
template = file(template_name).read()
|
||||||
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:
|
||||||
|
msgid = srs.forward(sender,self.receiver)
|
||||||
|
m.add_header('Message-Id','<%s>'%msgid)
|
||||||
m = m.as_string()
|
m = m.as_string()
|
||||||
print >>open('last_dsn','w'),m
|
print >>open('last_dsn','w'),m
|
||||||
res = dsn.send_dsn(sender,self.receiver,m)
|
res = dsn.send_dsn(sender,self.receiver,m)
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ For news, bugfixes, etc. visit the home page for this implementation at
|
|||||||
# Terrence is not responding to email.
|
# Terrence is not responding to email.
|
||||||
#
|
#
|
||||||
# $Log$
|
# $Log$
|
||||||
|
# Revision 1.18 2005/12/29 19:15:35 customdesigned
|
||||||
|
# Handle NULL MX
|
||||||
|
#
|
||||||
# Revision 1.17 2005/12/23 21:44:15 customdesigned
|
# Revision 1.17 2005/12/23 21:44:15 customdesigned
|
||||||
# Always include keyword data in Received-SPF header.
|
# Always include keyword data in Received-SPF header.
|
||||||
#
|
#
|
||||||
@@ -507,6 +510,8 @@ class query(object):
|
|||||||
except TempError,x:
|
except TempError,x:
|
||||||
return ('error', 450, 'SPF Temporary Error: ' + str(x))
|
return ('error', 450, 'SPF Temporary Error: ' + str(x))
|
||||||
except PermError,x:
|
except PermError,x:
|
||||||
|
if not self.perm_error:
|
||||||
|
self.perm_error = x
|
||||||
self.prob = x.msg
|
self.prob = x.msg
|
||||||
if x.mech:
|
if x.mech:
|
||||||
self.mech.append(x.mech)
|
self.mech.append(x.mech)
|
||||||
@@ -577,7 +582,7 @@ class query(object):
|
|||||||
arg = self.expand(arg)
|
arg = self.expand(arg)
|
||||||
if not (0 < arg.find('.') < len(arg) - 1):
|
if not (0 < arg.find('.') < len(arg) - 1):
|
||||||
raise PermError('Invalid domain found (use FQDN)',
|
raise PermError('Invalid domain found (use FQDN)',
|
||||||
arg)
|
m+':'+arg)
|
||||||
if m == 'include':
|
if m == 'include':
|
||||||
if arg == self.d:
|
if arg == self.d:
|
||||||
if mech != 'include':
|
if mech != 'include':
|
||||||
|
|||||||
Reference in New Issue
Block a user