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 = [
('[email protected]', '[email protected]'),
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
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org