diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 964643d18..d1ea6abee 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -79,6 +79,11 @@ class CheckMXRecords(BaseCommand): pattern = "{}.{}.".format(reverse, provider) try: result = socket.gethostbyname(pattern) + #result from dnsbl is in ipv4 format + splited_result = result.split(".") + if int(splited_result[-1]) > 15: + #Typical dnsbl result : 127.0.0.[1-15] (depends on services) + result = False except socket.gaierror: result = False for mx in mxs: diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 9d0a80164..8505d3666 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -217,10 +217,23 @@ class DNSBLTestCase(ModoTestCase): """Check notifications.""" mock_query.side_effect = utils.mock_dns_query_result mock_getaddrinfo.side_effect = utils.mock_ip_query_result - mock_g_gethostbyname.return_value = "1.2.3.4" + mock_g_gethostbyname.return_value = "127.0.0.4" management.call_command( "modo", "check_mx", "--email", "user@example.test") self.assertEqual(len(mail.outbox), 2) + + @mock.patch("gevent.socket.gethostbyname") + @mock.patch("socket.getaddrinfo") + @mock.patch.object(dns.resolver.Resolver, "resolve") + def test_notifications_wrong_dnsbl_response( + self, mock_query, mock_getaddrinfo, mock_g_gethostbyname): + """Check notifications.""" + mock_query.side_effect = utils.mock_dns_query_result + mock_getaddrinfo.side_effect = utils.mock_ip_query_result + mock_g_gethostbyname.return_value = "127.255.255.254" #<--Spamhaus response when querying from an open resolver + management.call_command( + "modo", "check_mx", "--email", "user@example.test") + self.assertEqual(len(mail.outbox), 1) @mock.patch("gevent.socket.gethostbyname") @mock.patch("socket.getaddrinfo")