From 1fae3bfe54bb3f516cc3f31c084208c12f8ae63c Mon Sep 17 00:00:00 2001 From: Sven Luethi Date: Sat, 31 Jan 2026 09:40:35 +0100 Subject: [PATCH] Adds back the changes made to support ipv6 in commit 8fba131230fe222edfe4cc5de6cb732062d13413 but that were reverted with commit ca51a6054d57900587b7c05a666e4d15b38a7a5c to allow proper merging of another complex PR. Closes #11 again Also includes a small bug fix that was added with commit 6bbb2e99057cf310a0c42d931d9a26deebcf1b8d but that was also temporarily reverted with 45f9631a9883aab20970789f41596643bbd1e2b1. --- .../commands/bind-transfer-endpoint.py | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py b/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py index 24fada1..c9035bd 100644 --- a/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py +++ b/src/netbox_plugin_bind_provisioner/management/commands/bind-transfer-endpoint.py @@ -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