diff options
| author | bwarsaw | 2000-06-15 20:54:54 +0000 |
|---|---|---|
| committer | bwarsaw | 2000-06-15 20:54:54 +0000 |
| commit | ea71c4eb22b5f02f38a83627fbb0cf4d2aeb034f (patch) | |
| tree | b274bca3cf50bffa037e037385b927a72d21860b | |
| parent | e0924e960217ec856947fe89fcb15bc8f52e5eaf (diff) | |
| download | mailman-ea71c4eb22b5f02f38a83627fbb0cf4d2aeb034f.tar.gz mailman-ea71c4eb22b5f02f38a83627fbb0cf4d2aeb034f.tar.zst mailman-ea71c4eb22b5f02f38a83627fbb0cf4d2aeb034f.zip | |
HandleRequest(): Takes three new additional arguments, `preserve',
`forward', and `addr' which are passed in from admindb.py. These
are only useful for held postings, and are only passed on to
__handlepost().
preserve is a flag that says whether the held message should be copied
to the `spam' directory or not.
forward is a flag which says that the message should be forwarded on
to an addition email address, which is contained in the addr
parameter. Both most be set for forwarding to occur.
Finally, HandleRequest() only deletes the database entry if the status
of the sub-method is true. This is to support the new `deferred' flag
for held postings.
__handlepost(): Takes the three new parameters as described above.
Uses shutil to do the `preserve' copy, and HandlerAPI.DeliverToUser()
to do the forwarding (after inserting a `Resent-To' header).
| -rw-r--r-- | Mailman/ListAdmin.py | 84 |
1 files changed, 60 insertions, 24 deletions
diff --git a/Mailman/ListAdmin.py b/Mailman/ListAdmin.py index f1cf0d59d..0f2b9d5d7 100644 --- a/Mailman/ListAdmin.py +++ b/Mailman/ListAdmin.py @@ -28,7 +28,7 @@ import os import string import time import marshal -from errno import ENOENT +import errno from Mailman import Message from Mailman import mm_cfg @@ -63,11 +63,9 @@ class ListAdmin: fp = open(self.__filename) self.__db = marshal.load(fp) fp.close() - except IOError, (code, msg): - if code == ENOENT: - self.__db = {} - else: - raise + except IOError, e: + if e.errno <> errno.ENOENT: raise + self.__db = {} def __closedb(self): if self.__db is not None: @@ -118,15 +116,17 @@ class ListAdmin: type, data = self.__db[id] return type - def HandleRequest(self, id, value, comment): + def HandleRequest(self, id, value, comment, preserve, forward, addr): self.__opendb() rtype, data = self.__db[id] - del self.__db[id] if rtype == HELDMSG: - self.__handlepost(data, value, comment) + status = self.__handlepost(data, value, comment, preserve, + forward, addr) else: assert rtype == SUBSCRIPTION - self.__handlesubscription(data, value, comment) + status = self.__handlesubscription(data, value, comment) + if status: + del self.__db[id] def HoldMessage(self, msg, reason, msgdata={}): # assure that the database is open for writing @@ -160,7 +160,7 @@ class ListAdmin: data = time.time(), sender, msgsubject, reason, filename, msgdata self.__db[id] = (HELDMSG, data) - def __handlepost(self, record, value, comment): + def __handlepost(self, record, value, comment, preserve, forward, addr): # For backwards compatibility with pre 2.0beta3 if len(record) == 5: ptime, sender, subject, reason, filename = record @@ -169,12 +169,30 @@ class ListAdmin: # New format of record ptime, sender, subject, reason, filename, msgdata = record path = os.path.join(mm_cfg.DATA_DIR, filename) + # Handle message preservation + if preserve: + parts = string.split(os.path.split(path)[1], '-') + parts[0] = 'spam' + spamfile = string.join(parts, '-') + import shutil + try: + shutil.copy(path, os.path.join(mm_cfg.SPAM_DIR, spamfile)) + except IOError, e: + if e.errno <> errno.ENOENT: raise + raise Errors.LostHeldMessage(path) + # Now handle updates to the database rejection = None + msg = None + defer = None if value == 0: + # Defer + defer = 1 + elif value == 1: # Approved try: fp = open(path) - except IOError: + except IOError, e: + if e.errno <> errno.ENOENT: raise # we lost the message text file. clean up our housekeeping # and raise an exception. raise Errors.LostHeldMessage(path) @@ -185,19 +203,36 @@ class ListAdmin: # turnaround. syslog('vette', 'approved held message enqueued: %s' % filename) msg.Enqueue(self, newdata=msgdata) - elif value == 1: + elif value == 2: # Rejected rejection = 'Refused' self.__refuse('Posting of your message titled "%s"' % subject, sender, comment or '[No reason given]') else: - assert value == 2 + assert value == 3 # Discarded rejection = 'Discarded' - # Log the rejection + # + # Forward the message + if forward and addr: + if not msg: + try: + fp = open(path) + except IOError, e: + if e.errno <> errno.ENOENT: raise + raise Errors.LostHeldMessage(path) + msg = Message.Message(fp) + # We don't want this message getting delivered to the list twice. + # This should also uniquify the message enough for the hash-based + # file naming (not foolproof though). + msg['Resent-To'] = addr + msg.recips = addr + HandlerAPI.DeliverToUser(self, msg) + # for safety def strquote(s): return string.replace(s, '%', '%%') - + # + # Log the rejection if rejection: note = '''%(listname)s: %(rejection)s posting: \tFrom: %(sender)s @@ -210,16 +245,17 @@ class ListAdmin: if comment: note = note + '\n\tReason: ' + strquote(comment) syslog('vette', note) - # always unlink the file containing the message text. It's not + # Always unlink the file containing the message text. It's not # necessary anymore, regardless of the disposition of the message. - try: - os.unlink(path) - except os.error, (code, msg): - if code == ENOENT: - # we lost the message text file. clean up our housekeeping + if not defer: + try: + os.unlink(path) + except OSError, e: + if e.errno <> errno.ENOENT: raise + # We lost the message text file. Clean up our housekeeping # and raise an exception. raise Errors.LostHeldMessage(path) - raise + return not defer def HoldSubscription(self, addr, password, digest): # assure that the database is open for writing @@ -269,7 +305,7 @@ class ListAdmin: # subscribe assert value == 0 self.ApprovedAddMember(addr, password, digest) - + return 1 def __refuse(self, request, recip, comment, origmsg=None): adminaddr = self.GetAdminEmail() |
