summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAditya2016-04-22 18:17:43 +0530
committerBarry Warsaw2016-05-03 15:49:43 -0400
commit9c6ab1fdfe20dd852157120c939ceec52398834c (patch)
treea1c29c4e7e03744f2e8860aed2489291708d85f7 /src
parentf0e2b8b42c47c1447d5677e1e77f38b0d409c652 (diff)
downloadmailman-9c6ab1fdfe20dd852157120c939ceec52398834c.tar.gz
mailman-9c6ab1fdfe20dd852157120c939ceec52398834c.tar.zst
mailman-9c6ab1fdfe20dd852157120c939ceec52398834c.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/rules/moderation.py34
-rw-r--r--src/mailman/rules/tests/test_moderation.py61
2 files changed, 54 insertions, 41 deletions
diff --git a/src/mailman/rules/moderation.py b/src/mailman/rules/moderation.py
index d0852f2b2..355118857 100644
--- a/src/mailman/rules/moderation.py
+++ b/src/mailman/rules/moderation.py
@@ -42,12 +42,13 @@ class MemberModeration:
def check(self, mlist, msg, msgdata):
"""See `IRule`."""
user_manager = getUtility(IUserManager)
+ # The MemberModeration rule is unconditionally false if any of
+ # the senders are banned.
for sender in msg.senders:
- # The member-moderation rule is not set if the address is banned,
- # even if it is linked to a subscribed addresses.
if IBanManager(mlist).is_banned(sender):
return False
- # Check for subscribed members linked to the address
+ for sender in msg.senders:
+ # Check for subscribed members linked to the address.
member = mlist.members.get_member(sender)
if member is None:
user = user_manager.get_user(sender)
@@ -55,7 +56,6 @@ class MemberModeration:
for address in user.addresses:
if mlist.members.get_member(address.email) is not None:
member = mlist.members.get_member(address.email)
- break
if member is None:
return False
action = (mlist.default_member_action
@@ -95,38 +95,36 @@ class NonmemberModeration:
def check(self, mlist, msg, msgdata):
"""See `IRule`."""
user_manager = getUtility(IUserManager)
+ # Initial check. If any of the senders are banned, we bail.
+ for sender in msg.senders:
+ if IBanManager(mlist).is_banned(sender):
+ return False
# First ensure that all senders are already either members or
# nonmembers. If they are not subscribed in some role to the mailing
# list, make them nonmembers.
- # Maintain a record of which senders have linked subscribed users
- found_linked_membership = {}
+ # Maintain a record of which senders have linked subscribed users.
+ found_linked_membership = set()
for sender in msg.senders:
- found_linked_membership[sender] = 'False'
- # Check for linked user membership
member = mlist.members.get_member(sender)
if member is not None:
- found_linked_membership[sender] = 'True'
+ found_linked_membership.add(sender)
else:
user = user_manager.get_user(sender)
if user is not None:
for address in user.addresses:
if mlist.members.get_member(address.email) is not None:
- found_linked_membership[sender] = 'True'
- # If the posting addres is banned, the post is not allowed
- # to pass even if the address is linked to subscribed user.
- if IBanManager(mlist).is_banned(sender):
- found_linked_membership[sender] = 'False'
+ found_linked_membership.add(sender)
if (mlist.nonmembers.get_member(sender) is None and
- found_linked_membership.get(sender) == 'False'):
+ sender not in found_linked_membership):
# The address is neither a member nor nonmember
- # and has no linked subscribed user
+ # and has no linked subscribed user.
address = user_manager.get_address(sender)
assert address is not None, (
'Posting address is not registered: {}'.format(sender))
mlist.subscribe(address, MemberRole.nonmember)
- # If a member is found, the member-moderation rule takes precedence.
+ # If a membership is found, the MemberModeration rule takes precedence.
for sender in msg.senders:
- if found_linked_membership.get(sender) == 'True':
+ if sender in found_linked_membership:
return False
# Do nonmember moderation check.
for sender in msg.senders:
diff --git a/src/mailman/rules/tests/test_moderation.py b/src/mailman/rules/tests/test_moderation.py
index 3ff18cd2e..7da07b200 100644
--- a/src/mailman/rules/tests/test_moderation.py
+++ b/src/mailman/rules/tests/test_moderation.py
@@ -211,16 +211,14 @@ A message body.
self.assertEqual(msgdata.get('moderation_action'), 'hold')
def test_linked_address_nonmembermoderation(self):
- self._mlist.default_member_action = Action.accept
- self._mlist.default_nonmember_action = Action.hold
user_manager = getUtility(IUserManager)
- kane = user_manager.create_user('kane@example.com')
- set_preferred(kane)
- self._mlist.subscribe(kane, MemberRole.member)
- kane.link(user_manager.create_address('kane2@example.com'))
+ anne = user_manager.create_user('anne@example.com')
+ set_preferred(anne)
+ self._mlist.subscribe(anne, MemberRole.member)
+ anne.link(user_manager.create_address('anne2@example.com'))
rule = moderation.NonmemberModeration()
msg = mfs("""\
-From: kane2@example.com
+From: anne2@example.com
To: test@example.com
Subject: A test message
Message-ID: <ant>
@@ -236,15 +234,14 @@ A message body.
def test_linked_address_membermoderation(self):
self._mlist.default_member_action = Action.accept
- self._mlist.default_nonmember_action = Action.hold
user_manager = getUtility(IUserManager)
- kane = user_manager.create_user('kane@example.com')
- set_preferred(kane)
- self._mlist.subscribe(kane, MemberRole.member)
- kane.link(user_manager.create_address('kane2@example.com'))
+ anne = user_manager.create_user('anne@example.com')
+ set_preferred(anne)
+ self._mlist.subscribe(anne, MemberRole.member)
+ anne.link(user_manager.create_address('anne2@example.com'))
rule = moderation.MemberModeration()
msg = mfs("""\
-From: kane2@example.com
+From: anne2@example.com
To: test@example.com
Subject: A test message
Message-ID: <ant>
@@ -258,18 +255,16 @@ A message body.
result = rule.check(self._mlist, msg, msgdata)
self.assertTrue(result)
- def test_banned_address_linked_to_user_moderation(self):
- self._mlist.default_member_action = Action.accept
- self._mlist.default_nonmember_action = Action.hold
+ def test_banned_address_linked_to_user(self):
user_manager = getUtility(IUserManager)
- kane = user_manager.create_user('kane@example.com')
- set_preferred(kane)
- self._mlist.subscribe(kane, MemberRole.member)
- kane.link(user_manager.create_address('kane2@example.com'))
- IBanManager(self._mlist).ban('kane2@example.com')
+ anne = user_manager.create_user('anne@example.com')
+ set_preferred(anne)
+ self._mlist.subscribe(anne, MemberRole.member)
+ anne.link(user_manager.create_address('anne2@example.com'))
+ IBanManager(self._mlist).ban('anne2@example.com')
rule = moderation.MemberModeration()
msg = mfs("""\
-From: kane2@example.com
+From: anne2@example.com
To: test@example.com
Subject: A test message
Message-ID: <ant>
@@ -282,4 +277,24 @@ A message body.
self.assertFalse(result)
rule = moderation.NonmemberModeration()
result = rule.check(self._mlist, msg, msgdata)
- self.assertTrue(result)
+ self.assertFalse(result)
+
+ def test_banned_sender_among_multiple_senders(self):
+ user_manager = getUtility(IUserManager)
+ user_manager.create_address('ted@example.com')
+ user_manager.create_address('cris@example.com')
+ IBanManager(self._mlist).ban('cris@example.com')
+ rule = moderation.NonmemberModeration()
+ msg = mfs("""\
+From: ted@example.com
+Sender: cris@example.com
+To: test@example.com
+Subject: A test message
+Message-ID: <ant>
+MIME-Version: 1.0
+
+A message body.
+""")
+ msgdata = {}
+ result = rule.check(self._mlist, msg, msgdata)
+ self.assertFalse(result)