]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Validate resolver nameservers when set [Issue #699].
authorBob Halley <halley@dnspython.org>
Sun, 24 Oct 2021 13:10:58 +0000 (06:10 -0700)
committerBob Halley <halley@dnspython.org>
Sun, 24 Oct 2021 13:10:58 +0000 (06:10 -0700)
dns/resolver.py
tests/test_async.py
tests/test_doh.py
tests/test_resolver.py

index 6a9974d830ca1be274997fb5ba774b4f34421bf6..08e9e6179332d80b0401e01bfc591f8825e82ee0 100644 (file)
@@ -1120,6 +1120,14 @@ class BaseResolver:
         ``list``.
         """
         if isinstance(nameservers, list):
+            for nameserver in nameservers:
+                if not dns.inet.is_address(nameserver):
+                    try:
+                        if urlparse(nameserver).scheme != 'https':
+                            raise NotImplementedError
+                    except Exception:
+                        raise ValueError(f'nameserver {nameserver} is not an '
+                                         'IP address or valid https URL')
             self._nameservers = nameservers
         else:
             raise ValueError('nameservers must be a list'
@@ -1219,9 +1227,6 @@ class Resolver(BaseResolver):
                                                      source_port=source_port,
                                                      raise_on_truncation=True)
                     else:
-                        protocol = urlparse(nameserver).scheme
-                        if protocol != 'https':
-                            raise NotImplementedError
                         response = dns.query.https(request, nameserver,
                                                    timeout=timeout)
                 except Exception as ex:
index cad7e20d469fd30a99475deaae604940734d8fc9..0782c7a097b7a51f703a1a92fa80412397e79213 100644 (file)
@@ -216,14 +216,6 @@ class AsyncTests(unittest.TestCase):
             return await dns.asyncresolver.canonical_name(name)
         self.assertEqual(self.async_run(run), cname)
 
-    def testResolverBadScheme(self):
-        res = dns.asyncresolver.Resolver(configure=False)
-        res.nameservers = ['bogus://dns.google/dns-query']
-        async def run():
-            answer = await res.resolve('dns.google', 'A')
-        def bad():
-            self.async_run(run)
-        self.assertRaises(dns.resolver.NoNameservers, bad)
 
     def testZoneForName1(self):
         async def run():
index 793a50060c7684840c904460ceac7edc44315fda..835e07daa1d0b2fe31285951805b108a0799749b 100644 (file)
@@ -139,12 +139,6 @@ class DNSOverHTTPSTestCase(unittest.TestCase):
         self.assertTrue('8.8.8.8' in seen)
         self.assertTrue('8.8.4.4' in seen)
 
-    def test_resolver_bad_scheme(self):
-        res = dns.resolver.Resolver(configure=False)
-        res.nameservers = ['bogus://dns.google/dns-query']
-        def bad():
-            answer = res.resolve('dns.google', 'A')
-        self.assertRaises(dns.resolver.NoNameservers, bad)
 
 if __name__ == '__main__':
     unittest.main()
index b2a47d239bc5d3a7793e3b012dc7b8e324290730..ecd1bf22f7895e616898bb2b3278703c23c61a0c 100644 (file)
@@ -700,6 +700,16 @@ class LiveResolverTests(unittest.TestCase):
         cname = dns.name.from_text('dangling-target.dnspython.org')
         self.assertEqual(dns.resolver.canonical_name(name), cname)
 
+    def testNameserverSetting(self):
+        res = dns.resolver.Resolver(configure=False)
+        ns = ['1.2.3.4', '::1', 'https://ns.example']
+        res.nameservers = ns[:]
+        self.assertEqual(res.nameservers, ns)
+        for ns in ['999.999.999.999', 'ns.example.', 'bogus://ns.example']:
+            with self.assertRaises(ValueError):
+                res.nameservers = [ns]
+
+
 class PollingMonkeyPatchMixin(object):
     def setUp(self):
         self.__native_selector_class = dns.query._selector_class