Skip to content
Snippets Groups Projects
Commit 994bcce7 authored by Stuart Gathman's avatar Stuart Gathman
Browse files

Properly report hard PermError (lax mode fails also) by always setting

perm_error attribute with PermError exception.  Improve reporting of
invalid domain PermError.
parent 7f5d8b6b
No related branches found
No related tags found
No related merge requests found
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.
......
#!/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): ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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): ...@@ -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): ...@@ -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':
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment