Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core
Commits: 63f53411 by Mark Sapiro at 2018-05-14T18:53:29Z Added DMARC mitigations to the importer. - - - - - e85c45f5 by Mark Sapiro at 2018-05-14T20:44:17Z Merge branch 'import' into 'master' Added DMARC mitigations to the importer. See merge request mailman/mailman!387 - - - - - 3 changed files: - src/mailman/docs/NEWS.rst - src/mailman/utilities/importer.py - src/mailman/utilities/tests/test_import.py Changes: ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -91,6 +91,7 @@ Command line * Add a new option ``--periodic`` to ``mailman digests`` command. It sends out digests for only those Mailing Lists that have ``digest_send_periodic`` option set to ``True``. (Closes #384) +* The ``mailman import21`` command now imports DMARC mitigations. Configuration ------------- ===================================== src/mailman/utilities/importer.py ===================================== --- a/src/mailman/utilities/importer.py +++ b/src/mailman/utilities/importer.py @@ -35,8 +35,8 @@ from mailman.interfaces.digests import DigestFrequency from mailman.interfaces.errors import MailmanError from mailman.interfaces.languages import ILanguageManager from mailman.interfaces.mailinglist import ( - IAcceptableAliasSet, IHeaderMatchList, Personalization, ReplyToMunging, - SubscriptionPolicy) + DMARCMitigateAction, IAcceptableAliasSet, IHeaderMatchList, + Personalization, ReplyToMunging, SubscriptionPolicy) from mailman.interfaces.member import DeliveryMode, DeliveryStatus, MemberRole from mailman.interfaces.nntp import NewsgroupModeration from mailman.interfaces.template import ITemplateManager @@ -86,6 +86,19 @@ def list_members_to_unicode(value): return [bytes_to_str(item) for item in value] +def dmarc_action_mapping(value): + # Convert dmarc_moderation_action to a DMARCMitigateAction enum. + # 2.1 actions are 0==accept, 1==Munge From, 2==Wrap Message, + # 3==Reject, 4==discard + return { + 0: DMARCMitigateAction.no_mitigation, + 1: DMARCMitigateAction.munge_from, + 2: DMARCMitigateAction.wrap_message, + 3: DMARCMitigateAction.reject, + 4: DMARCMitigateAction.discard, + }[value] + + def filter_action_mapping(value): # The filter_action enum values have changed. In Mailman 2.1 the order # was 'Discard', 'Reject', 'Forward to List Owner', 'Preserve'. In MM3 @@ -288,6 +301,27 @@ def import_config_pck(mlist, config_dict): config_dict.get('member_moderation_action')) else: mlist.default_member_action = Action.defer + # Handle DMARC mitigations. + # This would be straightforward except for from_is_list. The issue + # is in MM 2.1 the from_is_list action applies if dmarc_moderation_action + # doesn't apply and they can be different. + # We will map as follows: + # from_is_list > dmarc_moderation_action + # dmarc_mitigate_action = from_is_list action + # dmarc_mitigate_unconditionally = True + # from_is_list <= dmarc_moderation_action + # dmarc_mitigate_action = dmarc_moderation_action + # dmarc_mitigate_unconditionally = False + # The text attributes are handled above. + if (config_dict.get('from_is_list', 0) > + config_dict.get('dmarc_moderation_action', 0)): + mlist.dmarc_mitigate_action = dmarc_action_mapping( + config_dict.get('from_is_list', 0)) + mlist.dmarc_mitigate_unconditionally = True + else: + mlist.dmarc_mitigate_action = dmarc_action_mapping( + config_dict.get('dmarc_moderation_action', 0)) + mlist.dmarc_mitigate_unconditionally = False # Handle the archiving policy. In MM2.1 there were two boolean options # but only three of the four possible states were valid. Now there's just # an enum. ===================================== src/mailman/utilities/tests/test_import.py ===================================== --- a/src/mailman/utilities/tests/test_import.py +++ b/src/mailman/utilities/tests/test_import.py @@ -34,7 +34,7 @@ from mailman.interfaces.bounce import UnrecognizedBounceDisposition from mailman.interfaces.domain import IDomainManager from mailman.interfaces.languages import ILanguageManager from mailman.interfaces.mailinglist import ( - IAcceptableAliasSet, SubscriptionPolicy) + DMARCMitigateAction, IAcceptableAliasSet, SubscriptionPolicy) from mailman.interfaces.member import DeliveryMode, DeliveryStatus from mailman.interfaces.nntp import NewsgroupModeration from mailman.interfaces.template import ITemplateLoader, ITemplateManager @@ -204,6 +204,55 @@ class TestBasicImport(unittest.TestCase): self.assertTrue(self._mlist.send_welcome_message) self.assertTrue(self._mlist.send_goodbye_message) + def test_dmarc_zero_from_is_list(self): + self._mlist.dmarc_mitigate_action = DummyEnum.val + self._mlist.dmarc_mitigate_unconditionally = True + self._pckdict['from_is_list'] = 0 + self._pckdict['dmarc_moderation_action'] = 1 + self._import() + self.assertFalse(self._mlist.dmarc_mitigate_unconditionally) + self.assertEqual(self._mlist.dmarc_mitigate_action, + DMARCMitigateAction.munge_from) + + def test_dmarc_zero_dmarc_moderation_action(self): + self._mlist.dmarc_mitigate_action = DummyEnum.val + self._mlist.dmarc_mitigate_unconditionally = False + self._pckdict['from_is_list'] = 1 + self._pckdict['dmarc_moderation_action'] = 0 + self._import() + self.assertTrue(self._mlist.dmarc_mitigate_unconditionally) + self.assertEqual(self._mlist.dmarc_mitigate_action, + DMARCMitigateAction.munge_from) + + def test_dmarc_nonzero_actions_fil(self): + self._mlist.dmarc_mitigate_action = DummyEnum.val + self._mlist.dmarc_mitigate_unconditionally = False + self._pckdict['from_is_list'] = 2 + self._pckdict['dmarc_moderation_action'] = 1 + self._import() + self.assertTrue(self._mlist.dmarc_mitigate_unconditionally) + self.assertEqual(self._mlist.dmarc_mitigate_action, + DMARCMitigateAction.wrap_message) + + def test_dmarc_nonzero_actions_dma(self): + self._mlist.dmarc_mitigate_action = DummyEnum.val + self._mlist.dmarc_mitigate_unconditionally = True + self._pckdict['from_is_list'] = 1 + self._pckdict['dmarc_moderation_action'] = 2 + self._import() + self.assertFalse(self._mlist.dmarc_mitigate_unconditionally) + self.assertEqual(self._mlist.dmarc_mitigate_action, + DMARCMitigateAction.wrap_message) + + def test_dmarc_messages(self): + self._pckdict['dmarc_moderation_notice'] = b'This is a notice.\n' + self._pckdict['dmarc_wrapped_message_text'] = b'This is text.\n' + self._import() + self.assertEqual('This is a notice.\n', + self._mlist.dmarc_moderation_notice) + self.assertEqual('This is text.\n', + self._mlist.dmarc_wrapped_message_text) + def test_ban_list(self): banned = [ ('a...@example.com', 'a...@example.com'), View it on GitLab: https://gitlab.com/mailman/mailman/compare/a3d1aa053683b96fe1d974a68d0190048753b859...e85c45f5c1beb9b06c4da36cc74e829390494ef1 -- View it on GitLab: https://gitlab.com/mailman/mailman/compare/a3d1aa053683b96fe1d974a68d0190048753b859...e85c45f5c1beb9b06c4da36cc74e829390494ef1 You're receiving this email because of your account on gitlab.com.
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org