summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/membership.py33
-rw-r--r--src/mailman/app/tests/test_membership.py2
2 files changed, 26 insertions, 9 deletions
diff --git a/src/mailman/app/membership.py b/src/mailman/app/membership.py
index 3d06c7503..b1675dae1 100644
--- a/src/mailman/app/membership.py
+++ b/src/mailman/app/membership.py
@@ -67,14 +67,31 @@ def add_member(mlist, record, role=MemberRole.member):
# Encrypt the password using the currently selected hash scheme.
user.preferences.preferred_language = record.language
# Subscribe the address, not the user.
- address = user_manager.get_address(record.email)
- if address is None or address.user is not user:
- raise AssertionError(
- 'User should have had linked address: {0}'.format(address))
- # Create the member and set the appropriate preferences.
- member = mlist.subscribe(address, role)
- member.preferences.preferred_language = record.language
- member.preferences.delivery_mode = record.delivery_mode
+ # We're looking for two versions of the email address, the case
+ # preserved version and the case insensitive version. We'll
+ # subscribe the version with matching case if it exists, otherwise
+ # we'll use one of the matching case-insensitively ones. It's
+ # undefined which one we pick.
+ case_preserved = None
+ case_insensitive = None
+ for address in user.addresses:
+ if address.original_email == record.email:
+ case_preserved = address
+ if address.email == record.email.lower():
+ case_insensitive = address
+ assert case_preserved is not None or case_insensitive is not None, (
+ 'Could not find a linked address for: {}'.format(record.email))
+ address = (case_preserved if case_preserved is not None
+ else case_insensitive)
+ # Create the member and set the appropriate preferences. It's
+ # possible we're subscribing the lower cased version of the address;
+ # if that's already subscribed re-issue the exception with the correct
+ # email address (i.e. the one passed in here).
+ try:
+ member = mlist.subscribe(address, role)
+ except AlreadySubscribedError as error:
+ raise AlreadySubscribedError(
+ error.fqdn_listname, record.email, error.role)
return member
diff --git a/src/mailman/app/tests/test_membership.py b/src/mailman/app/tests/test_membership.py
index 73e2ced07..481de2bb8 100644
--- a/src/mailman/app/tests/test_membership.py
+++ b/src/mailman/app/tests/test_membership.py
@@ -208,7 +208,7 @@ class TestAddMember(unittest.TestCase):
RequestRecord(email, 'Ann Person',
DeliveryMode.regular,
system_preferences.preferred_language))
- self.assertEqual(cm.exception.email, email.lower())
+ self.assertEqual(cm.exception.email, email)
def test_add_member_with_lower_case_email(self):
# LP: #1425359 - Mailman is case-perserving, case-insensitive. This