From 91d3187faa2685fffd4509951b206d34bc7eac11 Mon Sep 17 00:00:00 2001 From: Michael Webster Date: Thu, 15 Jan 2026 19:14:59 -0500 Subject: [PATCH] python 3.13: be compatible with socket ipv6 changes. --- src/remote_registration.py | 14 +++++++++++++- src/util.py | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/remote_registration.py b/src/remote_registration.py index 2f0275cf..3403dd71 100644 --- a/src/remote_registration.py +++ b/src/remote_registration.py @@ -14,6 +14,15 @@ import prefs import config +def get_ipv6_addr_tuple(addr, port): + if '%' in addr: + ip_part, scope_name = addr.split('%', 1) + scope_id = socket.if_nametoindex(scope_name) + else: + ip_part = addr + scope_id = 0 + return (ip_part, port, 0, scope_id) + class RegRequest(): def __init__(self, ident, hostname, ip_info, port, auth_port, api_version): self.api_version = api_version @@ -182,7 +191,10 @@ def serve_cert_thread(self, ip_version): try: server_sock = socket.socket(ip_version, socket.SOCK_DGRAM) server_sock.settimeout(1.0) - server_sock.bind((local_ip, self.port)) + if ip_version == socket.AF_INET6: + server_sock.bind(get_ipv6_addr_tuple(local_ip, self.port)) + else: + server_sock.bind((local_ip, self.port)) except socket.error as e: logging.critical("Could not create udp socket for cert requests: %s" % str(e)) return diff --git a/src/util.py b/src/util.py index 7fb73909..ef237632 100644 --- a/src/util.py +++ b/src/util.py @@ -243,7 +243,9 @@ def as_binary_list(self): pass if self.ip6: try: - blist.append(socket.inet_pton(GLib.SYSDEF_AF_INET6, self.ip6_address)) + # Strip scope ID suffix if present (e.g., %eth0) + ip6_clean = self.ip6_address.split('%')[0] if '%' in self.ip6_address else self.ip6_address + blist.append(socket.inet_pton(GLib.SYSDEF_AF_INET6, ip6_clean)) except: pass