summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwarsaw2000-06-15 20:54:54 +0000
committerbwarsaw2000-06-15 20:54:54 +0000
commitea71c4eb22b5f02f38a83627fbb0cf4d2aeb034f (patch)
treeb274bca3cf50bffa037e037385b927a72d21860b
parente0924e960217ec856947fe89fcb15bc8f52e5eaf (diff)
downloadmailman-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.py84
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()