From 8680131b3dd0e05da722c423ce1184c17f22f7c6 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 30 Jun 2026 09:00:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E7=99=BB=E5=87=BA(=E4=B8=BB?= =?UTF-8?q?=E5=8A=A8/=E8=A2=AB=E5=BC=BA=E9=80=80/=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E8=BF=87=E6=9C=9F)=E4=B8=80=E5=BE=8B=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E9=9A=A7=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug:logout() 只清 token,不碰隧道 → 被强制下线/正常退出后 VPN 还连着、继续用数据面。 修:ConnectionController 监听 authProvider,isLoggedIn 由 true→false 时断开隧道(_disconnect)。 一处覆盖所有登出路径(设置页登出/会话轮询强退/token 续期失败登出);token 续期仍登录不触发。 Co-Authored-By: Claude Opus 4.8 --- client/lib/state/connection_provider.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/lib/state/connection_provider.dart b/client/lib/state/connection_provider.dart index 90ad956..b633060 100644 --- a/client/lib/state/connection_provider.dart +++ b/client/lib/state/connection_provider.dart @@ -81,12 +81,21 @@ class ConnectionController extends StateNotifier { _statusSub = _bridge.statusStream.listen(_onKernelStatus); // 订阅内核 stats:连接态把 urltest 实测回写连接节点的 ping,让连接页与节点列表同源一致。 _statsSub = _bridge.statsStream.listen(_onStats); + // 登出(主动退出 / 被强制下线 / 会话过期)→ 一律断开隧道:别让已登出/被踢的设备继续用 + // 数据面。一处监听 auth 覆盖所有登出路径。token 续期(仍登录)不触发。 + _authSub = _ref.listen(authProvider, (prev, next) { + if ((prev?.isLoggedIn ?? false) && !next.isLoggedIn) { + _userDisconnect = true; // 视为「非节点异常」的主动断开,不弹「节点异常」 + unawaited(_disconnect()); + } + }); } final Ref _ref; final VpnBridge _bridge; StreamSubscription? _statusSub; StreamSubscription? _statsSub; + ProviderSubscription? _authSub; Timer? _elapsed; Timer? _watchdog; bool _probing = false; @@ -346,6 +355,7 @@ class ConnectionController extends StateNotifier { void dispose() { _statusSub?.cancel(); _statsSub?.cancel(); + _authSub?.close(); _stopElapsed(); _stopWatchdog(); _api?.dispose();