summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwarsaw2000-09-22 04:28:20 +0000
committerbwarsaw2000-09-22 04:28:20 +0000
commit01e4902eef4f1b8a78886159eb14dd9683c571cf (patch)
treee722d8fa8488cd78d2beb57c211f0fa4f6512c83
parent3471f9c117968f902aa6f42465a2d32b20dca1d0 (diff)
downloadmailman-01e4902eef4f1b8a78886159eb14dd9683c571cf.tar.gz
mailman-01e4902eef4f1b8a78886159eb14dd9683c571cf.tar.zst
mailman-01e4902eef4f1b8a78886159eb14dd9683c571cf.zip
do_child(): Use a slightly different algorithm for munging the
Message-ID: header in posted messages. We define a machine parsable format containing the listname and the hostname, and if these match our list's name and hostname, we do not munge the header. This continues to allow crossposting to multiple gated mailing lists, but should break loops involving the nntpd in the most common case. Thanks to Jim Tittsler for pointing out the problem.
-rw-r--r--Mailman/Handlers/ToUsenet.py31
1 files changed, 26 insertions, 5 deletions
diff --git a/Mailman/Handlers/ToUsenet.py b/Mailman/Handlers/ToUsenet.py
index ec84849c6..a1ebbbaab 100644
--- a/Mailman/Handlers/ToUsenet.py
+++ b/Mailman/Handlers/ToUsenet.py
@@ -101,11 +101,32 @@ def do_child(mlist, msg):
else:
# Newsgroups: isn't in the message
msg.headers.append('Newsgroups: %s\n' % mlist.linked_newsgroup)
- # Note: Need to be sure 2 messages aren't ever sent to the same
- # list in the same process, since message ID's need to be unique.
- # Could make the ID be mm.listname.postnum instead if that happens
- msg['Message-ID'] = '<mailman.%s.%s@%s>\n' % (
- time.time(), os.getpid(), mlist.host_name)
+ #
+ # Note: We need to be sure two messages aren't ever sent to the same list
+ # in the same process, since message ids need to be unique. Further, if
+ # messages are crossposted to two Usenet-gated mailing lists, they each
+ # need to have unique message ids or the nntpd will only accept one of
+ # them. The solution here is to substitute any existing message-id that
+ # isn't ours with one of ours, so we need to parse it to be sure we're not
+ # looping.
+ #
+ # Our Message-ID format is <mailman.secs.pid.listname@hostname>
+ msgid = msg.get('message-id')
+ hackmsgid = 1
+ if msgid:
+ mo = re.search(
+ msgid,
+ r'<mailman.\d+.\d+.(?P<listname>[^@]+)@(?P<hostname>[^>]+)>')
+ if mo:
+ lname, hname = mo.group('listname', 'hostname')
+ if lname == mlist.internal_name() and hname == mlist.host_name:
+ hackmsgid = 0
+ if hackmsgid:
+ del msg['message-id']
+ msg['Message-ID'] = '<mailman.%d.%d.%s@%s>' % (
+ time.time(), os.getpid(), mlist.internal_name(), mlist.host_name)
+ #
+ # Lines: is useful
if msg.getheader('Lines') is None:
msg.headers.append('Lines: %s\n' %
len(string.split(msg.body,"\n")))