From ed9e12d2f75a8309e1ad88e69143abf7a820d542 Mon Sep 17 00:00:00 2001 From: Spitap Date: Fri, 29 Jul 2022 16:40:33 +0200 Subject: [PATCH 1/5] mitigate spamhaus dns fail while querying for dnsbl --- modoboa/admin/management/commands/subcommands/_mx.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 964643d18..2382c64a2 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -79,6 +79,9 @@ class CheckMXRecords(BaseCommand): pattern = "{}.{}.".format(reverse, provider) try: result = socket.gethostbyname(pattern) + #Mitigate Spamhaus status error (these codes don't mean ip is listed) + if result == "127.255.255.254" or result == "127.255.255.255": + result = False except socket.gaierror: result = False for mx in mxs: From e662fd943db5b2fdb0ad917d0005c6a4bcf3c559 Mon Sep 17 00:00:00 2001 From: Spitap Date: Mon, 5 Sep 2022 11:07:26 +0200 Subject: [PATCH 2/5] More generic dnsbl validation --- modoboa/admin/management/commands/subcommands/_mx.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 2382c64a2..d1a01644e 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -79,8 +79,10 @@ class CheckMXRecords(BaseCommand): pattern = "{}.{}.".format(reverse, provider) try: result = socket.gethostbyname(pattern) - #Mitigate Spamhaus status error (these codes don't mean ip is listed) - if result == "127.255.255.254" or result == "127.255.255.255": + #result from dnsbl is in ipv4 format + splited_result = result.split(".") + if int(splited_result[-1]) <= 15: + #Typical dnsbl result : 127.255.255.[1-15] (depends on services) result = False except socket.gaierror: result = False From 4a1f1dc5d3716c4b1cdce70f6ced3ba2c98fc482 Mon Sep 17 00:00:00 2001 From: Spitap Date: Mon, 5 Sep 2022 11:52:48 +0200 Subject: [PATCH 3/5] fix comment --- modoboa/admin/management/commands/subcommands/_mx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index d1a01644e..853ac2558 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -82,7 +82,7 @@ class CheckMXRecords(BaseCommand): #result from dnsbl is in ipv4 format splited_result = result.split(".") if int(splited_result[-1]) <= 15: - #Typical dnsbl result : 127.255.255.[1-15] (depends on services) + #Typical dnsbl result : 127.0.0.[1-15] (depends on services) result = False except socket.gaierror: result = False From 8ae289ad3124eec82ee5ad5687ed7df14141acf6 Mon Sep 17 00:00:00 2001 From: Spitap Date: Mon, 5 Sep 2022 13:52:36 +0200 Subject: [PATCH 4/5] fixed mistake, updated test with real response possibility --- modoboa/admin/management/commands/subcommands/_mx.py | 2 +- modoboa/admin/tests/test_mx.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py index 853ac2558..d1ea6abee 100644 --- a/modoboa/admin/management/commands/subcommands/_mx.py +++ b/modoboa/admin/management/commands/subcommands/_mx.py @@ -81,7 +81,7 @@ class CheckMXRecords(BaseCommand): result = socket.gethostbyname(pattern) #result from dnsbl is in ipv4 format splited_result = result.split(".") - if int(splited_result[-1]) <= 15: + if int(splited_result[-1]) > 15: #Typical dnsbl result : 127.0.0.[1-15] (depends on services) result = False except socket.gaierror: diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index 9d0a80164..a8d7bdf88 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -217,7 +217,7 @@ 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) From 46908249698e6ff52a217145b56c9c20d8df54e9 Mon Sep 17 00:00:00 2001 From: Spitap Date: Mon, 5 Sep 2022 14:15:31 +0200 Subject: [PATCH 5/5] make codecov happy --- modoboa/admin/tests/test_mx.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py index a8d7bdf88..8505d3666 100644 --- a/modoboa/admin/tests/test_mx.py +++ b/modoboa/admin/tests/test_mx.py @@ -221,6 +221,19 @@ class DNSBLTestCase(ModoTestCase): 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")