Exemplo n.º 1
0
    async def query(self, dnsq, clientip, timeout=DEFAULT_TIMEOUT, ecs=False):
        original_ecs_option = None
        for option in dnsq.options:
            if isinstance(option, dns.edns.ECSOption):
                original_ecs_option = option
                break

        # (Potentially) modified copy of dnsq
        dnsq_mod = dns.message.from_wire(dnsq.to_wire())
        if ecs:
            utils.set_dns_ecs(dnsq_mod, clientip)

        dnsr = await self.query_udp(dnsq_mod, clientip, timeout=timeout)
        if dnsr is None or (dnsr.flags & dns.flags.TC):
            dnsr = await self.query_tcp(dnsq_mod, clientip, timeout=timeout)

        if dnsr is not None and ecs:
            options = []
            for option in dnsr.options:
                if isinstance(option, dns.edns.ECSOption):
                    if original_ecs_option is not None:
                        options.append(original_ecs_option)
                else:
                    options.append(option)
            dnsr.edns = dnsq.edns
            dnsr.options = options

        return dnsr
Exemplo n.º 2
0
    async def query(self, dnsq, clientip, timeout=DEFAULT_TIMEOUT, ecs=False):
        # (Potentially) modified copy of dnsq
        dnsq_mod = dns.message.from_wire(dnsq.to_wire())
        we_set_ecs = False
        if ecs:
            we_set_ecs = utils.set_dns_ecs(dnsq_mod, clientip)

        dnsr = await self.query_udp(dnsq_mod, clientip, timeout=timeout)
        if dnsr is None or (dnsr.flags & dns.flags.TC):
            dnsr = await self.query_tcp(dnsq_mod, clientip, timeout=timeout)

        if dnsr is not None and we_set_ecs:
            for option in dnsr.options:
                if isinstance(option, dns.edns.ECSOption):
                    dnsr.options.remove(option)
            dnsr.edns = dnsq.edns

        return dnsr
Exemplo n.º 3
0
 def test_set_dns_ecs_ipv6(self):
     dnsq = dns.message.make_query("www.example.com", rdtype="A")
     utils.set_dns_ecs(dnsq, "2000::aa")
     self.assertEqual(dnsq.edns, 0)
     self.assertEqual(dnsq.options[0].address, "2000::")
     self.assertEqual(dnsq.options[0].srclen, 56)
Exemplo n.º 4
0
 def test_set_dns_ecs_ipv6(self):
     dnsq = dns.message.Message()
     utils.set_dns_ecs(dnsq, '2000::aa')
     self.assertEqual(dnsq.edns, 0)
     self.assertEqual(dnsq.options[0].address, '2000::')
     self.assertEqual(dnsq.options[0].srclen, 56)
Exemplo n.º 5
0
 def test_set_dns_ecs_ipv4(self):
     dnsq = dns.message.Message()
     utils.set_dns_ecs(dnsq, '10.0.0.242')
     self.assertEqual(dnsq.edns, 0)
     self.assertEqual(dnsq.options[0].address, '10.0.0.0')
     self.assertEqual(dnsq.options[0].srclen, 24)