From 1892db4375ddcb0cd8367f5eca87931174816556 Mon Sep 17 00:00:00 2001 From: vkamn Date: Tue, 3 Mar 2026 19:58:32 +0700 Subject: [PATCH] fix: remove nested qeventloop from isConfigValid (also rename to validateConfig) (#2305) * fix: remove nested qeventloop from isConfigValid (also rename to validateConfig) * chore: bump version --- CMakeLists.txt | 4 +- client/cmake/macos_ne.cmake | 2 +- client/core/controllers/coreController.cpp | 6 +- client/ui/controllers/installController.cpp | 111 +++++++++++--------- client/ui/controllers/installController.h | 3 +- 5 files changed, 73 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07808e0d7..78279e1f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -set(AMNEZIAVPN_VERSION 4.8.14.1) +set(AMNEZIAVPN_VERSION 4.8.14.3) project(${PROJECT} VERSION ${AMNEZIAVPN_VERSION} DESCRIPTION "AmneziaVPN" @@ -12,7 +12,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) -set(APP_ANDROID_VERSION_CODE 2112) +set(APP_ANDROID_VERSION_CODE 2114) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/cmake/macos_ne.cmake b/client/cmake/macos_ne.cmake index 749053757..02dfb4122 100644 --- a/client/cmake/macos_ne.cmake +++ b/client/cmake/macos_ne.cmake @@ -163,7 +163,7 @@ add_custom_command(TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/Contents/Frameworks COMMAND /usr/bin/find "$/Contents/Frameworks/OpenVPNAdapter.framework" -name "*.sha256" -delete - COMMAND /usr/bin/codesign --force --sign "Apple Distribution" + COMMAND /usr/bin/codesign --force --sign "Apple Distribution: Privacy Technologies OU" "$/Contents/Frameworks/OpenVPNAdapter.framework/Versions/Current/OpenVPNAdapter" COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Signing OpenVPNAdapter framework" diff --git a/client/core/controllers/coreController.cpp b/client/core/controllers/coreController.cpp index 47880ee91..c8ea65e5d 100644 --- a/client/core/controllers/coreController.cpp +++ b/client/core/controllers/coreController.cpp @@ -368,7 +368,11 @@ void CoreController::initPrepareConfigHandler() return; } - if (!m_installController->isConfigValid()) { + m_installController->validateConfig(); + }); + + connect(m_installController.get(), &InstallController::configValidated, this, [this](bool isValid) { + if (!isValid) { emit m_vpnConnection->connectionStateChanged(Vpn::ConnectionState::Disconnected); return; } diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index e15f5db20..8e1e198f2 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -987,79 +987,94 @@ void InstallController::addEmptyServer() emit installServerFinished(tr("Server added successfully")); } -bool InstallController::isConfigValid() +void InstallController::validateConfig() { int serverIndex = m_serversModel->getDefaultServerIndex(); QJsonObject serverConfigObject = m_serversModel->getServerConfig(serverIndex); if (apiUtils::isServerFromApi(serverConfigObject)) { - return true; + emit configValidated(true); + return; } if (!m_serversModel->data(serverIndex, ServersModel::Roles::HasInstalledContainers).toBool()) { emit noInstalledContainers(); - return false; + emit configValidated(false); + return; } DockerContainer container = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); if (container == DockerContainer::None) { emit installationErrorOccurred(ErrorCode::NoInstalledContainersError); - return false; + emit configValidated(false); + return; } - QSharedPointer serverController(new ServerController(m_settings)); - VpnConfigurationsController vpnConfigurationController(m_settings, serverController); - QJsonObject containerConfig = m_containersModel->getContainerConfig(container); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); + QSharedPointer serverController(new ServerController(m_settings)); - QFutureWatcher watcher; + auto isProtocolConfigExists = [](const QJsonObject &containerConfig, const DockerContainer container) { + for (Proto protocol : ContainerProps::protocolsForContainer(container)) { + QString protocolConfig = + containerConfig.value(ProtocolProps::protoToString(protocol)).toObject().value(config_key::last_config).toString(); - QFuture future = QtConcurrent::run([this, container, &credentials, &containerConfig, &serverController]() { - ErrorCode errorCode = ErrorCode::NoError; - - auto isProtocolConfigExists = [](const QJsonObject &containerConfig, const DockerContainer container) { - for (Proto protocol : ContainerProps::protocolsForContainer(container)) { - QString protocolConfig = - containerConfig.value(ProtocolProps::protoToString(protocol)).toObject().value(config_key::last_config).toString(); - - if (protocolConfig.isEmpty()) { - return false; - } - } - return true; - }; - - if (!isProtocolConfigExists(containerConfig, container)) { - VpnConfigurationsController vpnConfigurationController(m_settings, serverController); - errorCode = vpnConfigurationController.createProtocolConfigForContainer(credentials, container, containerConfig); - if (errorCode != ErrorCode::NoError) { - return errorCode; - } - m_serversModel->updateContainerConfig(container, containerConfig); - - errorCode = m_clientManagementModel->appendClient(container, credentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName()), serverController); - if (errorCode != ErrorCode::NoError) { - return errorCode; + if (protocolConfig.isEmpty()) { + return false; } } - return errorCode; - }); + return true; + }; - QEventLoop wait; - connect(&watcher, &QFutureWatcher::finished, &wait, &QEventLoop::quit); - watcher.setFuture(future); - wait.exec(); - - ErrorCode errorCode = watcher.result(); - - if (errorCode != ErrorCode::NoError) { - emit installationErrorOccurred(errorCode); - return false; + if (isProtocolConfigExists(containerConfig, container)) { + emit configValidated(true); + return; } - return true; + + struct ValidationResult { + ErrorCode errorCode = ErrorCode::NoError; + QJsonObject containerConfig; + }; + + QFuture future = + QtConcurrent::run([settings = m_settings, serverController, credentials, containerConfig, container]() mutable { + ValidationResult result; + result.containerConfig = containerConfig; + + VpnConfigurationsController vpnConfigurationController(settings, serverController); + result.errorCode = vpnConfigurationController.createProtocolConfigForContainer(credentials, container, + result.containerConfig); + return result; + }); + + auto *watcher = new QFutureWatcher(this); + connect(watcher, &QFutureWatcher::finished, this, + [this, watcher, container, credentials, serverController]() { + auto result = watcher->result(); + watcher->deleteLater(); + + if (result.errorCode != ErrorCode::NoError) { + emit installationErrorOccurred(result.errorCode); + emit configValidated(false); + return; + } + + m_serversModel->updateContainerConfig(container, result.containerConfig); + + ErrorCode appendError = m_clientManagementModel->appendClient( + container, credentials, result.containerConfig, + QString("Admin [%1]").arg(QSysInfo::prettyProductName()), serverController); + + if (appendError != ErrorCode::NoError) { + emit installationErrorOccurred(appendError); + emit configValidated(false); + return; + } + + emit configValidated(true); + }); + watcher->setFuture(future); } bool InstallController::isUpdateDockerContainerRequired(const DockerContainer container, const QJsonObject &oldConfig, diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index d18ba946d..034aa8494 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -50,9 +50,10 @@ public slots: void addEmptyServer(); - bool isConfigValid(); + void validateConfig(); signals: + void configValidated(bool isValid); void installContainerFinished(const QString &finishMessage, bool isServiceInstall); void installServerFinished(const QString &finishMessage);