summaryrefslogtreecommitdiff
path: root/Mailman/Queue/CommandRunner.py
diff options
context:
space:
mode:
authorbwarsaw2001-02-28 17:23:42 +0000
committerbwarsaw2001-02-28 17:23:42 +0000
commit8ffb013c69e7c3ccffffa11dcda55395263c79e0 (patch)
tree41a8138308781fc8d91f93f2a5978768388cea58 /Mailman/Queue/CommandRunner.py
parent2885db8638f285e702b160ff6e94e1d7d421d73c (diff)
downloadmailman-8ffb013c69e7c3ccffffa11dcda55395263c79e0.tar.gz
mailman-8ffb013c69e7c3ccffffa11dcda55395263c79e0.tar.zst
mailman-8ffb013c69e7c3ccffffa11dcda55395263c79e0.zip
Diffstat (limited to 'Mailman/Queue/CommandRunner.py')
-rw-r--r--Mailman/Queue/CommandRunner.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/Mailman/Queue/CommandRunner.py b/Mailman/Queue/CommandRunner.py
new file mode 100644
index 000000000..840c4d3a3
--- /dev/null
+++ b/Mailman/Queue/CommandRunner.py
@@ -0,0 +1,123 @@
+# Copyright (C) 1998,1999,2000,2001 by the Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+"""Bounce and command queue runner."""
+
+# See the delivery diagram in IncomingRunner.py. This module handles all
+# email destined for mylist-owner, mylist-admin, and mylist-request.
+
+
+
+from Mailman import mm_cfg
+from Mailman.Bouncers import BouncerAPI
+
+from Mailman.Queue.Runner import Runner
+from Mailman.Queue.sbcache import get_switchboard
+from Mailman.Logging.Syslog import syslog
+
+
+
+class CommandRunner(Runner):
+ def __init__(self, slice=None, numslices=1, cachelists=1):
+ Runner.__init__(self, mm_cfg.CMDQUEUE_DIR,
+ slice, numslices, cachelists)
+
+ def _dispose(self, mlist, msg, msgdata):
+ # BAW: Not all the functions of this qrunner require the list to be
+ # locked. Still, it's more convenient to lock it here and now and
+ # deal with lock failures in one place.
+ try:
+ mlist.Lock(timeout=mm_cfg.LIST_LOCK_TIMEOUT)
+ except LockFile.TimeOutError:
+ # Oh well, try again later
+ return 1
+ #
+ # runner specific code
+ try:
+ # The message may be destined to one of three list related
+ # recipients (note that posts to the list membership are handled
+ # by the IncomingRunner via the qfiles/in queue):
+ #
+ # <list>-admin -- all errors are directed to this address, which
+ # performs bounce processing. If the bounce processor fails to
+ # detect a bounce, the message is forwarded on to the <list>-owner
+ # address.
+ #
+ # <list>-owner -- this message is directed to the human operators
+ # of the list. No bounce processing is performed, and the message
+ # is forwarded to the list owners. However, it is possible that
+ # there are bogus addresses in the list owners, so if <list>-owner
+ # appears to get a message from a "likely bounce sender" then it
+ # simply discards the message. BAW: should it save it some place?
+ #
+ # <list>-request -- this message is an emailed command, sent to
+ # the command robot. Pass it on to the command handler.
+ #
+ # Note that which of these subsystems the message is destined for
+ # is determined by message metadata, as assigned by the front-end
+ # mail filter scripts. I've thought about adding additional
+ # subsystems such as <list>-subscribe and <list>-unsubscribe as
+ # shorthands for getting on and off the list.
+ #
+ # See the diagram in IncomingRunner.py for more information.
+ if msgdata.get('toadmin'):
+ if mlist.bounce_processing:
+ if BouncerAPI.ScanMessages(mlist, msg):
+ return
+ # Either bounce processing isn't turned on or the bounce
+ # detector found no recognizable bounce format in the message.
+ # In either case, forward the dang thing off to the list
+ # owners. Be sure to munge the headers so that any bounces
+ # from the list owners goes to the -owner address instead of
+ # the -admin address. This will avoid bounce loops.
+ virginq = get_switchboard(mm_cfg.VIRGINQUEUE_DIR)
+ virginq.enqueue(msg, msgdata,
+ recips = mlist.owner[:],
+ errorsto = mlist.GetOwnerEmail(),
+ noack = 0 # enable Replybot
+ )
+ return
+ elif msgdata.get('toowner'):
+ # The message could have been a bounce from a broken list
+ # owner address. About the only other test we can do is to
+ # see if the message is appearing to come from a well-known
+ # MTA generated address.
+ sender = msg.get_sender()
+ i = sender.find('@')
+ if i >= 0:
+ senderlhs = sender[:i].lower()
+ else:
+ senderlhs = sender
+ if senderlhs in mm_cfg.LIKELY_BOUNCE_SENDERS:
+ syslog('error', 'bounce loop detected from: %s' % sender)
+ return
+ # Any messages to the owner address must have Errors-To: set
+ # back to the owners address so bounce loops can be broken, as
+ # per the code above.
+ virginq = get_switchboard(mm_cfg.VIRGINQUEUE_DIR)
+ virginq.enqueue(msg, msgdata,
+ recips = mlist.owner,
+ errorsto = mlist.GetOwnerEmail(),
+ noack = 0 # enable Replybot
+ )
+ return
+ elif msgdata.get('torequest'):
+ # Just pass the message off the command handler
+ mlist.ParseMailCommands(msg)
+ return
+ finally:
+ mlist.Save()
+ mlist.Unlock()