From 10ea9b418af6d82927ed9105674d8a031b44f7f8 Mon Sep 17 00:00:00 2001 From: Nethius Date: Sun, 7 Apr 2024 01:42:17 +0700 Subject: [PATCH] supported container on connection (#736) --- .../ui/controllers/connectionController.cpp | 5 ++ client/ui/controllers/installController.cpp | 88 +++++++++++-------- client/ui/models/containers_model.cpp | 10 +++ client/ui/models/containers_model.h | 3 + client/ui/models/servers_model.cpp | 5 +- .../qml/Components/HomeContainersListView.qml | 7 +- .../qml/Pages2/PageSetupWizardInstalling.qml | 5 +- 7 files changed, 77 insertions(+), 46 deletions(-) diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index d2189101..91d07e10 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -62,6 +62,11 @@ void ConnectionController::openConnection() DockerContainer container = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); + if (!m_containersModel->isSupportedByCurrentPlatform(container)) { + emit connectionErrorOccurred(tr("The selected protocol is not supported on the current platform")); + return; + } + if (container == DockerContainer::None) { emit connectionErrorOccurred(tr("VPN Protocols is not installed.\n Please install VPN container at first")); return; diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index e0da065c..dc0cb00a 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -188,19 +188,24 @@ void InstallController::installServer(const DockerContainer container, const QMa VpnConfigurationsController vpnConfigurationController(m_settings); for (auto iterator = installedContainers.begin(); iterator != installedContainers.end(); iterator++) { auto containerConfig = iterator.value(); - auto errorCode = - vpnConfigurationController.createProtocolConfigForContainer(m_processedServerCredentials, iterator.key(), containerConfig); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; - } - containerConfigs.append(containerConfig); - errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; + if (ContainerProps::isSupportedByCurrentPlatform(container)) { + auto errorCode = + vpnConfigurationController.createProtocolConfigForContainer(m_processedServerCredentials, iterator.key(), containerConfig); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + containerConfigs.append(containerConfig); + + errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, + QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + } else { + containerConfigs.append(containerConfig); } } @@ -222,18 +227,23 @@ void InstallController::installContainer(const DockerContainer container, const QJsonObject containerConfig = m_containersModel->getContainerConfig(iterator.key()); if (containerConfig.isEmpty()) { containerConfig = iterator.value(); - auto errorCode = vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, iterator.key(), containerConfig); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; - } - m_serversModel->addContainerConfig(iterator.key(), containerConfig); - errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; + if (ContainerProps::isSupportedByCurrentPlatform(container)) { + auto errorCode = vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, iterator.key(), containerConfig); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + m_serversModel->addContainerConfig(iterator.key(), containerConfig); + + errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, + QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + } else { + m_serversModel->addContainerConfig(iterator.key(), containerConfig); } if (container != iterator.key()) { // skip the newly installed container @@ -279,22 +289,28 @@ void InstallController::scanServerForInstalledContainers() VpnConfigurationsController vpnConfigurationController(m_settings); for (auto iterator = installedContainers.begin(); iterator != installedContainers.end(); iterator++) { - QJsonObject containerConfig = m_containersModel->getContainerConfig(iterator.key()); + auto container = iterator.key(); + QJsonObject containerConfig = m_containersModel->getContainerConfig(container); if (containerConfig.isEmpty()) { containerConfig = iterator.value(); - auto errorCode = - vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, iterator.key(), containerConfig); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; - } - m_serversModel->addContainerConfig(iterator.key(), containerConfig); - errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); - if (errorCode) { - emit installationErrorOccurred(errorString(errorCode)); - return; + if (ContainerProps::isSupportedByCurrentPlatform(container)) { + auto errorCode = + vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, container, containerConfig); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + m_serversModel->addContainerConfig(container, containerConfig); + + errorCode = m_clientManagementModel->appendClient(container, serverCredentials, containerConfig, + QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + if (errorCode) { + emit installationErrorOccurred(errorString(errorCode)); + return; + } + } else { + m_serversModel->addContainerConfig(container, containerConfig); } isInstalledContainerAddedToGui = true; diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index 87786577..b8633a18 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -83,6 +83,16 @@ QJsonObject ContainersModel::getContainerConfig(const int containerIndex) return qvariant_cast(data(index(containerIndex), ConfigRole)); } +bool ContainersModel::isSupportedByCurrentPlatform(const int containerIndex) +{ + return qvariant_cast(data(index(containerIndex), IsSupportedRole)); +} + +bool ContainersModel::isServiceContainer(const int containerIndex) +{ + return qvariant_cast(data(index(containerIndex), ServiceTypeRole) == ServiceType::Other); +} + QHash ContainersModel::roleNames() const { QHash roles; diff --git a/client/ui/models/containers_model.h b/client/ui/models/containers_model.h index 740e54b4..9999307f 100644 --- a/client/ui/models/containers_model.h +++ b/client/ui/models/containers_model.h @@ -49,6 +49,9 @@ public slots: QJsonObject getContainerConfig(const int containerIndex); + bool isSupportedByCurrentPlatform(const int containerIndex); + bool isServiceContainer(const int containerIndex); + protected: QHash roleNames() const override; diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index e48528e2..61af8c8d 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -405,8 +405,9 @@ void ServersModel::addContainerConfig(const int containerIndex, const QJsonObjec server.insert(config_key::containers, containers); auto defaultContainer = server.value(config_key::defaultContainer).toString(); - if ((ContainerProps::containerFromString(defaultContainer) == DockerContainer::None - || ContainerProps::containerService(container) != ServiceType::Other)) { + if (ContainerProps::containerFromString(defaultContainer) == DockerContainer::None + && ContainerProps::containerService(container) != ServiceType::Other + && ContainerProps::isSupportedByCurrentPlatform(container)) { server.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); } diff --git a/client/ui/qml/Components/HomeContainersListView.qml b/client/ui/qml/Components/HomeContainersListView.qml index f2a7ae88..501dc616 100644 --- a/client/ui/qml/Components/HomeContainersListView.qml +++ b/client/ui/qml/Components/HomeContainersListView.qml @@ -51,7 +51,7 @@ ListView { imageSource: "qrc:/images/controls/download.svg" showImage: !isInstalled - checkable: isInstalled && !ConnectionController.isConnected && isSupported + checkable: isInstalled && !ConnectionController.isConnected checked: proxyDefaultServerContainersModel.mapToSource(index) === ServersModel.getDefaultServerData("defaultContainer") onClicked: { @@ -64,11 +64,6 @@ ListView { containersDropDown.close() ServersModel.setDefaultContainer(ServersModel.defaultIndex, proxyDefaultServerContainersModel.mapToSource(index)) } else { - if (!isSupported && isInstalled) { - PageController.showErrorMessage(qsTr("The selected protocol is not supported on the current platform")) - return - } - ContainersModel.setProcessedContainerIndex(proxyDefaultServerContainersModel.mapToSource(index)) InstallController.setShouldCreateServer(false) PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings) diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index 87b0a433..632bb727 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -25,8 +25,9 @@ PageType { target: InstallController function onInstallContainerFinished(finishedMessage, isServiceInstall) { - if (!ConnectionController.isConnected && !isServiceInstall) { - ServersModel.setDefaultContainer(ServersModel.processedIndex, ContainersModel.getProcessedContainerIndex()) + var containerIndex = ContainersModel.getProcessedContainerIndex() + if (!ConnectionController.isConnected && !ContainersModel.isServiceContainer(containerIndex)) { + ServersModel.setDefaultContainer(ServersModel.processedIndex, containerIndex) } PageController.closePage() // close installing page