From c28235b09ac508d960be776e37710507d344e895 Mon Sep 17 00:00:00 2001 From: orohi Date: Sun, 26 Jul 2026 03:21:33 +0300 Subject: [PATCH] Fix infinite recursion in 3x-ui server ensure/get helpers. ensure_xui_servers no longer calls get_xui_server when mirroring the primary panel into legacy sync fields. Co-authored-by: Cursor --- managers/xui_servers.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/managers/xui_servers.py b/managers/xui_servers.py index 1c5b378..8683e0d 100644 --- a/managers/xui_servers.py +++ b/managers/xui_servers.py @@ -2,7 +2,6 @@ from __future__ import annotations -import secrets import uuid from typing import Any, Optional @@ -59,14 +58,18 @@ def ensure_xui_servers(settings: dict) -> list: migrated = legacy_sync_to_server(settings.get('sync') or {}) if migrated: servers = [migrated] - settings['xui_servers'] = servers - else: - settings['xui_servers'] = servers + settings['xui_servers'] = servers - # Keep legacy sync.* mirrored from first/default for older code paths + # Mirror primary into legacy sync.* for older code paths (no get_xui_server — avoids recursion) sync = settings.setdefault('sync', {}) - primary = get_xui_server(settings, None) or {} - if primary.get('url'): + primary = None + for s in servers: + if s.get('enabled'): + primary = s + break + if primary is None and servers: + primary = servers[0] + if primary and primary.get('url'): sync.setdefault('xui_url', primary.get('url') or '') sync.setdefault('xui_sub_url', primary.get('sub_url') or '') sync.setdefault('xui_api_token', primary.get('api_token') or '') @@ -91,7 +94,7 @@ def get_xui_server(settings: dict, panel_id: Optional[str] = None) -> Optional[d for s in servers: if str(s.get('id')) == str(panel_id): return s - # Prefer enabled + return None for s in servers: if s.get('enabled'): return s