Update of /cvsroot/tmda/tmda/bin
In directory usw-pr-cvs1:/tmp/cvs-serv21645/bin

Modified Files:
        ChangeLog tmda-inject tmda-pending tmda-rfilter 
Log Message:
Replace use of the rfc822 module with the email module.

The goal of this first revision is simply to replace rfc822, with no
changes in functionality or behavior.


Index: ChangeLog
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/ChangeLog,v
retrieving revision 1.233
retrieving revision 1.234
diff -u -r1.233 -r1.234
--- ChangeLog   21 Sep 2002 00:27:44 -0000      1.233
+++ ChangeLog   30 Sep 2002 23:45:54 -0000      1.234
@@ -1,3 +1,11 @@
+2002-09-30  Jason R. Mastaler  <[EMAIL PROTECTED]>
+
+       * tmda-inject: Use the email module instead of the rfc822 module.
+       
+       * tmda-pending: Ditto.
+
+       * tmda-rfilter: Ditto.
+       
 2002-09-20  Jason R. Mastaler  <[EMAIL PROTECTED]>
 
        * tmda-pending (main): Run the headers through an RFC 2047 decoder

Index: tmda-inject
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-inject,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- tmda-inject 13 Sep 2002 00:22:36 -0000      1.68
+++ tmda-inject 30 Sep 2002 23:45:54 -0000      1.69
@@ -126,7 +126,6 @@
 
 
 import email
-import rfc822
 import string
 
 
@@ -138,10 +137,10 @@
     Util.filter_match(Defaults.FILTER_OUTGOING, recip, sender)
     sys.exit()
 
-message = sys.stdin
-message_headers = rfc822.Message(message)
-message_body = message.read()
-message_size = str(len(message_body))
+msgout = email.message_from_file(sys.stdin)
+orig_msgout_as_string = msgout.as_string()
+orig_msgout_size = len(orig_msgout_as_string)
+orig_msgout_body_as_raw_string = Util.body_as_raw_string(msgout)
 
 def message_format(fsa, ffn, type):
     # "angles" is the default MESSAGE_FROM_STYLE
@@ -197,8 +196,8 @@
                    to_address,
                    from_address,
                   full_name,
-                   message_headers,
-                   message_body,
+                   msg,
+                   orig_msgout_body_as_raw_string,
                    actions,
                    log_msg):
     """Hand the message off to sendmail."""
@@ -219,15 +218,17 @@
                                  from_address, to_address)
     # Set From: or Resent-From: to match the envelope sender address.
     if resending:
-       message_headers['Resent-From'] = message_format(resent_from, full_name,
-                                                        Defaults.MESSAGE_FROM_STYLE)
+        del msg['Resent-From']
+       msg['Resent-From'] = message_format(resent_from, full_name,
+                                            Defaults.MESSAGE_FROM_STYLE)
     else:
-       message_headers['From'] = message_format(magic_from, full_name,
-                                                 Defaults.MESSAGE_FROM_STYLE)
+        del msg['From']
+       msg['From'] = message_format(magic_from, full_name,
+                                     Defaults.MESSAGE_FROM_STYLE)
     # If the MUA has added a `Mail-Followup-To' header that contains
     # the untagged address, we need to tag that as well.
-    if message_headers.has_key('mail-followup-to'):
-       mft_list = message_headers.getaddrlist('mail-followup-to')
+    if msg.has_key('mail-followup-to'):
+       mft_list = email.Utils.getaddresses(msg.get_all('mail-followup-to'))
        new_mft_list = []
        for a in mft_list:
            emaddy = a[1]
@@ -235,35 +236,38 @@
                new_mft_list.append(magic_from)
            else:
                new_mft_list.append(emaddy)
-       message_headers['Mail-Followup-To'] = string.join(new_mft_list, ',\n\t')
+        del msg['Mail-Followup-To']
+       msg['Mail-Followup-To'] = string.join(new_mft_list, ',\n\t')
     # Add `Date' and `Message-ID' headers only if they don't already exist.
-    if not message_headers.has_key('date'):
-       message_headers['Date'] = Util.make_date()
-    if not message_headers.has_key('message-id'):
-       message_headers['Message-ID'] = Util.make_msgid()
+    if not msg.has_key('date'):
+       msg['Date'] = Util.make_date()
+    if not msg.has_key('message-id'):
+       msg['Message-ID'] = Util.make_msgid()
     # Add `X-Delivery-Agent' header.
-    message_headers['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
+    del msg['X-Delivery-Agent']
+    msg['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
     # Optionally, add an `X-TMDA-Fingerprint' header.
     if Defaults.FINGERPRINT:
        hdrlist = []
        for hdr in Defaults.FINGERPRINT:
             if hdr == 'body':
-                hdrval = message_body
+                hdrval = orig_msgout_body_as_raw_string
             else:
-                hdrval = message_headers.getheader(hdr, None)
+                hdrval = msg.get(hdr)
            if hdrval:
                hdrlist.append(hdrval)
        if hdrlist:
-           message_headers['X-TMDA-Fingerprint'] = (Cookie.make_fingerprint
-                                                     (hdrlist))
+            del msg['X-TMDA-Fingerprint']
+           msg['X-TMDA-Fingerprint'] = (Cookie.make_fingerprint(hdrlist))
     # Optionally, add some headers.
     if Defaults.ADDED_HEADERS_CLIENT:
         for hdr in Defaults.ADDED_HEADERS_CLIENT.keys():
-            message_headers[hdr] = Defaults.ADDED_HEADERS_CLIENT[hdr]
+            del msg[hdr]
+            msg[hdr] = Defaults.ADDED_HEADERS_CLIENT[hdr]
     # Optionally, remove some headers.
     if Defaults.PURGED_HEADERS:
        for hdr in Defaults.PURGED_HEADERS:
-           del message_headers[hdr]
+           del msg[hdr]
     # Create the custom headers.
     custom_headers = [ h for h in actions.keys()
                         if h not in ('from', 'envelope', 'resent-from') ]
@@ -279,15 +283,14 @@
     if Defaults.LOGFILE_OUTGOING:
         from TMDA import MessageLogger
         logger = MessageLogger.MessageLogger(Defaults.LOGFILE_OUTGOING,
-                                             message_headers,
+                                             msg,
                                              envsender = envelope_sender,
                                              envrecip = to_address,
-                                             msg_size = message_size,
+                                             msg_size = orig_msgout_size,
                                              action_msg = log_msg)
         logger.write()
     # Inject the message.
-    Util.sendmail(str(message_headers) + ''.join(nice_headers), message_body,
-                  to_address, envelope_sender)
+    Util.sendmail(msg.as_string(), to_address, envelope_sender)
 
 
 ######
@@ -300,13 +303,14 @@
     actions = None
     log_msg = None
 
-    if message_headers.has_key('resent-from'):
+    if msgout.has_key('resent-from'):
         # We must be resending (bouncing) the message.
-        (fullname, from_address) = message_headers.getaddr('resent-from')
+        fullname, from_address = email.Utils.parseaddr(msgout.get
+                                                       ('resent-from'))
         resending = 1
     else:
         # Use the existing From: header if possible.
-        (fullname, from_address) = message_headers.getaddr("from")
+        fullname, from_address = email.Utils.parseaddr(msgout.get('from'))
         resending = None
     if not fullname:
         fullname = Defaults.FULLNAME
@@ -325,44 +329,49 @@
         address_list = []
         if resending:
             # Use Resent-To, Resent-Cc, and Resent-Bcc addresses.
-            header_pairs = message_headers.getaddrlist('resent-to') + \
-                           message_headers.getaddrlist('resent-cc') + \
-                           message_headers.getaddrlist('resent-bcc')
+            resent_tos = msgout.get_all('resent-to', [])
+            resent_ccs = msgout.get_all('resent-cc', [])
+            resent_bccs = msgout.get_all('resent-bcc', [])
+            header_pairs = email.Utils.getaddresses(resent_tos +
+                                                    resent_ccs +
+                                                    resent_bccs)
         else:
             # Use To, Cc, Bcc, and Apparently-To addresses.
-            header_pairs = message_headers.getaddrlist('to') + \
-                           message_headers.getaddrlist('cc') + \
-                           message_headers.getaddrlist('bcc') + \
-                           message_headers.getaddrlist('apparently-to')
+            tos = msgout.get_all('to', [])
+            ccs = msgout.get_all('cc', [])
+            bccs = msgout.get_all('bcc', [])
+            apparently_tos = msgout.get_all('apparently-to', [])
+            header_pairs = email.Utils.getaddresses(tos + ccs +
+                                                    bccs + apparently_tos)
         for pair in header_pairs:
             address = pair[1]
             address_list.append(address)
 
     # Check for the `X-TMDA' override header.
-    if message_headers.has_key('x-tmda'):
+    if msgout.has_key('x-tmda'):
         x_tmda_over = 1
-        x_tmda = message_headers.getheader('x-tmda')
+        x_tmda = msgout.get('x-tmda')
         log_msg = '%s: %s' % ('X-TMDA', x_tmda)
         # X-TMDA should only have one field.
         if len(string.split(x_tmda)) == 1:
            actions = { 'from' : FilterParser.splitaction(x_tmda) }
         # Delete `X-TMDA' before sending.
-        del message_headers['x-tmda']
-    # Optionally, parse subject for `X-TMDA'.  e.g,
-    # Subject: X-TMDA dated Re: You're fired!
-    if (Defaults.X_TMDA_IN_SUBJECT and message_headers.has_key('subject') and
+        del msgout['x-tmda']
+    # Optionally, parse subject for `X-TMDA'.
+    if (Defaults.X_TMDA_IN_SUBJECT and msgout.has_key('subject') and
         x_tmda_over is None):
-        sub = message_headers.getheader('subject')
+        sub = msgout.get('subject')
         subsplit = sub.split(None, 2)
         if subsplit and subsplit[0].lower() == 'x-tmda':
             x_tmda_over = 1
             actions = { 'from' : FilterParser.splitaction(subsplit[1]) }
             log_msg = '%s: %s' % ('X-TMDA', subsplit[1])
             # Fixup Subject: before sending.
+            del msgout['Subject']
             if subsplit[2:]:
-                message_headers['Subject'] = subsplit[2:][0]
+                msgout['Subject'] = subsplit[2:][0]
             else:
-                message_headers['Subject'] = ''
+                msgout['Subject'] = ''
     # Without `X-TMDA', we need to parse the outgoing filter file.
     if x_tmda_over is None:
         outfilter = FilterParser.FilterParser()
@@ -391,8 +400,8 @@
                        address,
                        from_address,
                       fullname,
-                       message_headers,
-                       message_body,
+                       msgout,
+                       orig_msgout_body_as_raw_string,
                        actions,
                        log_msg)
     if qfilter:

Index: tmda-pending
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-pending,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- tmda-pending        21 Sep 2002 00:27:44 -0000      1.30
+++ tmda-pending        30 Sep 2002 23:45:54 -0000      1.31
@@ -141,11 +141,9 @@
     %(program)s -C -b -s | mail -s 'TMDA pending summary' jason
 """
 
-import cStringIO
 import getopt
 import glob
 import os
-import rfc822
 import sys
 import time
 
@@ -157,6 +155,8 @@
                            'site-packages', 'TMDA', 'pythonlib')
     sys.path.insert(0, sitedir)
 
+import email
+
 from TMDA import Version
 
 
@@ -273,29 +273,28 @@
     return Cookie.make_confirm_address(recipient, timestamp, pid, 'accept')
 
 
-def release(headers, body, msg):
+def release(msgobj, msg):
     """Release a message from the pending queue."""
     timestamp, pid, suffix = msg.split('.')
     # Remove Return-Path: to avoid duplicates.
-    return_path = headers.getaddr('return-path')[1]
-    del headers['return-path']
+    return_path = email.Utils.parseaddr(msgobj.get('return-path'))[1]
+    del msgobj['return-path']
     # Remove X-TMDA-Recipient:
-    recipient = headers.getheader('x-tmda-recipient')
-    del headers['x-tmda-recipient']
+    recipient = msgobj.get('x-tmda-recipient')
+    del msgobj['x-tmda-recipient']
     # To avoid a mail loop on re-injection, prepend an ``Old-'' prefix
     # to all existing Delivered-To lines.
-    if headers.has_key('delivered-to'):
-        headers.headers = map(lambda h: h.replace('Delivered-To:',
-                                                  'Old-Delivered-To:', 1),
-                              headers.headers)
+    Util.rename_headers(msgobj, 'Delivered-To', 'Old-Delivered-To')
     # Add an X-TMDA-Confirm-Done: field to the top of the header for
     # later verification.  This includes a timestamp, pid, and HMAC.
-    headers['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
-                                                                pid, 'done')
+    del msgobj['X-TMDA-Confirm-Done']
+    msgobj['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
+                                                               pid, 'done')
     # Add the date when confirmed in a header.
-    headers['X-TMDA-Released'] = Util.unixdate()
+    del msgobj['X-TMDA-Released']
+    msgobj['X-TMDA-Released'] = Util.unixdate()
     # Reinject the message to the original envelope recipient.
-    Util.sendmail(headers, body, recipient, return_path)
+    Util.sendmail(msgobj.as_string(), recipient, return_path)
 
 
 def main():
@@ -373,16 +372,14 @@
                     continue
                 else:
                     msgcache.insert(0, msg)
-            fp = cStringIO.StringIO(open(msg, 'r').read())
-            headers = rfc822.Message(fp)
-            body = fp.read()
-            msg_size = len(body)
+            msgobj = email.message_from_file(open(msg, 'r'))
+            msg_size = len(msgobj.as_string())
             bytes = 'bytes'
             if msg_size == 1:
                 bytes = bytes[:-1]
             recipient_address = command_recipient
             if not recipient_address:
-                recipient_address = headers.getheader('x-tmda-recipient')
+                recipient_address = msgobj.get('x-tmda-recipient')
             # Pass over the message if it lacks X-TMDA-Recipient and we
             # aren't using `-R'.
             if not recipient_address:
@@ -398,8 +395,7 @@
                 for hdr in ('date', 'from', 'to', 'subject'):
                     print "%s %s: %s" % ('  >>',
                                          hdr.capitalize()[:4].rjust(4),
-                                         Util.decode_header(headers.getheader
-                                                            (hdr, 'None')))
+                                         Util.decode_header(msgobj.get(hdr)))
                 if summary:
                     print '<mailto:%s>' % (confirm_accept_address
                                            (recipient_address, msg))
@@ -409,14 +405,15 @@
                 terse_hdrs = []
                 for hdr in Defaults.TERSE_SUMMARY_HEADERS:
                     if hdr in ('from_name', 'from_address'):
-                        from_name, from_address = headers.getaddr('from')
+                        from_name, from_address = email.Utils.parseaddr(msgobj.get
+                                                                        ('from'))
                         if hdr == 'from_name':
                             terse_hdrs.append(from_name
                                               or from_address or 'None')
                         elif hdr == 'from_address':
                             terse_hdrs.append(from_address or 'None')
                     else:
-                        terse_hdrs.append(headers.getheader(hdr, 'None'))
+                        terse_hdrs.append(msgobj.get(hdr))
                 terse_hdrs.insert(0, msg)
                 print '\t'.join([Util.decode_header(hdr) for hdr in terse_hdrs])
             if interactive:
@@ -459,12 +456,12 @@
                 cprint(verbose, '\n', message)
             if not pretend:
                 if dispose in ('release', 'delete', 'whitelist', 'blacklist'):
-                    return_path = headers.getaddr('return-path')[1]
+                    return_path = email.Utils.parseaddr(msgobj.get('return-path'))[1]
                 if dispose == 'release':
                     if Defaults.PENDING_RELEASE_APPEND:
                         Util.append_to_file(return_path,
                                             Defaults.PENDING_RELEASE_APPEND)
-                    release(headers, body, msg)
+                    release(msgobj, msg)
                 elif dispose == 'delete':
                     if Defaults.PENDING_DELETE_APPEND:
                         Util.append_to_file(return_path,

Index: tmda-rfilter
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-rfilter,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- tmda-rfilter        24 Sep 2002 04:19:24 -0000      1.67
+++ tmda-rfilter        30 Sep 2002 23:45:54 -0000      1.68
@@ -123,9 +123,9 @@
 from TMDA import Util
 
 
-import cStringIO
+from cStringIO import StringIO
+import email
 import fileinput
-import rfc822
 import string
 import time
 
@@ -142,17 +142,28 @@
 mta = MTA.init()
 
 # Read sys.stdin into a temporary variable for later access.
-stdin = cStringIO.StringIO(sys.stdin.read())
+stdin = StringIO(sys.stdin.read())
 
-# Collect the message headers.
-message_headers = rfc822.Message(stdin)
-# Collect the message body.
-message_body = stdin.read()
-
-# Collect the entire message.
-message = stdin.getvalue()
-# Calculate the message size.
-message_size = str(len(message_body))
+# The incoming message as an email.Message object.
+msgin = email.message_from_file(stdin)
+
+# Original message contents as a string.
+orig_msgin_as_string = msgin.as_string()
+
+# Original message headers as a string.
+orig_msgin_headers_as_string = Util.headers_as_string(msgin)
+
+# Original message headers as a raw string.
+orig_msgin_headers_as_raw_string = Util.headers_as_raw_string(msgin)
+
+# Original message body.
+orig_msgin_body = msgin.get_payload()
+
+# Original message body as a raw string.
+orig_msgin_body_as_raw_string = Util.body_as_raw_string(msgin)
+
+# Calculate the incoming message size.
+orig_msgin_size = len(orig_msgin_as_string)
 
 # Collect the three essential environment variables, and defer if they
 # are missing.
@@ -165,7 +176,8 @@
 # Use Defaults.RECIPIENT_HEADER instead if set.
 recipient_header = None
 if Defaults.RECIPIENT_HEADER:
-    recipient_header = message_headers.getaddr(Defaults.RECIPIENT_HEADER)[1]
+    recipient_header = email.Utils.parseaddr(msgin.get
+                                             (Defaults.RECIPIENT_HEADER))[1]
 envelope_recipient = (recipient_header or os.environ.get('RECIPIENT'))
 if envelope_recipient == None:
     raise Errors.MissingEnvironmentVariable('RECIPIENT')
@@ -237,7 +249,7 @@
                     break
 
 # Collect the message's Subject: for later use.
-subject = message_headers.getheader('subject', 'None')
+subject = msgin.get('subject')
 
 # The directory of pending messages.
 pendingdir = os.path.join(Defaults.DATADIR, 'pending')
@@ -257,10 +269,10 @@
             action_msg = '%s (no reply)' % action_msg
         from TMDA import MessageLogger
         logger = MessageLogger.MessageLogger(Defaults.LOGFILE_INCOMING,
-                                             message_headers,
+                                             msgin,
                                              envsender = envelope_sender,
                                              envrecip = recipient_address,
-                                             msg_size = message_size,
+                                             msg_size = orig_msgin_size,
                                              action_msg = action_msg)
         logger.write()
 
@@ -300,10 +312,10 @@
                     'List-Archive', 'Mailing-List', 'X-Mailing-List',
                     'X-Ml-Name']
     for hdr in list_headers:
-        if message_headers.has_key(hdr):
-            guilty_header = '%s: %s' % (hdr, message_headers.getheader(hdr))
+        if msgin.has_key(hdr):
+            guilty_header = '%s: %s' % (hdr, msgin.get(hdr))
     #   - header "Precedence:" value junk, bulk, or list
-    precedence = message_headers.getheader('precedence', None)
+    precedence = msgin.get('precedence')
     if precedence and \
            precedence.lower() in ('bulk', 'junk', 'list') and \
            guilty_header is None:
@@ -350,34 +362,32 @@
 def send_bounce(bounce_message, **vars):
     """Send a confirmation message back to the sender."""
     if autorespond_to_sender(envelope_sender) and auto_reply:
-        bounce_message = cStringIO.StringIO(bounce_message)
-        headers = rfc822.Message(bounce_message)
+        bounce_msg = email.message_from_string(bounce_message)
         # Add some headers.
         timesecs = time.time()
-        headers['Date'] = Util.make_date(timesecs)
-        headers['Message-ID'] = Util.make_msgid(timesecs)
+        bounce_msg['Date'] = Util.make_date(timesecs)
+        bounce_msg['Message-ID'] = Util.make_msgid(timesecs)
         # References
         refs = []
         for h in ['references', 'message-id']:
-            if message_headers.has_key(h):
-                refs = refs + message_headers.getheader(h).split()
+            if msgin.has_key(h):
+                refs = refs + msgin.get(h).split()
         if refs:
-            headers['References'] = '\n\t'.join(refs)
+            bounce_msg['References'] = '\n\t'.join(refs)
         # In-Reply-To
-        if message_headers.has_key('message-id'):
-            headers['In-Reply-To'] = (
-                message_headers.getheader('message-id'))
-        headers['To'] = envelope_sender
+        if msgin.has_key('message-id'):
+            bounce_msg['In-Reply-To'] =  msgin.get('message-id')
+        bounce_msg['To'] = envelope_sender
         if not vars.has_key('already_confirmed'):
-            headers['Reply-To'] = vars['confirm_accept_address']
-        headers['Precedence'] = 'bulk'
-        headers['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
+            bounce_msg['Reply-To'] = vars['confirm_accept_address']
+        bounce_msg['Precedence'] = 'bulk'
+        bounce_msg['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
         # Optionally, add some headers.
         if Defaults.ADDED_HEADERS_SERVER:
             for hdr in Defaults.ADDED_HEADERS_SERVER.keys():
-                headers[hdr] = Defaults.ADDED_HEADERS_SERVER[hdr]
-        body = bounce_message.read()
-        Util.sendmail(headers, body,
+                del bounce_msg[hdr]
+                bounce_msg[hdr] = Defaults.ADDED_HEADERS_SERVER[hdr]
+        Util.sendmail(bounce_msg.as_string(),
                       envelope_sender, Defaults.BOUNCE_ENV_SENDER)
         # Optionally, record this auto-response.
         if Defaults.MAX_AUTORESPONSES_PER_DAY != 0:
@@ -394,7 +404,7 @@
 
 def send_cc(address):
     """Send a 'carbon copy' of the message to address."""
-    Util.sendmail(message_headers, message_body, address, envelope_sender)
+    Util.sendmail(msgin.as_string(), address, envelope_sender)
     logit('CC ' + address)
 
 
@@ -409,7 +419,7 @@
         mta.stop()
     elif action in ('accept', 'deliver', 'ok'):
         logit('%s %s' % ('OK', logname))
-        mta.deliver(message_headers, message_body)
+        mta.deliver(msgin)
     elif action == 'hold':
         logit('%s %s' % ('HOLD', logname))
         bouncegen('hold')
@@ -418,28 +428,28 @@
         bouncegen('request')
 
 
-def release_pending(timestamp, pid, headers, body):
+def release_pending(timestamp, pid, msg):
     """Release a confirmed message from the pending queue."""
     # Remove Return-Path: to avoid duplicates.
-    return_path = headers.getaddr('return-path')[1]
-    del headers['return-path']
+    return_path = return_path = email.Utils.parseaddr(msg.get
+                                                      ('return-path'))[1]
+    del msg['return-path']
     # Remove X-TMDA-Recipient:
-    recipient = headers.getheader('x-tmda-recipient')
-    del headers['x-tmda-recipient']
+    recipient = msg.get('x-tmda-recipient')
+    del msg['x-tmda-recipient']
     # To avoid a mail loop on re-injection, prepend an ``Old-'' prefix
     # to all existing Delivered-To lines.
-    if headers.has_key('delivered-to'):
-        headers.headers = map(lambda h: h.replace('Delivered-To:',
-                                                  'Old-Delivered-To:', 1),
-                              headers.headers)
+    Util.rename_headers(msg, 'Delivered-To', 'Old-Delivered-To')
     # Add an X-TMDA-Confirm-Done: field to the top of the header for
     # later verification.  This includes a timestamp, pid, and HMAC.
-    headers['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
-                                                                pid, 'done')
+    del msg['X-TMDA-Confirm-Done']
+    msg['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
+                                                            pid, 'done')
     # Add the date when confirmed in a header.
-    headers['X-TMDA-Confirmed'] = Util.unixdate()
+    del msg['X-TMDA-Confirmed']
+    msg['X-TMDA-Confirmed'] = Util.unixdate()
     # Reinject the message to the original envelope recipient.
-    Util.sendmail(headers, body, recipient, return_path)
+    Util.sendmail(msg.as_string(), recipient, return_path)
     mta.stop()
 
 
@@ -484,13 +494,10 @@
         if Defaults.CONFIRM_ACCEPT_CC:
             send_cc(Defaults.CONFIRM_ACCEPT_CC)
         if os.path.exists(confirmed_file):
-            fp = open(confirmed_file, 'r')
-            headers = rfc822.Message(fp)
-            body = fp.read()
-            fp.close()
+            msg = email.message_from_file(open(confirmed_file, 'r'))
             # Optionally append the envelope sender to a file
             if Defaults.CONFIRM_APPEND:
-                return_path = headers.getaddr('return-path')[1]
+                return_path = email.Utils.parseaddr(msg.get('return-path'))[1]
                 if return_path is None:
                     raise IOError, \
                           confirmed_file + ' has no Return-Path header!'
@@ -521,7 +528,7 @@
                         break
             mta.stop()
         # Release the message for delivery if we get this far.
-        release_pending(confirm_timestamp, confirm_pid, headers, body)
+        release_pending(confirm_timestamp, confirm_pid, msg)
     # post-confirmation
     elif confirm_action == 'done':
         # Regenerate the HMAC for comparison.
@@ -537,9 +544,9 @@
             bouncegen('request')
         else:
             # Cache and deliver the message.
-            if message_headers.has_key('x-tmda-confirmed'):
+            if msgin.has_key('x-tmda-confirmed'):
                 msgval = 'c'
-            elif message_headers.has_key('x-tmda-released'):
+            elif msgin.has_key('x-tmda-released'):
                 msgval = 'r'
             # Record this message in the cache as a dictionary,
             # where the message filename is the key, and how it was
@@ -554,8 +561,8 @@
             # internally.  This won't work when delivering '_qok_',
             # since another program (qmail-local) is doing the actual
             # writing of the message.
-            del message_headers['x-tmda-confirm-done']
-            mta.deliver(message_headers, message_body)
+            del msgin['x-tmda-confirm-done']
+            mta.deliver(msgin)
 
 
 def verify_dated_cookie(dated_cookie):
@@ -577,7 +584,7 @@
         if int(cookie_date) >= int('%d' % time.time()):
             logit("OK good_dated_cookie (%s)" % \
                   Util.unixdate(int(cookie_date)))
-            mta.deliver(message_headers, message_body)
+            mta.deliver(msgin)
         else:
             logmsg = "action_expired_dated (%s)" % \
                      Util.unixdate(int(cookie_date))
@@ -591,7 +598,7 @@
     # Accept the message only if the HMAC can be verified.
     if (sender_cookie == sender_address_cookie):
         logit("OK good_sender_cookie")
-        mta.deliver(message_headers, message_body)
+        mta.deliver(msgin)
     else:
         defact = Defaults.ACTION_FAIL_SENDER.lower()
         bouncetext = Defaults.BOUNCE_TEXT_FAIL_SENDER
@@ -607,7 +614,7 @@
     # Accept the message only if the HMAC can be verified.
     if mac == newmac:
         logit("OK good_keyword_cookie \"" + keyword + "\"")
-        mta.deliver(message_headers, message_body)
+        mta.deliver(msgin)
     else:
         defact = Defaults.ACTION_FAIL_KEYWORD.lower()
         bouncetext = Defaults.BOUNCE_TEXT_FAIL_KEYWORD
@@ -620,9 +627,10 @@
     if not os.path.exists(pendingdir):
         os.makedirs(pendingdir, 0700) # stores the unconfirmed messages
     # X-TMDA-Recipient is used by release_pending().
-    message_headers['X-TMDA-Recipient'] = recipient_address
+    del msgin['X-TMDA-Recipient']
+    msgin['X-TMDA-Recipient'] = recipient_address
     # Write ~/.tmda/pending/TIMESTAMP.PID.msg
-    pending_contents = str(message_headers) + '\n' + message_body
+    pending_contents = msgin.as_string()
     Util.writefile(pending_contents,
                    os.path.join(pendingdir, pending_message))
     return pending_message
@@ -639,9 +647,9 @@
     recipient_local, recipient_domain = recipient_address.split('@', 1)
     envelope_sender = globals().get('envelope_sender')
     subject = globals().get('subject')
-    original_message_body = globals().get('message_body')
-    original_message_headers = globals().get('message_headers')
-    original_message_size = globals().get('message_size')
+    original_message_body = globals().get('orig_msgin_body_as_raw_string')
+    original_message_headers = globals().get('orig_msgin_headers_as_raw_string')
+    original_message_size = globals().get('orig_msgin_size')
     # Don't include message bodies over a certain size.
     if (Defaults.CONFIRM_MAX_MESSAGE_SIZE and
         (int(Defaults.CONFIRM_MAX_MESSAGE_SIZE) < int(original_message_size))):
@@ -649,7 +657,7 @@
                            % (original_message_headers,
                               Defaults.CONFIRM_MAX_MESSAGE_SIZE)
     else:
-        original_message = globals().get('message')
+        original_message = globals().get('orig_msgin_as_string')
     # Optional 'dated' address variables.
     if Defaults.DATED_TEMPLATE_VARS:
         dated_timeout = Util.format_timeout(Defaults.TIMEOUT)
@@ -723,15 +731,15 @@
     # The list of sender e-mail addresses comes from the envelope
     # sender, the "From:" header and the "Reply-To:" header.
     sender_list = [envelope_sender]
-    from_list = message_headers.getaddrlist("from")
-    replyto_list = message_headers.getaddrlist("reply-to")
-    for list in from_list,replyto_list:
+    from_list = email.Utils.getaddresses(msgin.get_all('from', []))
+    replyto_list = email.Utils.getaddresses(msgin.get_all('reply-to', []))
+    for list in from_list, replyto_list:
         for a in list:
             emaddy = a[1]
             sender_list.append(emaddy)
 
     # Process confirmation messages first.
-    confirm_done_hdr = message_headers.getheader('x-tmda-confirm-done', None)
+    confirm_done_hdr = msgin.get('x-tmda-confirm-done')
     if confirm_done_hdr:
         verify_confirm_cookie(confirm_done_hdr, 'done')
     if (cookie_type in Defaults.TAGS_CONFIRM) and cookie_value:
@@ -740,11 +748,11 @@
     # Parse the incoming filter file.
     infilter = FilterParser.FilterParser()
     infilter.read(Defaults.FILTER_INCOMING)
-    (actions,matching_line) = infilter.firstmatch(recipient_address,
-                                                  sender_list,
-                                                  message_body,
-                                                  str(message_headers),
-                                                  message_size)
+    (actions, matching_line) = infilter.firstmatch(recipient_address,
+                                                   sender_list,
+                                                   orig_msgin_body_as_raw_string,
+                                                   orig_msgin_headers_as_raw_string,
+                                                   orig_msgin_size)
     (action, option) = actions.get('incoming', (None, None))
     # Dispose of the message now if there was a filter file match.
     # Log the action along with and the matching line in the filter
@@ -762,10 +770,10 @@
     elif action in ('accept','deliver','ok'):
         if option:
             logit('%s (%s)' % ('DELIVER', matching_line + '=' + option))
-            mta.deliver(message_headers, message_body, option)
+            mta.deliver(msgin, option)
         else:
             logit('%s (%s)' % ('OK', matching_line))
-            mta.deliver(message_headers, message_body)
+            mta.deliver(msgin)
     elif action == 'confirm':
         logit('%s (%s)' % ('CONFIRM', matching_line))
         bouncegen('request')
@@ -784,7 +792,7 @@
     elif (cookie_type in map(lambda s: s.lower(), Defaults.TAGS_SENDER)) \
              and cookie_value:
         sender_address = globals().get('envelope_sender')
-        verify_sender_cookie(sender_address,cookie_value)
+        verify_sender_cookie(sender_address, cookie_value)
     # Keyword tag?
     elif (cookie_type in map(lambda s: s.lower(), Defaults.TAGS_KEYWORD)) \
              and cookie_value:

_______________________________________
tmda-cvs mailing list
http://tmda.net/lists/listinfo/tmda-cvs

Reply via email to