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

Reply via email to