diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 1725e1f8..cdcee5f4 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -336,6 +336,8 @@ void AmneziaApplication::initControllers() &PageController::showPassphraseRequestDrawer); connect(m_pageController.get(), &PageController::passphraseRequestDrawerClosed, m_installController.get(), &InstallController::setEncryptedPassphrase); + connect(m_installController.get(), &InstallController::currentContainerChanged, m_connectionController.get(), + &ConnectionController::onCurrentContainerChanged); m_importController.reset(new ImportController(m_serversModel, m_containersModel, m_settings)); m_engine->rootContext()->setContextProperty("ImportController", m_importController.get()); diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index b0f8146f..a82785eb 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -290,13 +290,11 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, return startupContainerWorker(credentials, container, config); } -ErrorCode ServerController::updateContainer(const ServerCredentials &credentials, DockerContainer container, +ErrorCode ServerController::updateContainer(const bool reinstallRequired, + const ServerCredentials &credentials, + DockerContainer container, const QJsonObject &oldConfig, QJsonObject &newConfig) { - bool reinstallRequired = isReinstallContainerRequired(container, oldConfig, newConfig); - qDebug() << "ServerController::updateContainer for container" << container << "reinstall required is" - << reinstallRequired; - if (reinstallRequired) { return setupContainer(credentials, container, newConfig, true); } else { diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index cb74d571..d3f242a3 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -26,8 +26,11 @@ public: ErrorCode removeContainer(const ServerCredentials &credentials, DockerContainer container); ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config, bool isUpdate = false); - ErrorCode updateContainer(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &oldConfig, QJsonObject &newConfig); + ErrorCode updateContainer(const bool reinstallRequired, const ServerCredentials &credentials, + DockerContainer container, + const QJsonObject &oldConfig, + QJsonObject &newConfig); + ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers); @@ -60,6 +63,8 @@ public: ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &callback); + bool isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, + const QJsonObject &newConfig); private: ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container); ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, @@ -72,8 +77,7 @@ private: ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config); - bool isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, - const QJsonObject &newConfig); + ErrorCode isUserInSudo(const ServerCredentials &credentials, DockerContainer container); ErrorCode isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container); diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 0754b024..180d96e7 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -118,6 +118,14 @@ void ConnectionController::onConnectionStateChanged(Vpn::ConnectionState state) emit connectionStateChanged(); } +void ConnectionController::onCurrentContainerChanged() +{ + if(m_isConnected || m_isConnectionInProgress) { + emit reconnectWithChangedContainer(tr("Settings updated successfully, Reconnnection...")); + openConnection(); + } +} + QString ConnectionController::connectionStateText() const { return m_connectionStateText; diff --git a/client/ui/controllers/connectionController.h b/client/ui/controllers/connectionController.h index 5a35f9d8..5ee7a4ca 100644 --- a/client/ui/controllers/connectionController.h +++ b/client/ui/controllers/connectionController.h @@ -32,6 +32,8 @@ public slots: QString getLastConnectionError(); void onConnectionStateChanged(Vpn::ConnectionState state); + void onCurrentContainerChanged(); + signals: void connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig); @@ -39,6 +41,7 @@ signals: void connectionStateChanged(); void connectionErrorOccurred(const QString &errorMessage); + void reconnectWithChangedContainer(const QString &message); private: QSharedPointer m_serversModel; diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index c0e9acbb..2d82a4c2 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -254,12 +254,26 @@ void InstallController::updateContainer(QJsonObject config) ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); - auto errorCode = serverController.updateContainer(serverCredentials, container, oldContainerConfig, config); + bool reinstallRequired = serverController.isReinstallContainerRequired(container, oldContainerConfig, config); + auto errorCode = serverController.updateContainer(reinstallRequired, serverCredentials, container, oldContainerConfig, config); if (errorCode == ErrorCode::NoError) { m_containersModel->setData(modelIndex, config, ContainersModel::Roles::ConfigRole); m_protocolModel->updateModel(config); - emit updateContainerFinished(); + bool isCurrentContainerChanged = false; + if (reinstallRequired && + (serverIndex == m_serversModel->getDefaultServerIndex()) && + (container == m_containersModel->getDefaultContainer()) ) { + isCurrentContainerChanged = true; + } + + + if (isCurrentContainerChanged) { + emit currentContainerChanged(); + } else { + emit updateContainerFinished(tr("Settings updated successfully")); + } + return; } diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index 47fc5dab..fc924d72 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -49,7 +49,7 @@ signals: void installContainerFinished(const QString &finishMessage, bool isServiceInstall); void installServerFinished(const QString &finishMessage); - void updateContainerFinished(); + void updateContainerFinished(const QString& message); void scanServerFinished(bool isInstalledContainerFound); @@ -66,6 +66,8 @@ signals: void serverIsBusy(const bool isBusy); + void currentContainerChanged(); + private: void installServer(DockerContainer container, QJsonObject &config); void installContainer(DockerContainer container, QJsonObject &config); diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index e15c5ec7..1dd9af71 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -13,11 +13,19 @@ import "../Components" PageType { id: root + Connections { + target: ConnectionController + + function onReconnectWithChangedContainer(message) { + PageController.showNotificationMessage(message) + } + } + Connections { target: InstallController - function onUpdateContainerFinished() { - PageController.showNotificationMessage(qsTr("Settings updated successfully")) + function onUpdateContainerFinished(message) { + PageController.showNotificationMessage(message) } } diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index aed1dbc1..741655ea 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -15,11 +15,19 @@ import "../Components" PageType { id: root + Connections { + target: ConnectionController + + function onReconnectWithChangedContainer(message) { + PageController.showNotificationMessage(message) + } + } + Connections { target: InstallController - function onUpdateContainerFinished() { - PageController.showNotificationMessage(qsTr("Settings updated successfully")) + function onUpdateContainerFinished(message) { + PageController.showNotificationMessage(message) } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index fe0ef8c3..f168efc1 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -13,11 +13,20 @@ import "../Components" PageType { id: root + + Connections { + target: ConnectionController + + function onReconnectWithChangedContainer(message) { + PageController.showNotificationMessage(message) + } + } + Connections { target: InstallController - function onUpdateContainerFinished() { - PageController.showNotificationMessage(qsTr("Settings updated successfully")) + function onUpdateContainerFinished(message) { + PageController.showNotificationMessage(message) } }