aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mailman/Gui/GUIBase.py16
-rw-r--r--Mailman/Handlers/CalcRecips.py16
-rw-r--r--Mailman/Handlers/Moderate.py30
3 files changed, 44 insertions, 18 deletions
diff --git a/Mailman/Gui/GUIBase.py b/Mailman/Gui/GUIBase.py
index b27542ed..19714e1c 100644
--- a/Mailman/Gui/GUIBase.py
+++ b/Mailman/Gui/GUIBase.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2007 by the Free Software Foundation, Inc.
+# Copyright (C) 2002-2008 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
@@ -78,12 +78,20 @@ class GUIBase:
re.compile(addr)
except re.error:
raise ValueError
- elif wtype == mm_cfg.EmailListEx and addr.startswith('@'):
+ elif (wtype == mm_cfg.EmailListEx and addr.startswith('@')
+ and property.endswith('_these_nonmembers')):
# XXX Needs to be reviewed for list@domain names.
- # check for existence of list?
- pass
+ # don't reference your own list
+ if addr[1:] == mlist.internal_name():
+ raise ValueError
+ # check for existence of list? For now allow
+ # reference to list before creating it.
else:
raise
+ if property in ('regular_exclude_lists',
+ 'regular_include_lists'):
+ if addr.lower() == mlist.GetListEmail().lower():
+ raise Errors.EmailAddressError
addrs.append(addr)
return addrs
# This is a host name, i.e. verbatim
diff --git a/Mailman/Handlers/CalcRecips.py b/Mailman/Handlers/CalcRecips.py
index 66c16f86..db10c432 100644
--- a/Mailman/Handlers/CalcRecips.py
+++ b/Mailman/Handlers/CalcRecips.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2007 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2008 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
@@ -159,11 +159,16 @@ def do_exclude(mlist, msg, msgdata, recips):
recips = set(recips)
destinations = email.Utils.getaddresses(msg.get_all('to', []) +
msg.get_all('cc', []))
- destinations = [y for x,y in destinations]
+ destinations = [y.lower() for x,y in destinations]
for listname in mlist.regular_exclude_lists:
+ listname = listname.lower()
if listname not in destinations:
continue
listlhs, hostname = listname.split('@')
+ if listlhs == mlist.internal_name():
+ syslog('error', 'Exclude list %s is a self reference.',
+ listname)
+ continue
try:
slist = MailList(listlhs, lock=False)
except MMUnknownListError:
@@ -190,11 +195,16 @@ def do_include(mlist, msg, msgdata, recips):
recips = set(recips)
destinations = email.Utils.getaddresses(msg.get_all('to', []) +
msg.get_all('cc', []))
- destinations = [y for x,y in destinations]
+ destinations = [y.lower() for x,y in destinations]
for listname in mlist.regular_include_lists:
+ listname = listname.lower()
if listname in destinations:
continue
listlhs, hostname = listname.split('@')
+ if listlhs == mlist.internal_name():
+ syslog('error', 'Include list %s is a self reference.',
+ listname)
+ continue
try:
slist = MailList(listlhs, lock=False)
except MMUnknownListError:
diff --git a/Mailman/Handlers/Moderate.py b/Mailman/Handlers/Moderate.py
index ff99c8fd..a362d960 100644
--- a/Mailman/Handlers/Moderate.py
+++ b/Mailman/Handlers/Moderate.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2008 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
@@ -89,15 +89,16 @@ def process(mlist, msg, msgdata):
else:
sender = msg.get_sender()
# From here on out, we're dealing with non-members.
- if matches_p(sender, mlist.accept_these_nonmembers):
+ listname = mlist.internal_name()
+ if matches_p(sender, mlist.accept_these_nonmembers, listname):
return
- if matches_p(sender, mlist.hold_these_nonmembers):
+ if matches_p(sender, mlist.hold_these_nonmembers, listname):
Hold.hold_for_approval(mlist, msg, msgdata, Hold.NonMemberPost)
# No return
- if matches_p(sender, mlist.reject_these_nonmembers):
+ if matches_p(sender, mlist.reject_these_nonmembers, listname):
do_reject(mlist)
# No return
- if matches_p(sender, mlist.discard_these_nonmembers):
+ if matches_p(sender, mlist.discard_these_nonmembers, listname):
do_discard(mlist, msg)
# No return
# Okay, so the sender wasn't specified explicitly by any of the non-member
@@ -116,7 +117,7 @@ def process(mlist, msg, msgdata):
-def matches_p(sender, nonmembers):
+def matches_p(sender, nonmembers, listname):
# First strip out all the regular expressions and listnames
plainaddrs = [addr for addr in nonmembers if not (addr.startswith('^')
or addr.startswith('@'))]
@@ -135,12 +136,19 @@ def matches_p(sender, nonmembers):
elif are.startswith('@'):
# XXX Needs to be reviewed for list@domain names.
try:
- mother = MailList(are[1:], lock=0)
- if mother.isMember(sender):
- return 1
+ if are[1:] == listname:
+ # don't reference your own list
+ syslog('error',
+ '*_these_nonmembers in %s references own list',
+ listname)
+ else:
+ mother = MailList(are[1:], lock=0)
+ if mother.isMember(sender):
+ return 1
except Errors.MMUnknownListError:
- syslog('error', 'filter references non-existent list %s',
- are[1:])
+ syslog('error',
+ '*_these_nonmembers in %s references non-existent list %s',
+ listname, are[1:])
return 0