Adds back the changes made to support ipv6 in commit 8fba131230 but that were reverted with commit ca51a6054d to allow proper merging of another complex PR. Closes #11 again

Also includes a small bug fix that was added with commit 6bbb2e9905 but that was also temporarily reverted with 45f9631a98.
This commit is contained in:
Sven Luethi committed 2026-01-31 09:43:19 +01:00
1 parent 562f54d481
commit 1fae3bfe54
1 file changed
+40 -5
@@ -450,16 +450,19 @@ class DNSBaseRequestHandler(socketserver.BaseRequestHandler):
continue_on_error=False,
ignore_trailing=True
)
except dns.tsig.BadSignature as e:
logger.warning(
f"Request denied from {peer} failed TSIG verification: {e}"
)
self.denyRequestBadTSIG(wire, dns.rcode.BADSIG)
return
except dns.message.UnknownTSIGKey as e:
except (dns.message.UnknownTSIGKey, dns.tsig.BadAlgorithm) as e:
logger.warning(f"Request denied from {peer} with bad TSIG key: {e}")
self.denyRequestBadTSIG(wire, dns.rcode.BADKEY)
return
except Exception as e:
logger.error("Error parsing query: ", e)
return
@@ -584,20 +587,52 @@ class TCPRequestHandler(DNSBaseRequestHandler):
traceback.print_exc()
class TCPDNSServer(socketserver.TCPServer):
class DNSAddressMixin:
def _resolve_address(self, server_address, socktype, proto):
host, port = server_address
infos = socket.getaddrinfo(
host,
port,
socket.AF_UNSPEC,
socktype,
proto,
socket.AI_PASSIVE
)
family, _, _, _, sockaddr = infos[0]
self.address_family = family
return sockaddr
class TCPDNSServer(DNSAddressMixin, socketserver.TCPServer):
allow_reuse_address = True
def __init__(self, server_address, handler_class, keyring, tsig_view_map):
super().__init__(server_address, handler_class)
sockaddr = self._resolve_address(
server_address,
socket.SOCK_STREAM,
socket.IPPROTO_TCP
)
super().__init__(sockaddr, handler_class)
self.keyring = keyring
self.tsig_view_map = tsig_view_map
class UDPDNSServer(socketserver.UDPServer):
class UDPDNSServer(DNSAddressMixin, socketserver.UDPServer):
allow_reuse_address = True
def __init__(self, server_address, handler_class, keyring, tsig_view_map):
super().__init__(server_address, handler_class)
sockaddr = self._resolve_address(
server_address,
socket.SOCK_DGRAM,
socket.IPPROTO_UDP
)
super().__init__(sockaddr, handler_class)
self.keyring = keyring
self.tsig_view_map = tsig_view_map