diff options
| author | Mark Sapiro | 2016-11-11 15:58:32 -0800 |
|---|---|---|
| committer | Mark Sapiro | 2016-11-11 15:58:32 -0800 |
| commit | fe20103091f5c2853b22190751d9c9f613a625d5 (patch) | |
| tree | f657cb528f115dde7fb1dac77d8bc3c689b23842 /src/mailman/rules/tests/test_dmarc.py | |
| parent | f60cb022df4a5c5fca507c103d97638971e63ae2 (diff) | |
| download | mailman-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.py | 81 |
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 |
