aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Mailman/Gui/GUIBase.py5
-rw-r--r--Mailman/Gui/Privacy.py7
-rwxr-xr-xMailman/MailList.py28
3 files changed, 33 insertions, 7 deletions
diff --git a/Mailman/Gui/GUIBase.py b/Mailman/Gui/GUIBase.py
index 9a8b68fb..32d19929 100644
--- a/Mailman/Gui/GUIBase.py
+++ b/Mailman/Gui/GUIBase.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2008 by the Free Software Foundation, Inc.
+# Copyright (C) 2002-2015 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
@@ -80,7 +80,8 @@ class GUIBase:
except re.error:
bad_addrs.append(addr)
elif (wtype == mm_cfg.EmailListEx and addr.startswith('@')
- and property.endswith('_these_nonmembers')):
+ and (property.endswith('_these_nonmembers') or
+ property == 'subscribe_auto_approval')):
# XXX Needs to be reviewed for list@domain names.
# don't reference your own list
if addr[1:] == mlist.internal_name():
diff --git a/Mailman/Gui/Privacy.py b/Mailman/Gui/Privacy.py
index e6a2fd82..3af5d8ef 100644
--- a/Mailman/Gui/Privacy.py
+++ b/Mailman/Gui/Privacy.py
@@ -117,10 +117,13 @@ class Privacy(GUIBase):
_("""List of addresses (or regexps) whose subscriptions do not
require approval."""),
- _("""When subscription requires approval, addresses in this list
+ (_("""When subscription requires approval, addresses in this list
are allowed to subscribe without administrator approval. Add
addresses one per line. You may begin a line with a ^ character
- to designate a (case insensitive) regular expression match.""")),
+ to designate a (case insensitive) regular expression match.""")
+ + ' ' +
+ _("""You may also use the @listname notation to designate the
+ members of another list in this installation."""))),
('unsubscribe_policy', mm_cfg.Radio, (_('No'), _('Yes')), 0,
_("""Is the list moderator's approval required for unsubscription
diff --git a/Mailman/MailList.py b/Mailman/MailList.py
index c317c32e..6404666a 100755
--- a/Mailman/MailList.py
+++ b/Mailman/MailList.py
@@ -1568,16 +1568,17 @@ bad regexp in bounce_matching_header line: %s
def HasAutoApprovedSender(self, sender):
"""Returns True and logs if sender matches address or pattern
- in subscribe_auto_approval. Otherwise returns False.
+ or is a member of a referenced list in subscribe_auto_approval.
+ Otherwise returns False.
"""
auto_approve = False
- if self.GetPattern(sender, self.subscribe_auto_approval):
+ if self.GetPattern(sender, self.subscribe_auto_approval, at_list=True):
auto_approve = True
syslog('vette', '%s: auto approved subscribe from %s',
self.internal_name(), sender)
return auto_approve
- def GetPattern(self, email, pattern_list):
+ def GetPattern(self, email, pattern_list, at_list=False):
"""Returns matched entry in pattern_list if email matches.
Otherwise returns None.
"""
@@ -1592,6 +1593,27 @@ bad regexp in bounce_matching_header line: %s
except re.error:
# BAW: we should probably remove this pattern
pass
+ elif at_list and pattern.startswith('@'):
+ # XXX Needs to be reviewed for list@domain names.
+ # this refers to the members of another list in this
+ # installation.
+ mname = pattern[1:].lower().strip()
+ if mname == self.internal_name():
+ # don't reference your own list
+ syslog('error',
+ 'subscribe_auto_approval in %s references own list',
+ self.internal_name())
+ continue
+ try:
+ mother = MailList(mname, lock = False)
+ except Errors.MMUnknownListError:
+ syslog('error',
+ 'subscribe_auto_approval in %s references non-existent list %s',
+ self.internal_name(), mname)
+ continue
+ if mother.isMember(email.lower()):
+ matched = pattern
+ break
else:
# Do the comparison case insensitively
if pattern.lower() == email.lower():