aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mailman/Cgi/confirm.py8
-rw-r--r--Mailman/MailList.py26
2 files changed, 25 insertions, 9 deletions
diff --git a/Mailman/Cgi/confirm.py b/Mailman/Cgi/confirm.py
index 6f31b6eb..d0f5dea1 100644
--- a/Mailman/Cgi/confirm.py
+++ b/Mailman/Cgi/confirm.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2005 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
@@ -529,6 +529,12 @@ def addrchange_confirm(mlist, doc, cookie):
doc.addError(_("""%(newaddr)s is banned from subscribing to the
%(realname)s list. If you think this restriction is erroneous,
please contact the list owners at %(owneraddr)s."""))
+ except Errors.MMAlreadyAMember:
+ realname = mlist.real_name
+ bad_confirmation(doc, _("""%(newaddr)s is already a member of
+ the %(realname)s list. It is possible that you are attempting
+ to confirm a request for an address that has already been
+ subscribed."""))
else:
# The response
listname = mlist.real_name
diff --git a/Mailman/MailList.py b/Mailman/MailList.py
index f7753cfe..9c3d87fe 100644
--- a/Mailman/MailList.py
+++ b/Mailman/MailList.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
@@ -1065,9 +1065,10 @@ class MailList(HTMLFormatter, Deliverer, ListAdmin,
newaddr = Utils.LCDomain(newaddr)
Utils.ValidateEmail(newaddr)
# Raise an exception if this email address is already a member of the
- # list, but only if the new address is the same case-wise as the old
+ # list, but only if the new address not a case change of the old
# address and we're not doing a global change.
- if not globally and newaddr == oldaddr and self.isMember(newaddr):
+ if not globally and not (newaddr <> oldaddr and
+ newaddr.lower() == oldaddr.lower()) and self.isMember(newaddr):
raise Errors.MMAlreadyAMember
if newaddr == self.GetListEmail().lower():
raise Errors.MMBadEmailError
@@ -1123,9 +1124,16 @@ class MailList(HTMLFormatter, Deliverer, ListAdmin,
raise Errors.MembershipIsBanned, pattern
# It's possible they were a member of this list, but choose to change
# their membership globally. In that case, we simply remove the old
- # address.
- if self.getMemberCPAddress(oldaddr) == newaddr:
- self.removeMember(oldaddr)
+ # address. This gets tricky with case changes. We can't just remove
+ # the old address if it differs from the new only by case, because
+ # that removes the new, so the condition is if the new address is the
+ # CP address of a member, then if the old address yields a different
+ # CP address, we can simply remove the old address, otherwise we can
+ # do nothing.
+ if self.isMember(newaddr) and (self.getMemberCPAddress(newaddr) ==
+ newaddr):
+ if self.getMemberCPAddress(oldaddr) <> newaddr:
+ self.removeMember(oldaddr)
else:
self.changeMemberAddress(oldaddr, newaddr)
# If globally is true, then we also include every list for which
@@ -1147,8 +1155,10 @@ class MailList(HTMLFormatter, Deliverer, ListAdmin,
mlist.Lock()
try:
# Same logic as above, re newaddr is already a member
- if mlist.getMemberCPAddress(oldaddr) == newaddr:
- mlist.removeMember(oldaddr)
+ if mlist.isMember(newaddr) and (
+ mlist.getMemberCPAddress(newaddr) == newaddr):
+ if mlist.getMemberCPAddress(oldaddr) <> newaddr:
+ mlist.removeMember(oldaddr)
else:
mlist.changeMemberAddress(oldaddr, newaddr)
mlist.Save()