[Mailman-Developers] Some patch for mailman

Dan Ohnesorg, admin on power Dan@feld.cvut.cz
Wed, 1 Jul 1998 14:40:13 +0200


Hi everybody,

I am plaing with mailman some time (John probaly remebers me) and now I see, that 
www.list.org is back online.

So what I have, I would suggest You patch to verbose funcionality of mailman. All 
sugestion to my solution are welcome.

What it solves, first part of patch to remove irriting headers from messages. I dont 
like to send messages like RCPT and so. Second uses DSN to send mails. This 
disables (when enabled) messages like warning, message is not delivered for 4 
hours and so. Then comes some removing of winmail.dat binary attachments. I am 
working on removing all unwanted parts (html, rtf) and translating national 
characters into ascii, but is not complete yet. Then comes administrativ via filter, but 
it not works, it worked on mailman 1.0, but I cannot bring it running on b4, You will 
see, it is probably only a little bug, at least the filter shields list from administrative 
messages.

So it is all for today, I am interested how You will find this patch, please send any 
comments to my.

cheers
dan

diff -ru mailman-1.0b4/modules/mm_defaults.py mailman-1.0b4.new/modules/mm_defaults.py
--- mailman-1.0b4/modules/mm_defaults.py	Fri Jun 26 12:41:28 1998
+++ mailman-1.0b4.new/modules/mm_defaults.py	Fri Jun 26 18:43:28 1998
@@ -202,3 +202,11 @@
 
 # The Mailman version, also set by configure
 VERSION           = '1.0b4'
+
+# Remove Microsoft binary attachments
+REMOVE_WINMAIL = 1
+WINMAIL_FILTER_START = 'begin 600 WINMAIL\.DAT'
+WINMAIL_FILTER_STOP = 'end'
+
+# Headers which are not useful
+FILTER_HEADERS    = ['^X-Confirm-Reading-To:','^X-pmrqc:','X-PMFLAGS:','^Return-receipt-to:']   
Only in mailman-1.0b4/modules: mm_defaults.py.in
diff -ru mailman-1.0b4/modules/mm_deliver.py mailman-1.0b4.new/modules/mm_deliver.py
--- mailman-1.0b4/modules/mm_deliver.py	Wed Jun  3 15:12:53 1998
+++ mailman-1.0b4.new/modules/mm_deliver.py	Fri Jun 26 18:32:35 1998
@@ -135,6 +135,12 @@
 	    msg.headers.append('To: %s\n' % self.GetListEmail())
  	else:
             tempfile.template = tmpfile_prefix + 'mailman.'
+# Now remove unwanted headers from message
+        for pat in mm_defaults.FILTER_HEADERS:
+         try:
+          del msg[pat]
+         except:
+          pass
 	if self.reply_goes_to_list:
             del msg['reply-to']
             msg.headers.append('Reply-To: %s\n' % self.GetListEmail())
diff -ru mailman-1.0b4/modules/mm_message.py mailman-1.0b4.new/modules/mm_message.py
--- mailman-1.0b4/modules/mm_message.py	Tue Jun  2 04:47:11 1998
+++ mailman-1.0b4.new/modules/mm_message.py	Fri Jun 26 18:01:47 1998
@@ -21,7 +21,7 @@
 
 
 import sys
-import rfc822, string, time
+import rfc822, string, time, mm_defaults, regex
 
 
 # Utility functions 2 of these classes use:
@@ -134,6 +134,24 @@
 	    if (string.lower(self.headers[i][:len(name)+1]) == 
 		string.lower(name) + ':'):
 		self.headers[i] = '%s: %s' % (name, value)
+
+    def RemoveWinmail(self):
+     pattern_start = regex.compile(mm_defaults.WINMAIL_FILTER_START)
+     pattern_stop = regex.compile(mm_defaults.WINMAIL_FILTER_STOP)
+     occured = 0
+     mybody=[]
+     mybody=string.split(self.body,'\n');
+     for line in mybody[:]:
+      if occured == 1:
+       if pattern_stop.match(line) > 0:
+        occured = 0
+       mybody.remove(line)
+      elif pattern_start.match(line) > 0:
+       occured = 1
+       mybody.remove(line)
+     self.body=string.join(mybody,'\n')
+
+
 		
     # XXX Eventually (1.5.1?) Python rfc822.Message() will have its own
     # __delitem__. 
diff -ru mailman-1.0b4/modules/smtplib.py mailman-1.0b4.new/modules/smtplib.py
--- mailman-1.0b4/modules/smtplib.py	Sat May 30 05:09:21 1998
+++ mailman-1.0b4.new/modules/smtplib.py	Wed Jul  1 14:27:23 1998
@@ -20,6 +20,9 @@
 # A lot of functionality was borrowed directly from ftplib...
 # John Viega (viega@list.org)
 
+# Hack to use DSN, probably not the best way, but works fine
+# But I have no not DSN aware server to check it without DSN
+
 # >>> from smtplib import *
 # >>> s = SmtpConnection('list.org')
 # >>> s.helo('adder.cs.virginia.edu')
@@ -27,7 +30,7 @@
 # >>> s.quit()
 
 from socket import *
-import string, types
+import string, types, regex
 
 SMTP_PORT = 25
 
@@ -38,6 +41,8 @@
 error_temp = 'smtplib.error_temp'	# 4xx errors
 error_perm = 'smtplib.error_perm'	# 5xx errors
 error_proto = 'smtplib.error_proto'	# response does not begin with [1-5]
+error_no_DSN = 'There is no DSN support'
+DSN_support = 1
 
 class SmtpConnection:
     def __init__(self, host=''):
@@ -52,8 +57,15 @@
 	self.getresp()
 
     def helo(self, host):
-	self._sock.send('HELO %s\r\n' % host)
-	self.getresp()
+        self._sock.send('EHLO %s\r\n' % host)
+        try:
+          vysl = self.getresp()
+        except error_perm:
+          self._sock.send('HELO %s\r\n' % host)
+          self.getresp()
+          self.DSN_support=0
+        if regex.match('.*DSN.*',vysl) == -1:
+          self.DSN_support=0
 
     def quit(self):
 	self._sock.send('QUIT\r\n')
@@ -66,12 +78,16 @@
 	lines  = string.split(text, '\n')
 	self._sock.send('MAIL FROM: %s\r\n' % frm)
 	self.getresp()
+	if DSN_support:
+	 format = 'RCPT TO: %s NOTIFY=failure\r\n'
+	else:
+	 format = 'RCPT TO: %s\r\n'
         if type(to) == types.StringType:
-         self._sock.send('RCPT TO: %s\r\n' % to)
+         self._sock.send(format % to)
          self.getresp()
         else:
          for item in to:
-           self._sock.send('RCPT TO: %s\r\n' % item)
+           self._sock.send(format % item)
            self.getresp()
 	self._sock.send('DATA\r\n')
 	self.getresp()
diff -ru mailman-1.0b4/scripts/post mailman-1.0b4.new/scripts/post
--- mailman-1.0b4/scripts/post	Sun May 31 06:48:09 1998
+++ mailman-1.0b4.new/scripts/post	Fri Jun 26 18:06:57 1998
@@ -31,7 +31,7 @@
 
 import sys
 import paths
-import maillist, mm_message, mm_err, mm_cfg, mm_utils
+import maillist, mm_message, mm_err, mm_cfg, mm_utils, string, mm_defaults
 
 try:
     sys.stderr = mm_utils.StampedLogger("error", label = 'post',
@@ -42,6 +42,18 @@
 # Only let one program run at once per list.
 
 # TODO: This can fail, and should send back an error message when it does.
+commands = {
+           'subscribe' : '',
+           'unsubscribe' : '',
+           'who' : '',
+           'info' : '',
+           'lists' : '',
+           'help' : '',
+           'set' : '',
+           'options' : '',
+           'password' : '',
+           }
+
 current_list = maillist.MailList(sys.argv[1])
 if len(sys.argv) > 2:
     current_list.tmp_prevent_gate = 1
@@ -60,10 +72,41 @@
     else:
 	text = sys.stdin.read()
     msg = mm_message.IncomingMessage(text)
+    if mm_defaults.REMOVE_WINMAIL: msg.RemoveWinmail()
+    bad_dest = 0
+    subject = msg.getheader("subject")
+    if subject:
+           subject = string.strip(subject)
+           if commands.has_key(string.split(subject)[0]):
+              bad_dest = 1
+    lines = string.split(msg.body, '\n')
+    if len(lines) >= 10:
+     hopcnt  = range(10)
+    else:
+     hopcnt = range(len(lines))
+    for i in hopcnt:
+      try:
+       string.strip(lines[i])
+      except:
+       pass
+      if not lines[i]:
+       continue
+      args = string.split(lines[i])
+      if len(args)>0:
+       cmd = string.lower(args[0])
+       if commands.has_key(cmd):
+         bad_dest = 1
 
-    try:
+    if bad_dest:
+      try:
+        current_list.ParseMailCommands()
+      finally:
+#        current_list.Unlock()
+         pass
+    else:
+     try:
 	current_list.Post(msg)
-    except mm_err.MMNeedApproval, err_msg:
+     except mm_err.MMNeedApproval, err_msg:
 	if (current_list.dont_respond_to_post_requests
             or err_msg == mm_err.MODERATED_LIST_MSG
             or err_msg == mm_err.IMPLICIT_DEST_MSG


                    ________________________________________
DDDDDD             
DD   DD                Dan Ohnesorg, supervisor on POWER     
DD  OOOO               Dan@feld.cvut.cz
DD OODDOO              Dep. of Power Engineering
DDDDDD OO              CVUT FEL Prague, Bohemia
   OO  OO              work: +420 2 24352785;+420 2 24972109
    OOOO               home: +420 311 679679;+420 311 679311
                    ________________________________________
Pocitac se od televizniho divaka lisi tim,
ze ma vlastni program.