From a420148b1e75d747acd17aacbd6bc3e8cbd43477 Mon Sep 17 00:00:00 2001
From: Stuart Gathman <stuart@gathman.org>
Date: Tue, 29 Jul 2008 21:59:29 +0000
Subject: [PATCH] Parse ESMTP params

---
 bms.py        | 21 +++++++++++++++++++++
 milter.cfg    |  2 +-
 pymilter.spec |  6 +++---
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/bms.py b/bms.py
index 39d0d9c..60f04f3 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.122  2008/05/08 21:35:56  customdesigned
+# Allow explicitly whitelisted email from banned_users.
+#
 # Revision 1.121  2008/04/10 14:59:35  customdesigned
 # Configure gossip TTL.
 #
@@ -496,6 +499,12 @@ def findsrs(fp):
         lastln = ln
         break
 
+def param2dict(str):
+  pairs = [x.split('=',1) for x in str]
+  for e in pairs:
+    if len(e) < 2: e.append(None)
+  return dict([(k.upper(),v) for k,v in pairs])
+
 class SPFPolicy(object):
   "Get SPF policy by result from sendmail style access file."
   def __init__(self,sender):
@@ -721,6 +730,9 @@ class bmsMilter(Milter.Milter):
   # of each message.
   def envfrom(self,f,*str):
     self.log("mail from",f,str)
+    #param = param2dict(str)
+    #self.envid = param.get('ENVID',None)
+    #self.mail_param = param
     self.fp = StringIO.StringIO()
     self.tempname = None
     self.mailfrom = f
@@ -1077,6 +1089,15 @@ class bmsMilter(Milter.Milter):
   # track header mods separately from body mods - so use only
   # in emergencies.
   def envrcpt(self,to,*str):
+    try:
+      param = param2dict(str)
+      self.notify = param.get('NOTIFY','FAILURE,DELAY').upper().split(',')
+      if 'NEVER' in self.notify: self.notify = ()
+      #self.rcpt_param = param
+    except:
+      self.log("REJECT: invalid PARAM:",to,str)
+      self.setreply('550','5.7.1','Invalid SRS signature')
+      return Milter.REJECT
     # mail to MAILER-DAEMON is generally spam that bounced
     if to.startswith('<MAILER-DAEMON@'):
       self.log('REJECT: RCPT TO:',to,str)
diff --git a/milter.cfg b/milter.cfg
index 98ee534..6ae81a3 100644
--- a/milter.cfg
+++ b/milter.cfg
@@ -61,7 +61,7 @@ porn_words = penis, breast, pussy, horse cock, porn, xenical, diet pill, d1ck,
 	p-e-n-i-s, hydrocodone, vicodin, xanax, vicod1n, x@nax, diazepam,
 	v1@gra, xan@x, cialis, ci@lis, fr�e, x�nax, val�um, v�lium, via-gra,
 	x@n3x, vicod3n, pen�s, c0d1n, phentermine, en1arge, dip1oma, v1codin,
-	valium, rolex, sexual, fuck, adv1t
+	valium, rolex, sexual, fuck, adv1t, vgaira, medz
 # reject mail with these case sensitive strings in the subject
 spam_words = $$$, !!!, XXX, FREE, HGH
 # attachments with these extensions will be replaced with a warning
diff --git a/pymilter.spec b/pymilter.spec
index 3baf416..b63f12d 100644
--- a/pymilter.spec
+++ b/pymilter.spec
@@ -2,8 +2,8 @@
 # module.  To compile all three on 32-bit Intel, use:
 # rpmbuild -ba --target=i386,noarch pymilter.spec
 
-%define version 0.8.9
-%define release 2
+%define version 0.8.10
+%define release 1
 # what version of RH are we building for?
 %define redhat7 0
 
@@ -278,7 +278,7 @@ rm -rf $RPM_BUILD_ROOT
 - improved parsing into email and fullname
 - implement no-DSN CBV
 - check for porn words in MAIL FROM fullname
-- ban IP for too many bad MAIL FROMs
+- ban IP for too many bad MAIL FROMs or RCPT TOs
 - temperror policy in access
 - no CBV for whitelisted MAIL FROM except permerror, softfail
 * Mon Sep 24 2007 Stuart Gathman <stuart@bmsi.com> 0.8.9-1
-- 
GitLab