From fe773a108e58449c1f78ad249e2599f9a180311f Mon Sep 17 00:00:00 2001 From: aiamnezia Date: Mon, 13 Apr 2026 10:19:01 +0400 Subject: [PATCH] fix: waiting VPN disconnect before proxy turning on --- .../ui/qml/Pages2/PageSettingsLocalProxy.qml | 71 ++++++++++++++++--- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsLocalProxy.qml b/client/ui/qml/Pages2/PageSettingsLocalProxy.qml index 4e2e3ec5b..d804430a7 100644 --- a/client/ui/qml/Pages2/PageSettingsLocalProxy.qml +++ b/client/ui/qml/Pages2/PageSettingsLocalProxy.qml @@ -21,6 +21,34 @@ PageType { property int pendingStartRequestedPort: -1 property int pendingStartAutoSelectedPort: -1 property bool pendingStartVpnWasActive: false + property bool pendingEnableAfterVpnDisconnect: false + property string pendingEnableServerUuid: "" + property int pendingEnableRequestedPort: -1 + property int pendingEnableAutoSelectedPort: -1 + property int pendingEnablePortToUse: -1 + + function clearPendingEnableAfterVpnDisconnect() { + root.pendingEnableAfterVpnDisconnect = false + root.pendingEnableServerUuid = "" + root.pendingEnableRequestedPort = -1 + root.pendingEnableAutoSelectedPort = -1 + root.pendingEnablePortToUse = -1 + } + + function enableLocalProxyNow(serverUuid, requestedPort, autoSelectedPort, portToEnable, vpnWasActive) { + if (!SettingsController.enableLocalProxy(serverUuid, portToEnable)) { + PageController.showNotificationMessage(qsTr("Failed to enable local proxy. Check the port (%1-%2).") + .arg(root.localProxyPortMin) + .arg(root.localProxyPortMax)) + return false + } + + root.pendingStartRequestedPort = requestedPort + root.pendingStartAutoSelectedPort = autoSelectedPort + root.pendingStartVpnWasActive = vpnWasActive + startSuccessToastTimer.restart() + return true + } function getPortField() { var item = listView.itemAtIndex(0) @@ -54,9 +82,6 @@ PageType { return } const wasVpnActive = ConnectionController.isConnected || ConnectionController.isConnectionInProgress - if (wasVpnActive) { - ConnectionController.closeConnection() - } let serverUuid = ServersModel.processedServerUuid if (!serverUuid && ServersModel.defaultIndex !== undefined) { @@ -100,18 +125,20 @@ PageType { } const portToEnable = autoSelectedPort > 0 ? autoSelectedPort : requestedPort - if (!SettingsController.enableLocalProxy(serverUuid, portToEnable)) { - PageController.showNotificationMessage(qsTr("Failed to enable local proxy. Check the port (%1-%2).") - .arg(root.localProxyPortMin) - .arg(root.localProxyPortMax)) + if (wasVpnActive) { + root.pendingEnableAfterVpnDisconnect = true + root.pendingEnableServerUuid = serverUuid + root.pendingEnableRequestedPort = requestedPort + root.pendingEnableAutoSelectedPort = autoSelectedPort + root.pendingEnablePortToUse = portToEnable + ConnectionController.closeConnection() return } - root.pendingStartRequestedPort = requestedPort - root.pendingStartAutoSelectedPort = autoSelectedPort - root.pendingStartVpnWasActive = wasVpnActive - startSuccessToastTimer.restart() + + root.enableLocalProxyNow(serverUuid, requestedPort, autoSelectedPort, portToEnable, false) } else { startSuccessToastTimer.stop() + root.clearPendingEnableAfterVpnDisconnect() root.pendingStartRequestedPort = -1 root.pendingStartAutoSelectedPort = -1 root.pendingStartVpnWasActive = false @@ -345,6 +372,28 @@ PageType { } } + Connections { + target: ConnectionController + + function onConnectionStateChanged() { + if (!root.pendingEnableAfterVpnDisconnect) { + return + } + + if (ConnectionController.isConnected || ConnectionController.isConnectionInProgress) { + return + } + + const serverUuid = root.pendingEnableServerUuid + const requestedPort = root.pendingEnableRequestedPort + const autoSelectedPort = root.pendingEnableAutoSelectedPort + const portToEnable = root.pendingEnablePortToUse + root.clearPendingEnableAfterVpnDisconnect() + + root.enableLocalProxyNow(serverUuid, requestedPort, autoSelectedPort, portToEnable, true) + } + } + Connections { target: SettingsController