diff options
-rw-r--r-- | Mailman/Gui/GUIBase.py | 16 | ||||
-rw-r--r-- | Mailman/Handlers/CalcRecips.py | 16 | ||||
-rw-r--r-- | Mailman/Handlers/Moderate.py | 30 |
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 |