Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core
Commits:
5ca0e415 by Mark Sapiro at 2019-05-15T23:47:39Z
Catch various exceptions in email join command.
- - - - -
3c4e6ad9 by Mark Sapiro at 2019-05-15T23:47:39Z
Merge branch 'eml_err' into 'master'
Catch various exceptions in email join command.
Closes #583 and #577
See merge request mailman/mailman!516
- - - - -
3 changed files:
- src/mailman/commands/eml_membership.py
- src/mailman/commands/tests/test_eml_membership.py
- src/mailman/docs/NEWS.rst
Changes:
=====================================
src/mailman/commands/eml_membership.py
=====================================
@@ -20,9 +20,10 @@
from email.utils import formataddr, parseaddr
from mailman.core.i18n import _
from mailman.interfaces.command import ContinueProcessing, IEmailCommand
-from mailman.interfaces.member import DeliveryMode, MemberRole
+from mailman.interfaces.member import (
+ AlreadySubscribedError, DeliveryMode, MembershipIsBannedError)
from mailman.interfaces.subscriptions import (
- ISubscriptionManager, ISubscriptionService)
+ ISubscriptionManager, SubscriptionPendingError)
from mailman.interfaces.usermanager import IUserManager
from public import public
from zope.component import getUtility
@@ -93,16 +94,18 @@ used.
joins.add(email)
results.joins = joins
person = formataddr((display_name, email)) # noqa: F841
- # Is this person already a member of the list? Search for all
- # matching memberships.
- members = getUtility(ISubscriptionService).find_members(
- email, mlist.list_id, MemberRole.member)
- if len(members) > 0:
- print(_('$person is already a member'), file=results)
- return ContinueProcessing.yes
subscriber = match_subscriber(email, display_name)
- ISubscriptionManager(mlist).register(subscriber)
- print(_('Confirmation email sent to $person'), file=results)
+ try:
+ ISubscriptionManager(mlist).register(subscriber)
+ except (AlreadySubscribedError, MembershipIsBannedError) as e:
+ print(str(e), file=results)
+ except SubscriptionPendingError:
+ # SubscriptionPendingError doesn't return an error message.
+ listname = mlist.fqdn_listname # noqa: F841
+ print(_('$person has a pending subscription for $listname'),
+ file=results)
+ else:
+ print(_('Confirmation email sent to $person'), file=results)
return ContinueProcessing.yes
def _parse_arguments(self, arguments, results):
=====================================
src/mailman/commands/tests/test_eml_membership.py
=====================================
@@ -15,14 +15,16 @@
# You should have received a copy of the GNU General Public License along with
# GNU Mailman. If not, see <https://www.gnu.org/licenses/>.
-"""Test the Leave command."""
+"""Test the Join and Leave commands."""
import unittest
from mailman.app.lifecycle import create_list
-from mailman.commands.eml_membership import Leave
+from mailman.commands.eml_membership import Join, Leave
from mailman.email.message import Message
+from mailman.interfaces.bans import IBanManager
from mailman.interfaces.mailinglist import SubscriptionPolicy
+from mailman.interfaces.subscriptions import ISubscriptionManager
from mailman.interfaces.usermanager import IUserManager
from mailman.runners.command import Results
from mailman.testing.helpers import set_preferred
@@ -52,3 +54,64 @@ class TestLeave(unittest.TestCase):
self.assertEqual(
str(results).splitlines()[-1],
'leave: [email protected] is not a member of [email protected]')
+
+
+class TestJoin(unittest.TestCase):
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('[email protected]')
+ self._command = Join()
+
+ def test_join_already_a_member(self):
+ # Try to subscribe someone who is already a member. Anne is a real
+ # user, with a validated address, but she is not a member of the
+ # mailing list yet.
+ anne = getUtility(IUserManager).create_user('[email protected]')
+ set_preferred(anne)
+ # First subscribe anne.
+ ISubscriptionManager(self._mlist).register(anne, pre_verified=True,
+ pre_confirmed=True,
+ pre_approved=True)
+ # Then initiate a subscription.
+ msg = Message()
+ msg['From'] = '[email protected]'
+ results = Results()
+ self._command.process(self._mlist, msg, {}, (), results)
+ self.assertEqual(
+ str(results).splitlines()[-1],
+ '[email protected] is already a MemberRole.member of '
+ 'mailing list [email protected]')
+
+ def test_join_banned(self):
+ # Try to subscribe someone who is banned. Anne is a real
+ # user, with a validated address, but she is not a member of the
+ # mailing list and is banned from joining.
+ # Add anne to the ban list.
+ IBanManager(self._mlist).ban('[email protected]')
+ # Then initiate a subscription.
+ msg = Message()
+ msg['From'] = '[email protected]'
+ results = Results()
+ self._command.process(self._mlist, msg, {}, (), results)
+ self.assertEqual(
+ str(results).splitlines()[-1],
+ '[email protected] is not allowed to subscribe to [email protected]')
+
+ def test_join_pending(self):
+ self._mlist.subscription_policy = SubscriptionPolicy.confirm
+ # Try to subscribe someone who already has a subscription pending.
+ # Anne is a real user, with a validated address, who already has a
+ # pending subscription for this mailing list.
+ anne = getUtility(IUserManager).create_user('[email protected]')
+ set_preferred(anne)
+ # Initiate a subscription.
+ ISubscriptionManager(self._mlist).register(anne)
+ # And try to subscribe.
+ msg = Message()
+ msg['From'] = '[email protected]'
+ results = Results()
+ self._command.process(self._mlist, msg, {}, (), results)
+ self.assertEqual(
+ str(results).splitlines()[-1],
+ '[email protected] has a pending subscription for [email protected]')
=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -27,6 +27,8 @@ Bugs
* A post from a nonmember matching the legacy ``accept_these_nonmembers`` is
now subject to subsequent rules rather than accepted immediately.
(Closes #587)
+* Email attempts to subscribe a user who is banned or has a subscription
+ already pending are now handled properly. (Closes #577 and #583)
Command line
------------
View it on GitLab:
https://gitlab.com/mailman/mailman/compare/78ef269ef419e3607593ea249831ce554b7e749c...3c4e6ad9a7b8cec0633de87e01a496b8ebb53f7d
--
View it on GitLab:
https://gitlab.com/mailman/mailman/compare/78ef269ef419e3607593ea249831ce554b7e749c...3c4e6ad9a7b8cec0633de87e01a496b8ebb53f7d
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org