diff --git a/TODO b/TODO index 9171a27..a4c0c4f 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,10 @@ +Include full info in Received-SPF for neutral. When making best +guess, Received-SPF should be none. Add additional keywords or +another header. + +Require signed MFROM for all incoming bounces when signing all outgoing mail - +except from trusted relays. + Send DSN for permerror before processing extended result. An additional DSN may be sent based on extended result. diff --git a/bms.py b/bms.py index 688c888..cca04b3 100644 --- a/bms.py +++ b/bms.py @@ -1,6 +1,9 @@ #!/usr/bin/env python # A simple milter that has grown quite a bit. # $Log$ +# Revision 1.41 2005/12/01 18:59:25 customdesigned +# Fix neutral policy. pobox.com -> openspf.org +# # Revision 1.40 2005/11/07 21:22:35 customdesigned # GOSSiP support, local database only. # @@ -578,7 +581,7 @@ def read_config(list): ses = SES.new(secret=srs_secret,expiration=maxage) srs_domain = cp.getlist('srs','ses') else: - srs_domain = [] + srs_domain = cp.getlist('srs','srs') srs_domain.append(cp.getdefault('srs','fwdomain')) banned_users = cp.getlist('srs','banned_users') #print srs_domain @@ -947,15 +950,7 @@ class bmsMilter(Milter.Milter): self.umis = None if not (self.internal_connection or self.trusted_relay) \ and self.connectip and spf: - rc = self.check_spf() - if rc != Milter.CONTINUE or not domain or not gossip: return rc - if self.spf.result == 'pass': - qual = 'SPF' - else: - qual = self.connectip - self.umis = gossip.umis(domain+qual,self.id+time.time()) - res,hdr,val = gossip_node.query(self.umis,domain,qual,1) - self.add_header(hdr,val,idx=0) + return self.check_spf() else: self.spf = None return Milter.CONTINUE @@ -1094,6 +1089,14 @@ class bmsMilter(Milter.Milter): if res == 'pass' and auto_whitelist.has_key(self.canon_from): self.whitelist = True self.log("WHITELIST",self.canon_from) + if gossip: + if res == 'pass': + qual = 'SPF' + else: + qual = self.connectip + self.umis = gossip.umis(q.o+qual,self.id+time.time()) + res,hdr,val = gossip_node.query(self.umis,q.o,qual,1) + self.add_header(hdr,val) return Milter.CONTINUE # hide_path causes a copy of the message to be saved - until we diff --git a/doc/changes.ht b/doc/changes.ht index 679a15c..01e5c24 100644 --- a/doc/changes.ht +++ b/doc/changes.ht @@ -6,6 +6,11 @@ Python milter has been moved to pymilter Sourceforge project for development and release downloads. +

GOSSiP

+An alpha release of pygossip has been commited to +CVS, module pygossip. A version of the bms.py milter has been commited to CVS +which supports calling GOSSiP to track domain reputation in a local database. +

New website design

Hey, I'm no artist, so I just used the diff --git a/doc/credits.ht b/doc/credits.ht index 8240592..dcdfaad 100644 --- a/doc/credits.ht +++ b/doc/credits.ht @@ -25,7 +25,8 @@ real, usable Python extension.
for providing a Python port of SPF
Scott Kitterman
for doing lots of testing and debugging of SPF against draft standard, - and for putting up a web page that validates SPF records using spf.py + and for putting up a + web page that validates SPF records using spf.py
Alexander Kourakos
for plugging several memory leaks
George Graf at Vienna University of Economics and Business Administration diff --git a/milter.spec b/milter.spec index 446305b..cc8294c 100644 --- a/milter.spec +++ b/milter.spec @@ -1,6 +1,6 @@ %define name milter %define version 0.8.4 -%define release 1.RH7 +%define release 2.RH7 # what version of RH are we building for? %define redhat9 0 %define redhat7 1 @@ -31,7 +31,7 @@ Name: %{name} Version: %{version} Release: %{release} Source: %{name}-%{version}.tar.gz -#Patch: %{name}-%{version}.patch +Patch: %{name}-%{version}.patch Copyright: GPL Group: Development/Libraries BuildRoot: %{_tmppath}/%{name}-buildroot @@ -52,10 +52,15 @@ modules provide for navigating and modifying MIME parts. %prep %setup -#%patch -p1 +%patch -p0 -b .bms %build -env CFLAGS="$RPM_OPT_FLAGS" LDFLAGS="-s" %{python} setup.py build +if %{redhat9}; then + LDFLAGS="-g" +else + LDFLAGS="-s" +fi +env CFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$LDFLAGS" %{python} setup.py build %install rm -rf $RPM_BUILD_ROOT @@ -169,8 +174,13 @@ rm -rf $RPM_BUILD_ROOT /usr/share/sendmail-cf/hack/rhsbl.m4 %changelog +* Mon Oct 31 2005 Stuart Gathman 0.8.5-1 +- Simple trusted_forwarder implementation. +- Fix access_file neutral policy * Fri Oct 21 2005 Stuart Gathman 0.8.4-2 - Don't supply sender when MFROM is subdomain of header from/sender. +- Don't send quarantine DSN for DSNs +- Skip dspam for replies/DSNs to signed MFROM * Thu Oct 20 2005 Stuart Gathman 0.8.4-1 - Fix SPF policy via sendmail access map (case insensitive keys). - Auto whitelist senders, train screener on whitelisted messages diff --git a/spf.py b/spf.py index 70b3838..a45a099 100755 --- a/spf.py +++ b/spf.py @@ -19,7 +19,7 @@ AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. For more information about SPF, a tool against email forgery, see - http://spf.pobox.com/ + http://openspf.org/ For news, bugfixes, etc. visit the home page for this implementation at http://www.wayforward.net/spf/ @@ -47,6 +47,9 @@ For news, bugfixes, etc. visit the home page for this implementation at # Terrence is not responding to email. # # $Log$ +# Revision 1.15 2005/10/30 01:08:14 customdesigned +# Ignore records missing spaces. +# # Revision 1.14 2005/08/12 17:36:51 customdesigned # Trean non-existant include as no match in "lax" mode. # @@ -596,9 +599,12 @@ class query(object): return ('none', 250, EXPLANATIONS['none']) # split string by whitespace, drop the 'v=spf1' - # spf = spf.split() - #Catch case where SPF record has no spaces + # Catch case where SPF record has no spaces + # Can never happen with conforming dns_spf(), however + # in the future we might want to give permerror + # for common mistakes like IN TXT "v=spf1" "mx" "-all" + # in relaxed mode. if spf[0] != 'v=spf1': raise PermError('Invalid SPF record in', self.d) spf = spf[1:] diff --git a/strike3.txt b/strike3.txt index 3357213..917fbae 100644 --- a/strike3.txt +++ b/strike3.txt @@ -23,7 +23,7 @@ SMTP (email) servers to prevent criminals from forging your domain. The simplest step is usually to publish an SPF record with your Sender Policy. -For more information, see: http://openspf.com +For more information, see: http://openspf.org I hate to annoy you with a DSN (Delivery Status Notification) from a possibly forged email, but since you