Skip to content

Commit e6572f6

Browse files
committed
python 3.13: be compatible with socket ipv6 changes.
1 parent d51681b commit e6572f6

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

src/remote_registration.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@
1414
import prefs
1515
import config
1616

17+
def get_ipv6_addr_tuple(addr, port):
18+
if '%' in addr:
19+
ip_part, scope_name = addr.split('%', 1)
20+
scope_id = socket.if_nametoindex(scope_name)
21+
else:
22+
ip_part = addr
23+
scope_id = 0
24+
return (ip_part, port, 0, scope_id)
25+
1726
class RegRequest():
1827
def __init__(self, ident, hostname, ip_info, port, auth_port, api_version):
1928
self.api_version = api_version
@@ -142,10 +151,12 @@ def request(self):
142151
remote_ip, _, ip_version = self.ip_info.get_usable_ip()
143152

144153
try:
145-
ip = remote_ip if ip_version == socket.AF_INET else "[%s]" % (remote_ip,)
146154
server_sock = socket.socket(ip_version, socket.SOCK_DGRAM)
147155
server_sock.settimeout(5.0)
148-
server_sock.sendto(REQUEST, (ip, self.port))
156+
if ip_version == socket.AF_INET6:
157+
server_sock.sendto(REQUEST, get_ipv6_addr_tuple(remote_ip, self.port))
158+
else:
159+
server_sock.sendto(REQUEST, (remote_ip, self.port))
149160

150161
reply, addr = server_sock.recvfrom(2000)
151162

@@ -182,7 +193,10 @@ def serve_cert_thread(self, ip_version):
182193
try:
183194
server_sock = socket.socket(ip_version, socket.SOCK_DGRAM)
184195
server_sock.settimeout(1.0)
185-
server_sock.bind((local_ip, self.port))
196+
if ip_version == socket.AF_INET6:
197+
server_sock.bind(get_ipv6_addr_tuple(local_ip, self.port))
198+
else:
199+
server_sock.bind((local_ip, self.port))
186200
except socket.error as e:
187201
logging.critical("Could not create udp socket for cert requests: %s" % str(e))
188202
return

src/util.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,9 @@ def as_binary_list(self):
243243
pass
244244
if self.ip6:
245245
try:
246-
blist.append(socket.inet_pton(GLib.SYSDEF_AF_INET6, self.ip6_address))
246+
# Strip scope ID suffix if present (e.g., %eth0)
247+
ip6_clean = self.ip6_address.split('%')[0] if '%' in self.ip6_address else self.ip6_address
248+
blist.append(socket.inet_pton(GLib.SYSDEF_AF_INET6, ip6_clean))
247249
except:
248250
pass
249251

0 commit comments

Comments
 (0)