From ddc3fe7807b0177288d1cf8d8641a5deae93fe2e Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 20 Feb 2023 09:46:50 +0300 Subject: [PATCH] Added the advanced settings page - added a button to scan the server for installed containers - added a check on the presence of installed containers before configuring the server, if the containers are already installed, then we will add them to the GUI - added new control element - PopupWarning.qml --- client/core/servercontroller.cpp | 36 +++-- client/core/servercontroller.h | 2 +- client/resources.qrc | 2 + client/ui/pages.h | 2 +- .../AdvancedServerSettingsLogic.cpp | 63 +++++++++ .../pages_logic/AdvancedServerSettingsLogic.h | 30 +++++ .../ui/pages_logic/GeneralSettingsLogic.cpp | 20 +-- .../ui/pages_logic/ServerContainersLogic.cpp | 55 ++++---- client/ui/pages_logic/ServerListLogic.cpp | 2 +- client/ui/pages_logic/ServerSettingsLogic.cpp | 42 +++--- .../ui/pages_logic/ShareConnectionLogic.cpp | 28 ++-- client/ui/pages_logic/StartPageLogic.cpp | 2 +- client/ui/pages_logic/ViewConfigLogic.cpp | 4 +- .../ui/pages_logic/protocols/CloakLogic.cpp | 14 +- .../ui/pages_logic/protocols/OpenVpnLogic.cpp | 14 +- .../protocols/OtherProtocolsLogic.cpp | 2 +- .../protocols/ShadowSocksLogic.cpp | 14 +- client/ui/qml/Controls/PopupWarning.qml | 34 +++++ .../qml/Pages/PageAdvancedServerSettings.qml | 100 ++++++++++++++ client/ui/qml/Pages/PageServerSettings.qml | 31 ++--- client/ui/qml/main.qml | 8 ++ client/ui/uilogic.cpp | 123 ++++++++++++++---- client/ui/uilogic.h | 15 ++- 23 files changed, 487 insertions(+), 156 deletions(-) create mode 100644 client/ui/pages_logic/AdvancedServerSettingsLogic.cpp create mode 100644 client/ui/pages_logic/AdvancedServerSettingsLogic.h create mode 100644 client/ui/qml/Controls/PopupWarning.qml create mode 100644 client/ui/qml/Pages/PageAdvancedServerSettings.qml diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index e2095492..9b52071c 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -415,9 +415,6 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, //qDebug().noquote() << QJsonDocument(config).toJson(); ErrorCode e = ErrorCode::NoError; - e = isContainerAlreadyInstalled(credentials, container); - if (e) return e; - e = installDockerWorker(credentials, container); if (e) return e; qDebug().noquote() << "ServerController::setupContainer installDockerWorker finished"; @@ -860,7 +857,7 @@ QString ServerController::replaceVars(const QString &script, const Vars &vars) return s; } -ErrorCode ServerController::isContainerAlreadyInstalled(const ServerCredentials &credentials, DockerContainer container) +ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers) { QString stdOut; auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { @@ -870,17 +867,36 @@ ErrorCode ServerController::isContainerAlreadyInstalled(const ServerCredentials stdOut += data + "\n"; }; - QString script = QString("sudo docker ps | grep %1").arg(ContainerProps::containerToString(container)); - - ErrorCode errorCode = runScript(credentials, - replaceVars(script, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr); + QString script = QString("sudo docker ps --format '{{.Names}} {{.Ports}}'"); + ErrorCode errorCode = runScript(credentials, script, cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } - if (!stdOut.isEmpty()) { - return ErrorCode::ServerContainerAlreadyInstalledError; + auto containersInfo = stdOut.split("\n"); + for (auto &containerInfo : containersInfo) { + if (containerInfo.isEmpty()) { + continue; + } + const static QRegularExpression containerAndPortRegExp("(amnezia-[a-z]*).*?>([0-9]*)/(udp|tcp).*"); + QRegularExpressionMatch containerAndPortMatch = containerAndPortRegExp.match(containerInfo); + if (containerAndPortMatch.hasMatch()) { + QString name = containerAndPortMatch.captured(1); + QString port = containerAndPortMatch.captured(2); + QString transportProto = containerAndPortMatch.captured(3); + DockerContainer container = ContainerProps::containerFromString(name); + Proto mainProto = ContainerProps::defaultProtocol(container); + QJsonObject config { + { config_key::container, name }, + { ProtocolProps::protoToString(mainProto), QJsonObject { + { config_key::port, port }, + { config_key::transport_proto, transportProto }} + } + }; + installedContainers.insert(container, config); + } } + return ErrorCode::NoError; } diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 0473b508..39f1f502 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -74,6 +74,7 @@ public: QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams); void setCancelInstallation(const bool cancel); + ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers); private: ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container); @@ -82,7 +83,6 @@ private: ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); - ErrorCode isContainerAlreadyInstalled(const ServerCredentials &credentials, DockerContainer container); std::shared_ptr m_settings; std::shared_ptr m_configurator; diff --git a/client/resources.qrc b/client/resources.qrc index 4651f91e..27f421a9 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -164,5 +164,7 @@ images/svg/settings_suggest_black_24dp.svg server_scripts/website_tor/Dockerfile ui/qml/Controls/PopupWithQuestion.qml + ui/qml/Pages/PageAdvancedServerSettings.qml + ui/qml/Controls/PopupWarning.qml diff --git a/client/ui/pages.h b/client/ui/pages.h index 69f417fa..dfc9a509 100644 --- a/client/ui/pages.h +++ b/client/ui/pages.h @@ -24,7 +24,7 @@ enum class Page {Start = 0, NewServer, NewServerProtocols, Vpn, Wizard, WizardLow, WizardMedium, WizardHigh, WizardVpnMode, ServerConfiguringProgress, GeneralSettings, AppSettings, NetworkSettings, ServerSettings, ServerContainers, ServersList, ShareConnection, Sites, - ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About, ViewConfig}; + ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About, ViewConfig, AdvancedServerSettings}; Q_ENUM_NS(Page) static void declareQmlPageEnum() { diff --git a/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp b/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp new file mode 100644 index 00000000..0a7ae2c0 --- /dev/null +++ b/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp @@ -0,0 +1,63 @@ +#include "AdvancedServerSettingsLogic.h" + +#include "VpnLogic.h" +#include "ui/uilogic.h" +#include "core/errorstrings.h" +#include "core/servercontroller.h" + +AdvancedServerSettingsLogic::AdvancedServerSettingsLogic(UiLogic *uiLogic, QObject *parent): PageLogicBase(uiLogic, parent), + m_labelWaitInfoVisible{true}, + m_pushButtonClearVisible{true}, + m_pushButtonClearText{tr("Clear server from Amnezia software")} +{ +} + +void AdvancedServerSettingsLogic::onUpdatePage() +{ + set_labelWaitInfoVisible(false); + set_labelWaitInfoText(""); + set_pushButtonClearVisible(m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); + const QJsonObject &server = m_settings->server(uiLogic()->m_selectedServerIndex); + const QString &port = server.value(config_key::port).toString(); + + const QString &userName = server.value(config_key::userName).toString(); + const QString &hostName = server.value(config_key::hostName).toString(); + QString name = QString("%1%2%3%4%5").arg(userName, + userName.isEmpty() ? "" : "@", + hostName, + port.isEmpty() ? "" : ":", + port); + + set_labelServerText(name); + + DockerContainer selectedContainer = m_settings->defaultContainer(uiLogic()->m_selectedServerIndex); + QString selectedContainerName = ContainerProps::containerHumanNames().value(selectedContainer); + set_labelCurrentVpnProtocolText(tr("Service: ") + selectedContainerName); +} + +void AdvancedServerSettingsLogic::onPushButtonClearServer() +{ + set_pageEnabled(false); + set_pushButtonClearText(tr("Uninstalling Amnezia software...")); + + if (m_settings->defaultServerIndex() == uiLogic()->m_selectedServerIndex) { + uiLogic()->pageLogic()->onDisconnect(); + } + + ErrorCode e = m_serverController->removeAllContainers(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex)); + m_serverController->disconnectFromHost(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex)); + if (e) { + uiLogic()->set_dialogConnectErrorText(tr("Error occurred while configuring server.") + "\n" + + errorString(e) + "\n" + tr("See logs for details.")); + emit uiLogic()->showConnectErrorDialog(); + } else { + set_labelWaitInfoVisible(true); + set_labelWaitInfoText(tr("Amnezia server successfully uninstalled")); + } + + m_settings->setContainers(uiLogic()->m_selectedServerIndex, {}); + m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, DockerContainer::None); + + set_pageEnabled(true); + set_pushButtonClearText(tr("Clear server from Amnezia software")); +} diff --git a/client/ui/pages_logic/AdvancedServerSettingsLogic.h b/client/ui/pages_logic/AdvancedServerSettingsLogic.h new file mode 100644 index 00000000..396b375a --- /dev/null +++ b/client/ui/pages_logic/AdvancedServerSettingsLogic.h @@ -0,0 +1,30 @@ +#ifndef ADVANCEDSERVERSETTINGSLOGIC_H +#define ADVANCEDSERVERSETTINGSLOGIC_H + +#include "PageLogicBase.h" + +class UiLogic; + +class AdvancedServerSettingsLogic : public PageLogicBase +{ + Q_OBJECT + + AUTO_PROPERTY(bool, labelWaitInfoVisible) + AUTO_PROPERTY(QString, labelWaitInfoText) + + AUTO_PROPERTY(QString, pushButtonClearText) + AUTO_PROPERTY(bool, pushButtonClearVisible) + + AUTO_PROPERTY(QString, labelServerText) + AUTO_PROPERTY(QString, labelCurrentVpnProtocolText) + +public: + explicit AdvancedServerSettingsLogic(UiLogic *uiLogic, QObject *parent = nullptr); + ~AdvancedServerSettingsLogic() = default; + + Q_INVOKABLE void onUpdatePage() override; + + Q_INVOKABLE void onPushButtonClearServer(); +}; + +#endif // ADVANCEDSERVERSETTINGSLOGIC_H diff --git a/client/ui/pages_logic/GeneralSettingsLogic.cpp b/client/ui/pages_logic/GeneralSettingsLogic.cpp index c4b04c01..cbdf2692 100644 --- a/client/ui/pages_logic/GeneralSettingsLogic.cpp +++ b/client/ui/pages_logic/GeneralSettingsLogic.cpp @@ -12,29 +12,29 @@ GeneralSettingsLogic::GeneralSettingsLogic(UiLogic *logic, QObject *parent): void GeneralSettingsLogic::onUpdatePage() { - uiLogic()->selectedServerIndex = m_settings->defaultServerIndex(); - set_existsAnyServer(uiLogic()->selectedServerIndex >= 0); - uiLogic()->selectedDockerContainer = m_settings->defaultContainer(m_settings->defaultServerIndex()); + uiLogic()->m_selectedServerIndex = m_settings->defaultServerIndex(); + set_existsAnyServer(uiLogic()->m_selectedServerIndex >= 0); + uiLogic()->m_selectedDockerContainer = m_settings->defaultContainer(m_settings->defaultServerIndex()); set_pushButtonGeneralSettingsShareConnectionEnable(m_settings->haveAuthData(m_settings->defaultServerIndex())); } void GeneralSettingsLogic::onPushButtonGeneralSettingsServerSettingsClicked() { - uiLogic()->selectedServerIndex = m_settings->defaultServerIndex(); - uiLogic()->selectedDockerContainer = m_settings->defaultContainer(m_settings->defaultServerIndex()); + uiLogic()->m_selectedServerIndex = m_settings->defaultServerIndex(); + uiLogic()->m_selectedDockerContainer = m_settings->defaultContainer(m_settings->defaultServerIndex()); emit uiLogic()->goToPage(Page::ServerSettings); } void GeneralSettingsLogic::onPushButtonGeneralSettingsShareConnectionClicked() { - uiLogic()->selectedServerIndex = m_settings->defaultServerIndex(); - uiLogic()->selectedDockerContainer = m_settings->defaultContainer(uiLogic()->selectedServerIndex); + uiLogic()->m_selectedServerIndex = m_settings->defaultServerIndex(); + uiLogic()->m_selectedDockerContainer = m_settings->defaultContainer(uiLogic()->m_selectedServerIndex); - qobject_cast(uiLogic()->protocolsModel())->setSelectedServerIndex(uiLogic()->selectedServerIndex); - qobject_cast(uiLogic()->protocolsModel())->setSelectedDockerContainer(uiLogic()->selectedDockerContainer); + qobject_cast(uiLogic()->protocolsModel())->setSelectedServerIndex(uiLogic()->m_selectedServerIndex); + qobject_cast(uiLogic()->protocolsModel())->setSelectedDockerContainer(uiLogic()->m_selectedDockerContainer); - uiLogic()->pageLogic()->updateSharingPage(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + uiLogic()->pageLogic()->updateSharingPage(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); emit uiLogic()->goToPage(Page::ShareConnection); } diff --git a/client/ui/pages_logic/ServerContainersLogic.cpp b/client/ui/pages_logic/ServerContainersLogic.cpp index 70df71e9..6e9896ce 100644 --- a/client/ui/pages_logic/ServerContainersLogic.cpp +++ b/client/ui/pages_logic/ServerContainersLogic.cpp @@ -24,34 +24,34 @@ ServerContainersLogic::ServerContainersLogic(UiLogic *logic, QObject *parent): void ServerContainersLogic::onUpdatePage() { ContainersModel *c_model = qobject_cast(uiLogic()->containersModel()); - c_model->setSelectedServerIndex(uiLogic()->selectedServerIndex); + c_model->setSelectedServerIndex(uiLogic()->m_selectedServerIndex); ProtocolsModel *p_model = qobject_cast(uiLogic()->protocolsModel()); - p_model->setSelectedServerIndex(uiLogic()->selectedServerIndex); + p_model->setSelectedServerIndex(uiLogic()->m_selectedServerIndex); - set_isManagedServer(m_settings->haveAuthData(uiLogic()->selectedServerIndex)); + set_isManagedServer(m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); emit updatePage(); } void ServerContainersLogic::onPushButtonProtoSettingsClicked(DockerContainer c, Proto p) { qDebug()<< "ServerContainersLogic::onPushButtonProtoSettingsClicked" << c << p; - uiLogic()->selectedDockerContainer = c; - uiLogic()->protocolLogic(p)->updateProtocolPage(m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p), - uiLogic()->selectedDockerContainer, - m_settings->haveAuthData(uiLogic()->selectedServerIndex)); + uiLogic()->m_selectedDockerContainer = c; + uiLogic()->protocolLogic(p)->updateProtocolPage(m_settings->protocolConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, p), + uiLogic()->m_selectedDockerContainer, + m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); emit uiLogic()->goToProtocolPage(p); } void ServerContainersLogic::onPushButtonDefaultClicked(DockerContainer c) { - if (m_settings->defaultContainer(uiLogic()->selectedServerIndex) == c) return; + if (m_settings->defaultContainer(uiLogic()->m_selectedServerIndex) == c) return; - m_settings->setDefaultContainer(uiLogic()->selectedServerIndex, c); + m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, c); uiLogic()->onUpdateAllPages(); - if (uiLogic()->selectedServerIndex != m_settings->defaultServerIndex()) return; + if (uiLogic()->m_selectedServerIndex != m_settings->defaultServerIndex()) return; if (!uiLogic()->m_vpnConnection) return; if (!uiLogic()->m_vpnConnection->isConnected()) return; @@ -61,21 +61,21 @@ void ServerContainersLogic::onPushButtonDefaultClicked(DockerContainer c) void ServerContainersLogic::onPushButtonShareClicked(DockerContainer c) { - uiLogic()->pageLogic()->updateSharingPage(uiLogic()->selectedServerIndex, c); + uiLogic()->pageLogic()->updateSharingPage(uiLogic()->m_selectedServerIndex, c); emit uiLogic()->goToPage(Page::ShareConnection); } void ServerContainersLogic::onPushButtonRemoveClicked(DockerContainer container) { //buttonSetEnabledFunc(false); - ErrorCode e = m_serverController->removeContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), container); - m_settings->removeContainerConfig(uiLogic()->selectedServerIndex, container); + ErrorCode e = m_serverController->removeContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), container); + m_settings->removeContainerConfig(uiLogic()->m_selectedServerIndex, container); //buttonSetEnabledFunc(true); - if (m_settings->defaultContainer(uiLogic()->selectedServerIndex) == container) { - const auto &c = m_settings->containers(uiLogic()->selectedServerIndex); - if (c.isEmpty()) m_settings->setDefaultContainer(uiLogic()->selectedServerIndex, DockerContainer::None); - else m_settings->setDefaultContainer(uiLogic()->selectedServerIndex, c.keys().first()); + if (m_settings->defaultContainer(uiLogic()->m_selectedServerIndex) == container) { + const auto &c = m_settings->containers(uiLogic()->m_selectedServerIndex); + if (c.isEmpty()) m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, DockerContainer::None); + else m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, c.keys().first()); } uiLogic()->onUpdateAllPages(); } @@ -87,14 +87,21 @@ void ServerContainersLogic::onPushButtonContinueClicked(DockerContainer c, int p emit uiLogic()->goToPage(Page::ServerConfiguringProgress); qApp->processEvents(); - ErrorCode error = uiLogic()->pageLogic()->doInstallAction([this, c, &config](){ - return m_serverController->setupContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), c, config); - }); + uiLogic()->getInstalledContainers(false); //todo its work like should be? - if (error == ErrorCode::NoError || error == ErrorCode::ServerContainerAlreadyInstalledError) { - m_settings->setContainerConfig(uiLogic()->selectedServerIndex, c, config); - if (ContainerProps::containerService(c) == ServiceType::Vpn) { - m_settings->setDefaultContainer(uiLogic()->selectedServerIndex, c); + ServerCredentials credentials = m_settings->serverCredentials(uiLogic()->m_selectedServerIndex); + + if (!uiLogic()->isContainerAlreadyAddedToGui(c, credentials)) { + auto installAction = [this, c, &config](){ + return m_serverController->setupContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), c, config); + }; + ErrorCode error = uiLogic()->pageLogic()->doInstallAction(installAction); + + if (error == ErrorCode::NoError) { + m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, c, config); + if (ContainerProps::containerService(c) == ServiceType::Vpn) { + m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, c); + } } } diff --git a/client/ui/pages_logic/ServerListLogic.cpp b/client/ui/pages_logic/ServerListLogic.cpp index 42a629b3..79d13c8b 100644 --- a/client/ui/pages_logic/ServerListLogic.cpp +++ b/client/ui/pages_logic/ServerListLogic.cpp @@ -20,7 +20,7 @@ void ServerListLogic::onServerListPushbuttonDefaultClicked(int index) void ServerListLogic::onServerListPushbuttonSettingsClicked(int index) { - uiLogic()->selectedServerIndex = index; + uiLogic()->m_selectedServerIndex = index; uiLogic()->goToPage(Page::ServerSettings); } diff --git a/client/ui/pages_logic/ServerSettingsLogic.cpp b/client/ui/pages_logic/ServerSettingsLogic.cpp index 32a62e08..35a93bbb 100644 --- a/client/ui/pages_logic/ServerSettingsLogic.cpp +++ b/client/ui/pages_logic/ServerSettingsLogic.cpp @@ -27,10 +27,10 @@ void ServerSettingsLogic::onUpdatePage() { set_labelWaitInfoVisible(false); set_labelWaitInfoText(""); - set_pushButtonClearVisible(m_settings->haveAuthData(uiLogic()->selectedServerIndex)); - set_pushButtonClearClientCacheVisible(m_settings->haveAuthData(uiLogic()->selectedServerIndex)); - set_pushButtonShareFullVisible(m_settings->haveAuthData(uiLogic()->selectedServerIndex)); - const QJsonObject &server = m_settings->server(uiLogic()->selectedServerIndex); + set_pushButtonClearVisible(m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); + set_pushButtonClearClientCacheVisible(m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); + set_pushButtonShareFullVisible(m_settings->haveAuthData(uiLogic()->m_selectedServerIndex)); + const QJsonObject &server = m_settings->server(uiLogic()->m_selectedServerIndex); const QString &port = server.value(config_key::port).toString(); const QString &userName = server.value(config_key::userName).toString(); @@ -45,7 +45,7 @@ void ServerSettingsLogic::onUpdatePage() set_labelServerText(name); set_lineEditDescriptionText(server.value(config_key::description).toString()); - DockerContainer selectedContainer = m_settings->defaultContainer(uiLogic()->selectedServerIndex); + DockerContainer selectedContainer = m_settings->defaultContainer(uiLogic()->m_selectedServerIndex); QString selectedContainerName = ContainerProps::containerHumanNames().value(selectedContainer); set_labelCurrentVpnProtocolText(tr("Service: ") + selectedContainerName); } @@ -55,12 +55,12 @@ void ServerSettingsLogic::onPushButtonClearServer() set_pageEnabled(false); set_pushButtonClearText(tr("Uninstalling Amnezia software...")); - if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex) { + if (m_settings->defaultServerIndex() == uiLogic()->m_selectedServerIndex) { uiLogic()->pageLogic()->onDisconnect(); } - ErrorCode e = m_serverController->removeAllContainers(m_settings->serverCredentials(uiLogic()->selectedServerIndex)); - m_serverController->disconnectFromHost(m_settings->serverCredentials(uiLogic()->selectedServerIndex)); + ErrorCode e = m_serverController->removeAllContainers(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex)); + m_serverController->disconnectFromHost(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex)); if (e) { uiLogic()->set_dialogConnectErrorText( tr("Error occurred while configuring server.") + "\n" + @@ -73,8 +73,8 @@ void ServerSettingsLogic::onPushButtonClearServer() set_labelWaitInfoText(tr("Amnezia server successfully uninstalled")); } - m_settings->setContainers(uiLogic()->selectedServerIndex, {}); - m_settings->setDefaultContainer(uiLogic()->selectedServerIndex, DockerContainer::None); + m_settings->setContainers(uiLogic()->m_selectedServerIndex, {}); + m_settings->setDefaultContainer(uiLogic()->m_selectedServerIndex, DockerContainer::None); set_pageEnabled(true); set_pushButtonClearText(tr("Clear server from Amnezia software")); @@ -82,15 +82,15 @@ void ServerSettingsLogic::onPushButtonClearServer() void ServerSettingsLogic::onPushButtonForgetServer() { - if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex && uiLogic()->m_vpnConnection->isConnected()) { + if (m_settings->defaultServerIndex() == uiLogic()->m_selectedServerIndex && uiLogic()->m_vpnConnection->isConnected()) { uiLogic()->pageLogic()->onDisconnect(); } - m_settings->removeServer(uiLogic()->selectedServerIndex); + m_settings->removeServer(uiLogic()->m_selectedServerIndex); - if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex) { + if (m_settings->defaultServerIndex() == uiLogic()->m_selectedServerIndex) { m_settings->setDefaultServer(0); } - else if (m_settings->defaultServerIndex() > uiLogic()->selectedServerIndex) { + else if (m_settings->defaultServerIndex() > uiLogic()->m_selectedServerIndex) { m_settings->setDefaultServer(m_settings->defaultServerIndex() - 1); } @@ -99,7 +99,7 @@ void ServerSettingsLogic::onPushButtonForgetServer() } - uiLogic()->selectedServerIndex = -1; + uiLogic()->m_selectedServerIndex = -1; uiLogic()->onUpdateAllPages(); if (m_settings->serversCount() == 0) { @@ -114,9 +114,9 @@ void ServerSettingsLogic::onPushButtonClearClientCacheClicked() { set_pushButtonClearClientCacheText(tr("Cache cleared")); - const auto &containers = m_settings->containers(uiLogic()->selectedServerIndex); - for (DockerContainer container: containers.keys()) { - m_settings->clearLastConnectionConfig(uiLogic()->selectedServerIndex, container); + const auto &containers = m_settings->containers(uiLogic()->m_selectedServerIndex); + for (DockerContainer container : containers.keys()) { + m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, container); } QTimer::singleShot(3000, this, [this]() { @@ -127,9 +127,9 @@ void ServerSettingsLogic::onPushButtonClearClientCacheClicked() void ServerSettingsLogic::onLineEditDescriptionEditingFinished() { const QString &newText = lineEditDescriptionText(); - QJsonObject server = m_settings->server(uiLogic()->selectedServerIndex); + QJsonObject server = m_settings->server(uiLogic()->m_selectedServerIndex); server.insert(config_key::description, newText); - m_settings->editServer(uiLogic()->selectedServerIndex, server); + m_settings->editServer(uiLogic()->m_selectedServerIndex, server); uiLogic()->onUpdateAllPages(); } @@ -168,7 +168,7 @@ void ServerSettingsLogic::onPushButtonShareFullClicked() } } #else - uiLogic()->pageLogic()->updateSharingPage(uiLogic()->selectedServerIndex, DockerContainer::None); + uiLogic()->pageLogic()->updateSharingPage(uiLogic()->m_selectedServerIndex, DockerContainer::None); emit uiLogic()->goToShareProtocolPage(Proto::Any); #endif } diff --git a/client/ui/pages_logic/ShareConnectionLogic.cpp b/client/ui/pages_logic/ShareConnectionLogic.cpp index 85849391..26563359 100644 --- a/client/ui/pages_logic/ShareConnectionLogic.cpp +++ b/client/ui/pages_logic/ShareConnectionLogic.cpp @@ -68,8 +68,8 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked() set_shareAmneziaQrCodeTextSeriesLength(0); QJsonObject serverConfig; - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; // Full access if (shareFullAccess()) { @@ -127,8 +127,8 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked() void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked() { - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); @@ -142,8 +142,8 @@ void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked() void ShareConnectionLogic::onPushButtonShareShadowSocksGenerateClicked() { - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); QJsonObject protoConfig = m_settings->protocolConfig(serverIndex, container, Proto::ShadowSocks); @@ -186,8 +186,8 @@ void ShareConnectionLogic::onPushButtonShareShadowSocksGenerateClicked() void ShareConnectionLogic::onPushButtonShareCloakGenerateClicked() { - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); QJsonObject protoConfig = m_settings->protocolConfig(serverIndex, container, Proto::Cloak); @@ -209,8 +209,8 @@ void ShareConnectionLogic::onPushButtonShareCloakGenerateClicked() void ShareConnectionLogic::onPushButtonShareWireGuardGenerateClicked() { - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); @@ -236,8 +236,8 @@ void ShareConnectionLogic::onPushButtonShareWireGuardGenerateClicked() void ShareConnectionLogic::onPushButtonShareIkev2GenerateClicked() { - int serverIndex = uiLogic()->selectedServerIndex; - DockerContainer container = uiLogic()->selectedDockerContainer; + int serverIndex = uiLogic()->m_selectedServerIndex; + DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); Ikev2Configurator::ConnectionData connData = m_configurator->ikev2Configurator->prepareIkev2Config(credentials, container); @@ -259,8 +259,8 @@ void ShareConnectionLogic::onPushButtonShareIkev2GenerateClicked() void ShareConnectionLogic::updateSharingPage(int serverIndex, DockerContainer container) { - uiLogic()->selectedDockerContainer = container; - uiLogic()->selectedServerIndex = serverIndex; + uiLogic()->m_selectedDockerContainer = container; + uiLogic()->m_selectedServerIndex = serverIndex; set_shareFullAccess(container == DockerContainer::None); m_shareAmneziaQrCodeTextSeries.clear(); diff --git a/client/ui/pages_logic/StartPageLogic.cpp b/client/ui/pages_logic/StartPageLogic.cpp index 3c15199d..f2a3fae8 100644 --- a/client/ui/pages_logic/StartPageLogic.cpp +++ b/client/ui/pages_logic/StartPageLogic.cpp @@ -155,7 +155,7 @@ void StartPageLogic::onPushButtonConnect() set_pushButtonConnectEnabled(true); set_pushButtonConnectText(tr("Connect")); - uiLogic()->installCredentials = serverCredentials; + uiLogic()->m_installCredentials = serverCredentials; if (ok) emit uiLogic()->goToPage(Page::NewServer); } diff --git a/client/ui/pages_logic/ViewConfigLogic.cpp b/client/ui/pages_logic/ViewConfigLogic.cpp index 9ccd9d3e..5f711498 100644 --- a/client/ui/pages_logic/ViewConfigLogic.cpp +++ b/client/ui/pages_logic/ViewConfigLogic.cpp @@ -79,8 +79,8 @@ void ViewConfigLogic::importConfig() if (!configJson().contains(config_key::containers) || configJson().value(config_key::containers).toArray().isEmpty()) { - uiLogic()->selectedServerIndex = m_settings->defaultServerIndex(); - uiLogic()->selectedDockerContainer = m_settings->defaultContainer(uiLogic()->selectedServerIndex); + uiLogic()->m_selectedServerIndex = m_settings->defaultServerIndex(); + uiLogic()->m_selectedDockerContainer = m_settings->defaultContainer(uiLogic()->m_selectedServerIndex); uiLogic()->onUpdateAllPages(); emit uiLogic()->goToPage(Page::Vpn); emit uiLogic()->setStartPage(Page::Vpn); diff --git a/client/ui/pages_logic/protocols/CloakLogic.cpp b/client/ui/pages_logic/protocols/CloakLogic.cpp index 6e179013..d62f8624 100644 --- a/client/ui/pages_logic/protocols/CloakLogic.cpp +++ b/client/ui/pages_logic/protocols/CloakLogic.cpp @@ -55,10 +55,10 @@ QJsonObject CloakLogic::getProtocolConfigFromPage(QJsonObject oldConfig) void CloakLogic::onPushButtonSaveClicked() { - QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::Cloak); + QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, Proto::Cloak); protocolConfig = getProtocolConfigFromPage(protocolConfig); - QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; newContainerConfig.insert(ProtocolProps::protoToString(Proto::Cloak), protocolConfig); @@ -113,8 +113,8 @@ void CloakLogic::onPushButtonSaveClicked() progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextFunc(QString("Configuring...")); ErrorCode e = uiLogic()->pageLogic()->doInstallAction([this, containerConfig, &newContainerConfig](){ - return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), - uiLogic()->selectedDockerContainer, + return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), + uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); }, @@ -123,11 +123,11 @@ void CloakLogic::onPushButtonSaveClicked() busyInfoFuncy, cancelButtonFunc); if (!e) { - m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig); - m_settings->clearLastConnectionConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); + m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); } - qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->selectedServerIndex << uiLogic()->selectedDockerContainer; + qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->m_selectedServerIndex << uiLogic()->m_selectedDockerContainer; } void CloakLogic::onPushButtonCancelClicked() diff --git a/client/ui/pages_logic/protocols/OpenVpnLogic.cpp b/client/ui/pages_logic/protocols/OpenVpnLogic.cpp index 7ed71962..d5deecf3 100644 --- a/client/ui/pages_logic/protocols/OpenVpnLogic.cpp +++ b/client/ui/pages_logic/protocols/OpenVpnLogic.cpp @@ -105,10 +105,10 @@ void OpenVpnLogic::updateProtocolPage(const QJsonObject &openvpnConfig, DockerCo void OpenVpnLogic::onPushButtonSaveClicked() { - QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::OpenVpn); + QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, Proto::OpenVpn); protocolConfig = getProtocolConfigFromPage(protocolConfig); - QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; newContainerConfig.insert(ProtocolProps::protoToString(Proto::OpenVpn), protocolConfig); @@ -163,8 +163,8 @@ void OpenVpnLogic::onPushButtonSaveClicked() progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextFunc(QString("Configuring...")); ErrorCode e = uiLogic()->pageLogic()->doInstallAction([this, containerConfig, &newContainerConfig](){ - return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), - uiLogic()->selectedDockerContainer, + return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), + uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); }, @@ -173,10 +173,10 @@ void OpenVpnLogic::onPushButtonSaveClicked() busyInfoFuncy, cancelButtonFunc); if (!e) { - m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig); - m_settings->clearLastConnectionConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); + m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); } - qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->selectedServerIndex << uiLogic()->selectedDockerContainer; + qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->m_selectedServerIndex << uiLogic()->m_selectedDockerContainer; } QJsonObject OpenVpnLogic::getProtocolConfigFromPage(QJsonObject oldConfig) diff --git a/client/ui/pages_logic/protocols/OtherProtocolsLogic.cpp b/client/ui/pages_logic/protocols/OtherProtocolsLogic.cpp index 8bd9d105..965a3baf 100644 --- a/client/ui/pages_logic/protocols/OtherProtocolsLogic.cpp +++ b/client/ui/pages_logic/protocols/OtherProtocolsLogic.cpp @@ -81,7 +81,7 @@ void OtherProtocolsLogic::onPushButtonSftpMountDriveClicked() { QString mountPath; QString cmd; - QString host = m_settings->serverCredentials(uiLogic()->selectedServerIndex).hostName; + QString host = m_settings->serverCredentials(uiLogic()->m_selectedServerIndex).hostName; #ifdef Q_OS_WINDOWS diff --git a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp index 94a8ee04..5259a6e0 100644 --- a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp +++ b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp @@ -49,9 +49,9 @@ QJsonObject ShadowSocksLogic::getProtocolConfigFromPage(QJsonObject oldConfig) void ShadowSocksLogic::onPushButtonSaveClicked() { - QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::ShadowSocks); + QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, Proto::ShadowSocks); - QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; newContainerConfig.insert(ProtocolProps::protoToString(Proto::ShadowSocks), protocolConfig); ServerConfiguringProgressLogic::PageFunc pageFunc; @@ -105,8 +105,8 @@ void ShadowSocksLogic::onPushButtonSaveClicked() progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextFunc(QString("Configuring...")); ErrorCode e = uiLogic()->pageLogic()->doInstallAction([this, containerConfig, &newContainerConfig](){ - return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), - uiLogic()->selectedDockerContainer, + return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), + uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); }, @@ -115,10 +115,10 @@ void ShadowSocksLogic::onPushButtonSaveClicked() busyInfoFuncy, cancelButtonFunc); if (!e) { - m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig); - m_settings->clearLastConnectionConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); + m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); + m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); } - qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->selectedServerIndex << uiLogic()->selectedDockerContainer; + qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->m_selectedServerIndex << uiLogic()->m_selectedDockerContainer; } void ShadowSocksLogic::onPushButtonCancelClicked() diff --git a/client/ui/qml/Controls/PopupWarning.qml b/client/ui/qml/Controls/PopupWarning.qml new file mode 100644 index 00000000..57c332eb --- /dev/null +++ b/client/ui/qml/Controls/PopupWarning.qml @@ -0,0 +1,34 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Popup { + id: root + + property string popupWarningText + + anchors.centerIn: Overlay.overlay + modal: true + closePolicy: Popup.NoAutoClose + width: parent.width - 20 + + ColumnLayout { + width: parent.width + Text { + horizontalAlignment: Text.AlignHCenter + Layout.fillWidth: true + wrapMode: Text.WordWrap + font.pixelSize: 16 + text: root.popupWarningText + } + + BlueButtonType { + Layout.preferredWidth: parent.width / 2 + Layout.fillWidth: true + text: "Continue" + onClicked: { + root.close() + } + } + } +} diff --git a/client/ui/qml/Pages/PageAdvancedServerSettings.qml b/client/ui/qml/Pages/PageAdvancedServerSettings.qml new file mode 100644 index 00000000..a0d2a3f6 --- /dev/null +++ b/client/ui/qml/Pages/PageAdvancedServerSettings.qml @@ -0,0 +1,100 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import PageEnum 1.0 +import "./" +import "../Controls" +import "../Config" + +PageBase { + id: root + page: PageEnum.AdvancedServerSettings + logic: AdvancedServerSettingsLogic + + enabled: AdvancedServerSettingsLogic.pageEnabled + + BackButton { + id: back + } + Caption { + id: caption + text: qsTr("Advanced server settings") + anchors.horizontalCenter: parent.horizontalCenter + } + + FlickableType { + id: fl + anchors.top: caption.bottom + anchors.bottom: logo.top + contentHeight: content.height + + ColumnLayout { + id: content + enabled: logic.pageEnabled + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.rightMargin: 15 + + LabelType { + Layout.fillWidth: true + font.pixelSize: 20 + horizontalAlignment: Text.AlignHCenter + text: AdvancedServerSettingsLogic.labelCurrentVpnProtocolText + } + + TextFieldType { + Layout.fillWidth: true + font.pixelSize: 20 + horizontalAlignment: Text.AlignHCenter + text: AdvancedServerSettingsLogic.labelServerText + readOnly: true + background: Item {} + } + + LabelType { + Layout.fillWidth: true + text: AdvancedServerSettingsLogic.labelWaitInfoText + visible: AdvancedServerSettingsLogic.labelWaitInfoVisible + } + + BlueButtonType { + Layout.fillWidth: true + Layout.topMargin: 10 + text: "Scan the server for installed containers" + visible: AdvancedServerSettingsLogic.pushButtonClearVisible + onClicked: { + UiLogic.getInstalledContainers(false) + } + } + + BlueButtonType { + Layout.fillWidth: true + Layout.topMargin: 10 + text: AdvancedServerSettingsLogic.pushButtonClearText + visible: AdvancedServerSettingsLogic.pushButtonClearVisible + onClicked: { + popupClearServer.open() + } + } + + PopupWithQuestion { + id: popupClearServer + questionText: "Attention! All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. Continue?" + yesFunc: function() { + AdvancedServerSettingsLogic.onPushButtonClearServer() + close() + } + noFunc: function() { + close() + } + } + } + } + + + Logo { + id : logo + anchors.bottom: parent.bottom + } +} diff --git a/client/ui/qml/Pages/PageServerSettings.qml b/client/ui/qml/Pages/PageServerSettings.qml index 85bc07e3..7a21bfd2 100644 --- a/client/ui/qml/Pages/PageServerSettings.qml +++ b/client/ui/qml/Pages/PageServerSettings.qml @@ -74,6 +74,7 @@ PageBase { UiLogic.goToPage(PageEnum.ServerContainers) } } + BlueButtonType { Layout.fillWidth: true Layout.topMargin: 10 @@ -86,33 +87,21 @@ PageBase { BlueButtonType { Layout.fillWidth: true - Layout.topMargin: 60 - text: ServerSettingsLogic.pushButtonClearClientCacheText - visible: ServerSettingsLogic.pushButtonClearClientCacheVisible + Layout.topMargin: 10 + text: qsTr("Advanced server settings") + visible: ServerSettingsLogic.pushButtonShareFullVisible //todo onClicked: { - ServerSettingsLogic.onPushButtonClearClientCacheClicked() + UiLogic.goToPage(PageEnum.AdvancedServerSettings) } } BlueButtonType { Layout.fillWidth: true - Layout.topMargin: 10 - text: ServerSettingsLogic.pushButtonClearText - visible: ServerSettingsLogic.pushButtonClearVisible - onClicked: { - popupClearServer.open() - } - } - - PopupWithQuestion { - id: popupClearServer - questionText: "Attention! All containers will be deleted on the server. This means that configuration files, keys and certificates will be deleted. Continue?" - yesFunc: function() { - ServerSettingsLogic.onPushButtonClearServer() - close() - } - noFunc: function() { - close() + Layout.topMargin: 60 + text: ServerSettingsLogic.pushButtonClearClientCacheText + visible: ServerSettingsLogic.pushButtonClearClientCacheVisible + onClicked: { + ServerSettingsLogic.onPushButtonClearClientCacheClicked() } } diff --git a/client/ui/qml/main.qml b/client/ui/qml/main.qml index 10552c11..6e2c7911 100644 --- a/client/ui/qml/main.qml +++ b/client/ui/qml/main.qml @@ -230,6 +230,10 @@ Window { function onToggleLogPanel() { drawer_log.visible = !drawer_log.visible } + function onShowWarningMessage(message) { + popupWarning.popupWarningText = message + popupWarning.open() + } } MessageDialog { @@ -353,4 +357,8 @@ Window { } } } + + PopupWarning { + id: popupWarning + } } diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index 5328fc3b..1646b256 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -67,6 +67,7 @@ #include "pages_logic/ViewConfigLogic.h" #include "pages_logic/VpnLogic.h" #include "pages_logic/WizardLogic.h" +#include "pages_logic/AdvancedServerSettingsLogic.h" #include "pages_logic/protocols/CloakLogic.h" #include "pages_logic/protocols/OpenVpnLogic.h" @@ -157,7 +158,7 @@ void UiLogic::initalizeUiLogic() emit goToPage(Page::Start, true, false); } - selectedServerIndex = m_settings->defaultServerIndex(); + m_selectedServerIndex = m_settings->defaultServerIndex(); qInfo().noquote() << QString("Started %1 version %2").arg(APPLICATION_NAME).arg(APP_VERSION); qInfo().noquote() << QString("%1 (%2)").arg(QSysInfo::prettyProductName()).arg(QSysInfo::currentCpuArchitecture()); @@ -199,8 +200,8 @@ void UiLogic::keyPressEvent(Qt::Key key) qApp->quit(); break; case Qt::Key_H: - selectedServerIndex = m_settings->defaultServerIndex(); - selectedDockerContainer = m_settings->defaultContainer(selectedServerIndex); + m_selectedServerIndex = m_settings->defaultServerIndex(); + m_selectedDockerContainer = m_settings->defaultContainer(m_selectedServerIndex); //updateSharingPage(selectedServerIndex, m_settings->serverCredentials(selectedServerIndex), selectedDockerContainer); emit goToPage(Page::ShareConnection); @@ -214,7 +215,7 @@ void UiLogic::keyPressEvent(Qt::Key key) emit goToPage(Page::Start); break; case Qt::Key_S: - selectedServerIndex = m_settings->defaultServerIndex(); + m_selectedServerIndex = m_settings->defaultServerIndex(); emit goToPage(Page::ServerSettings); break; case Qt::Key_P: @@ -262,8 +263,8 @@ QString UiLogic::containerDesc(int container) void UiLogic::onGotoCurrentProtocolsPage() { - selectedServerIndex = m_settings->defaultServerIndex(); - selectedDockerContainer = m_settings->defaultContainer(selectedServerIndex); + m_selectedServerIndex = m_settings->defaultServerIndex(); + m_selectedDockerContainer = m_settings->defaultContainer(m_selectedServerIndex); emit goToPage(Page::ServerContainers); } @@ -325,24 +326,44 @@ void UiLogic::installServer(QMap &containers) pageLogic()->set_pushButtonCancelVisible(visible); }; - int count = 0; - ErrorCode error; - for (QMap::iterator i = containers.begin(); i != containers.end(); i++, count++) { - progressBarFunc.setTextFunc(QString("Installing %1 %2 %3").arg(count+1).arg(tr("of")).arg(containers.size())); - - error = pageLogic()->doInstallAction([&] () { - return m_serverController->setupContainer(installCredentials, i.key(), i.value()); - }, pageFunc, progressBarFunc, noButton, waitInfoFunc, busyInfoFunc, cancelButtonFunc); - - m_serverController->disconnectFromHost(installCredentials); + ErrorCode error = getInstalledContainers(true); + if (error != ErrorCode::NoError) { + return; } - if (error == ErrorCode::NoError || error == ErrorCode::ServerContainerAlreadyInstalledError) { + int count = 0; + bool isSomethingInstalled = false; + for (QMap::iterator i = containers.begin(); i != containers.end(); i++, count++) { + if (isContainerAlreadyAddedToGui(i.key(), m_installCredentials)) { + continue; + } + + isSomethingInstalled = true; + + progressBarFunc.setTextFunc(QString("Installing %1 %2 %3").arg(count + 1).arg(tr("of")).arg(containers.size())); + auto installAction = [&] () { + return m_serverController->setupContainer(m_installCredentials, i.key(), i.value()); + }; + error = pageLogic()->doInstallAction(installAction, pageFunc, progressBarFunc, + noButton, waitInfoFunc, + busyInfoFunc, cancelButtonFunc); + + m_serverController->disconnectFromHost(m_installCredentials); + } + + if (error == ErrorCode::NoError) { + if (!isSomethingInstalled) { + emit showWarningMessage("Attention! The container you are trying to install is already installed on the server. " + "All installed containers have been added to the application "); + emit setStartPage(Page::Vpn); + return; + } + QJsonObject server; - server.insert(config_key::hostName, installCredentials.hostName); - server.insert(config_key::userName, installCredentials.userName); - server.insert(config_key::password, installCredentials.password); - server.insert(config_key::port, installCredentials.port); + server.insert(config_key::hostName, m_installCredentials.hostName); + server.insert(config_key::userName, m_installCredentials.userName); + server.insert(config_key::password, m_installCredentials.password); + server.insert(config_key::port, m_installCredentials.port); server.insert(config_key::description, m_settings->nextAvailableServerName()); QJsonArray containerConfigs; @@ -358,8 +379,7 @@ void UiLogic::installServer(QMap &containers) emit setStartPage(Page::Vpn); qApp->processEvents(); - } - else { + } else { emit closePage(); } } @@ -497,4 +517,61 @@ void UiLogic::registerPagesLogic() registerPageLogic(); registerPageLogic(); registerPageLogic(); + registerPageLogic(); +} + +ErrorCode UiLogic::getInstalledContainers(bool addNewServerToGui) +{ + QMap installedContainers; + ErrorCode errorCode = m_serverController->getAlreadyInstalledContainers(m_installCredentials, installedContainers); + if (errorCode != ErrorCode::NoError) { + return errorCode; + } + + QJsonObject server; + QJsonArray containerConfigs; + if (addNewServerToGui) { + server.insert(config_key::hostName, m_installCredentials.hostName); + server.insert(config_key::userName, m_installCredentials.userName); + server.insert(config_key::password, m_installCredentials.password); + server.insert(config_key::port, m_installCredentials.port); + server.insert(config_key::description, m_settings->nextAvailableServerName()); + } + + for (auto container = installedContainers.begin(); container != installedContainers.end(); container++) { + if (isContainerAlreadyAddedToGui(container.key(), m_installCredentials)) { + continue; + } + + if (addNewServerToGui) { + containerConfigs.append(container.value()); + server.insert(config_key::containers, containerConfigs); + + } else { + m_settings->setContainerConfig(m_selectedServerIndex, container.key(), container.value()); + } + } + + if (addNewServerToGui) { + server.insert(config_key::defaultContainer, ContainerProps::containerToString(installedContainers.firstKey())); + m_settings->addServer(server); + m_settings->setDefaultServer(m_settings->serversCount() - 1); + } + + onUpdateAllPages(); + return ErrorCode::NoError; +} + +bool UiLogic::isContainerAlreadyAddedToGui(DockerContainer container, const ServerCredentials &selectedServerCredentials) +{ + for (int i = 0; i < m_settings->serversCount(); i++) { + const ServerCredentials credentials = m_settings->serverCredentials(i); + if (selectedServerCredentials.hostName == credentials.hostName && selectedServerCredentials.port == credentials.port) { + const QJsonObject containerConfig = m_settings->containerConfig(i, container); + if (!containerConfig.isEmpty()) { + return true; + } + } + } + return false; } diff --git a/client/ui/uilogic.h b/client/ui/uilogic.h index 4cc006dd..bc72223c 100644 --- a/client/ui/uilogic.h +++ b/client/ui/uilogic.h @@ -42,6 +42,7 @@ class StartPageLogic; class ViewConfigLogic; class VpnLogic; class WizardLogic; +class AdvancedServerSettingsLogic; class PageProtocolLogicBase; class OpenVpnLogic; @@ -61,6 +62,7 @@ class UiLogic : public QObject AUTO_PROPERTY(int, pagesStackDepth) AUTO_PROPERTY(int, currentPageValue) AUTO_PROPERTY(QString, dialogConnectErrorText) + AUTO_PROPERTY(QString, popupWarningText) READONLY_PROPERTY(QObject *, containersModel) READONLY_PROPERTY(QObject *, protocolsModel) @@ -87,6 +89,7 @@ public: friend class ViewConfigLogic; friend class VpnLogic; friend class WizardLogic; + friend class AdvancedServerSettingsLogic; friend class PageProtocolLogicBase; friend class OpenVpnLogic; @@ -112,11 +115,11 @@ public: Q_INVOKABLE void saveBinaryFile(const QString& desc, QString ext, const QString& data); Q_INVOKABLE void copyToClipboard(const QString& text); + Q_INVOKABLE amnezia::ErrorCode getInstalledContainers(bool addNewServerToGui); + void shareTempFile(const QString &suggestedName, QString ext, const QString& data); signals: - void dialogConnectErrorTextChanged(); - void goToPage(PageEnumNS::Page page, bool reset = true, bool slide = true); void goToProtocolPage(Proto protocol, bool reset = true, bool slide = true); void goToShareProtocolPage(Proto protocol, bool reset = true, bool slide = true); @@ -129,6 +132,7 @@ signals: void hide(); void raise(); void toggleLogPanel(); + void showWarningMessage(QString message); private slots: // containers - INOUT arg @@ -136,6 +140,7 @@ private slots: private: PageEnumNS::Page currentPage(); + bool isContainerAlreadyAddedToGui(DockerContainer container, const ServerCredentials &selectedServerCredentials); public: Q_INVOKABLE PageProtocolLogicBase *protocolLogic(Proto p); @@ -178,8 +183,8 @@ private: NotificationHandler* m_notificationHandler; - int selectedServerIndex = -1; // server index to use when proto settings page opened - DockerContainer selectedDockerContainer; // same - ServerCredentials installCredentials; // used to save cred between pages new_server and new_server_protocols and wizard + int m_selectedServerIndex = -1; // server index to use when proto settings page opened + DockerContainer m_selectedDockerContainer; // same + ServerCredentials m_installCredentials; // used to save cred between pages new_server and new_server_protocols and wizard }; #endif // UILOGIC_H