summaryrefslogtreecommitdiff
path: root/src/mailman/rules/tests/test_dmarc.py
diff options
context:
space:
mode:
authorMark Sapiro2016-11-11 15:58:32 -0800
committerMark Sapiro2016-11-11 15:58:32 -0800
commitfe20103091f5c2853b22190751d9c9f613a625d5 (patch)
treef657cb528f115dde7fb1dac77d8bc3c689b23842 /src/mailman/rules/tests/test_dmarc.py
parentf60cb022df4a5c5fca507c103d97638971e63ae2 (diff)
downloadmailman-fe20103091f5c2853b22190751d9c9f613a625d5.tar.gz
mailman-fe20103091f5c2853b22190751d9c9f613a625d5.tar.zst
mailman-fe20103091f5c2853b22190751d9c9f613a625d5.zip
Diffstat (limited to 'src/mailman/rules/tests/test_dmarc.py')
-rw-r--r--src/mailman/rules/tests/test_dmarc.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/mailman/rules/tests/test_dmarc.py b/src/mailman/rules/tests/test_dmarc.py
new file mode 100644
index 000000000..49aeea8c6
--- /dev/null
+++ b/src/mailman/rules/tests/test_dmarc.py
@@ -0,0 +1,81 @@
+# Copyright (C) 2016 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Support for mocking dnspython calls from dmarc rules."""
+
+from dns.rdatatype import TXT
+from dns.resolver import NXDOMAIN, NoAnswer
+from mailman import public
+from unittest import mock
+
+
+@public
+def get_dns_resolver():
+ """Create a dns.resolver.Resolver mock.
+
+ This is used to return a predictable response to a _dmarc query. It
+ returns p=reject for the example.biz domain and raises either NXDOMAIN
+ or NoAnswer for any other.
+
+ It only implements those classes and attributes used by the dmarc rule.
+ """
+ class Name:
+ # mock answer.name
+ def __init__(self):
+ pass
+
+ def to_text(self):
+ return '_dmarc.example.biz.'
+
+ class Item:
+ # mock answer.items
+ def __init__(self):
+ self.strings = [b'v=DMARC1; p=reject;']
+
+ class Ans_e:
+ # mock answer element
+ def __init__(self):
+ self.rdtype = TXT
+ self.items = [Item()]
+ self.name = Name()
+
+ class Answer:
+ # mock answer
+ def __init__(self):
+ self.answer = [Ans_e()]
+
+ class Resolver:
+ # mock dns.resolver.Resolver class.
+ def __init__(self):
+ pass
+
+ def query(self, domain, data_type):
+ if data_type != TXT:
+ raise NoAnswer
+ dparts = domain.split('.')
+ if len(dparts) < 3:
+ raise NXDOMAIN
+ if len(dparts) > 3:
+ raise NoAnswer
+ if dparts[0] != '_dmarc':
+ raise NoAnswer
+ if dparts[1] != 'example' or dparts[2] != 'biz':
+ raise NXDOMAIN
+ self.response = Answer()
+ return self
+ patcher = mock.patch('dns.resolver.Resolver', Resolver)
+ return patcher