From 6f119cd08392f5b70382b143311c0f1495592a4f Mon Sep 17 00:00:00 2001 From: vkamn Date: Thu, 28 May 2026 10:57:08 +0800 Subject: [PATCH] fix: various fixes (#2662) * fix: fixed dns processing * fix: fixed proceesed index/id selection * refactor: stop using the server index as state * fix: fixed autostart and start minimized * fix: fixed typo * fix: add socks5 extractConfigFromContainer * fix: remove unused currentContainerUpdated * fix: fixed clear cached profile order --- .../core/controllers/connectionController.cpp | 22 +- client/core/controllers/coreController.cpp | 9 +- .../core/controllers/coreSignalHandlers.cpp | 6 +- .../selfhosted/installController.cpp | 2 +- .../core/controllers/settingsController.cpp | 5 + client/core/installers/socks5Installer.cpp | 33 ++- client/core/models/api/apiV2ServerConfig.cpp | 15 ++ client/core/models/api/apiV2ServerConfig.h | 4 + .../models/selfhosted/nativeServerConfig.cpp | 15 ++ .../models/selfhosted/nativeServerConfig.h | 4 + .../selfhosted/selfHostedUserServerConfig.cpp | 16 ++ .../selfhosted/selfHostedUserServerConfig.h | 4 + client/tests/testComplexOperations.cpp | 2 +- client/tests/testDefaultServerChange.cpp | 2 +- client/tests/testMultipleImports.cpp | 2 +- client/tests/testSelfHostedServerSetup.cpp | 2 +- client/tests/testServerEdgeCases.cpp | 2 +- client/tests/testServerEdit.cpp | 2 +- client/tests/testServersModelSync.cpp | 2 +- client/tests/testSettingsSignals.cpp | 17 ++ client/tests/testSignalOrder.cpp | 2 +- .../tests/testUiServersModelAndController.cpp | 18 +- .../api/subscriptionUiController.cpp | 19 +- .../api/subscriptionUiController.h | 3 + .../ui/controllers/connectionUiController.h | 1 - .../selfhosted/installUiController.cpp | 40 ++-- .../selfhosted/installUiController.h | 5 +- client/ui/controllers/serversUiController.cpp | 224 +++++++++--------- client/ui/controllers/serversUiController.h | 30 ++- .../ui/controllers/settingsUiController.cpp | 5 + client/ui/models/serversModel.cpp | 191 +++------------ client/ui/models/serversModel.h | 60 +---- client/ui/qml/Components/AdLabel.qml | 6 +- client/ui/qml/Components/ConnectButton.qml | 1 - client/ui/qml/Components/GamepadLoader.qml | 1 - .../qml/Components/HomeContainersListView.qml | 4 +- .../ui/qml/Components/RenameServerDrawer.qml | 2 +- client/ui/qml/Components/ServersListView.qml | 14 +- .../Components/SettingsContainersListView.qml | 6 +- .../Components/SubscriptionExpiredDrawer.qml | 8 +- client/ui/qml/Pages2/PageHome.qml | 12 +- .../Pages2/PageProtocolAwgClientSettings.qml | 4 +- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 4 +- .../Pages2/PageProtocolOpenVpnSettings.qml | 4 +- client/ui/qml/Pages2/PageProtocolRaw.qml | 2 +- .../PageProtocolWireGuardClientSettings.qml | 4 +- .../Pages2/PageProtocolWireGuardSettings.qml | 4 +- .../Pages2/PageProtocolXrayFlowSettings.qml | 2 +- .../PageProtocolXraySecuritySettings.qml | 2 +- .../qml/Pages2/PageProtocolXraySettings.qml | 4 +- .../PageProtocolXrayTransportSettings.qml | 2 +- .../PageProtocolXrayXPaddingBytesSettings.qml | 2 +- .../PageProtocolXrayXPaddingSettings.qml | 2 +- .../Pages2/PageProtocolXrayXmuxSettings.qml | 2 +- .../ui/qml/Pages2/PageServiceDnsSettings.qml | 2 +- .../qml/Pages2/PageServiceMtProxySettings.qml | 32 +-- .../ui/qml/Pages2/PageServiceSftpSettings.qml | 4 +- .../Pages2/PageServiceSocksProxySettings.qml | 4 +- .../qml/Pages2/PageServiceTelemtSettings.qml | 28 +-- .../PageSettingsApiAvailableCountries.qml | 26 +- .../ui/qml/Pages2/PageSettingsApiDevices.qml | 2 +- .../Pages2/PageSettingsApiNativeConfigs.qml | 6 +- .../qml/Pages2/PageSettingsApiServerInfo.qml | 40 ++-- .../Pages2/PageSettingsApiSubscriptionKey.qml | 20 +- .../ui/qml/Pages2/PageSettingsApplication.qml | 4 +- client/ui/qml/Pages2/PageSettingsDns.qml | 2 +- .../ui/qml/Pages2/PageSettingsServerData.qml | 14 +- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 29 ++- .../qml/Pages2/PageSettingsServerProtocol.qml | 12 +- .../Pages2/PageSettingsServerProtocols.qml | 2 +- .../qml/Pages2/PageSettingsServerServices.qml | 2 +- .../ui/qml/Pages2/PageSettingsServersList.qml | 8 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 2 +- .../qml/Pages2/PageSetupWizardCredentials.qml | 2 +- client/ui/qml/Pages2/PageSetupWizardEasy.qml | 2 +- .../qml/Pages2/PageSetupWizardInstalling.qml | 22 +- .../PageSetupWizardProtocolSettings.qml | 2 +- client/ui/qml/Pages2/PageShare.qml | 24 +- client/ui/qml/Pages2/PageShareFullAccess.qml | 8 +- client/ui/qml/Pages2/PageStart.qml | 36 +-- client/ui/utils/qAutoStart.cpp | 2 +- 81 files changed, 572 insertions(+), 621 deletions(-) diff --git a/client/core/controllers/connectionController.cpp b/client/core/controllers/connectionController.cpp index f360cf2f4..55a1e7a32 100644 --- a/client/core/controllers/connectionController.cpp +++ b/client/core/controllers/connectionController.cpp @@ -6,9 +6,7 @@ #include "core/utils/protocolEnum.h" #include "core/protocols/protocolUtils.h" #include "core/utils/constants/configKeys.h" -#include "core/utils/constants/protocolConstants.h" #include "core/utils/utilities.h" -#include "core/utils/networkUtilities.h" #include "core/utils/serverConfigUtils.h" #include "version.h" #include "core/utils/containerEnum.h" @@ -67,13 +65,15 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, bool isApiConfig = false; const auto kind = m_serversRepository->serverKind(serverId); + const QString primaryDns = m_appSettingsRepository->primaryDns(); + const QString secondaryDns = m_appSettingsRepository->secondaryDns(); switch (kind) { case serverConfigUtils::ConfigType::SelfHostedAdmin: { const auto cfg = m_serversRepository->selfHostedAdminConfig(serverId); if (!cfg.has_value()) return ErrorCode::InternalError; container = cfg->defaultContainer; containerConfigModel = cfg->containerConfig(container); - dns = { cfg->dns1, cfg->dns2 }; + dns = cfg->getDnsPair(m_appSettingsRepository->useAmneziaDns(), primaryDns, secondaryDns); hostName = cfg->hostName; description = cfg->description; break; @@ -83,7 +83,7 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, if (!cfg.has_value()) return ErrorCode::InternalError; container = cfg->defaultContainer; containerConfigModel = cfg->containerConfig(container); - dns = { cfg->dns1, cfg->dns2 }; + dns = cfg->getDnsPair(primaryDns, secondaryDns); hostName = cfg->hostName; description = cfg->description; break; @@ -93,7 +93,7 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, if (!cfg.has_value()) return ErrorCode::InternalError; container = cfg->defaultContainer; containerConfigModel = cfg->containerConfig(container); - dns = { cfg->dns1, cfg->dns2 }; + dns = cfg->getDnsPair(primaryDns, secondaryDns); hostName = cfg->hostName; description = cfg->description; break; @@ -105,7 +105,7 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, if (!cfg.has_value()) return ErrorCode::InternalError; container = cfg->defaultContainer; containerConfigModel = cfg->containerConfig(container); - dns = { cfg->dns1, cfg->dns2 }; + dns = cfg->getDnsPair(primaryDns, secondaryDns); hostName = cfg->hostName; description = cfg->description; configVersion = serverConfigUtils::ConfigSource::AmneziaGateway; @@ -123,16 +123,6 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, if (!isContainerSupported(container)) { return ErrorCode::NotSupportedOnThisPlatform; } - if (dns.first.isEmpty() || !NetworkUtilities::checkIPv4Format(dns.first)) { - if (m_appSettingsRepository->useAmneziaDns()) { - dns.first = protocols::dns::amneziaDnsIp; - } else { - dns.first = m_appSettingsRepository->primaryDns(); - } - } - if (dns.second.isEmpty() || !NetworkUtilities::checkIPv4Format(dns.second)) { - dns.second = m_appSettingsRepository->secondaryDns(); - } vpnConfiguration = createConnectionConfiguration(dns, isApiConfig, hostName, description, configVersion, containerConfigModel, container); diff --git a/client/core/controllers/coreController.cpp b/client/core/controllers/coreController.cpp index 77b951f9e..55dcb5745 100644 --- a/client/core/controllers/coreController.cpp +++ b/client/core/controllers/coreController.cpp @@ -178,7 +178,8 @@ void CoreController::initControllers() #ifdef Q_OS_WINDOWS m_ikev2ConfigModel, #endif - m_sftpConfigModel, m_socks5ConfigModel, m_mtProxyConfigModel, m_telemtConfigModel, this); + m_sftpConfigModel, m_socks5ConfigModel, m_mtProxyConfigModel, m_telemtConfigModel, + m_connectionController, this); setQmlContextProperty("InstallController", m_installUiController); m_importController = new ImportUiController(m_importCoreController, this); @@ -220,7 +221,8 @@ void CoreController::initControllers() m_subscriptionUiController = new SubscriptionUiController(m_serversController, m_apiServicesModel, m_servicesCatalogController, m_subscriptionController, m_apiSubscriptionPlansModel, m_apiBenefitsModel, m_apiAccountInfoModel, - m_apiCountryModel, m_apiDevicesModel, m_settingsController, this); + m_apiCountryModel, m_apiDevicesModel, m_settingsController, + m_connectionController, this); setQmlContextProperty("SubscriptionUiController", m_subscriptionUiController); m_apiNewsUiController = new ApiNewsUiController(m_newsModel, m_newsController, this); @@ -342,9 +344,6 @@ void CoreController::openConnectionByIndex(int serverIndex) if (serverId.isEmpty()) { return; } - if (m_serversModel) { - m_serversModel->setProcessedServerIndex(serverIndex); - } if (m_serversController) { m_serversController->setDefaultServer(serverId); } diff --git a/client/core/controllers/coreSignalHandlers.cpp b/client/core/controllers/coreSignalHandlers.cpp index 934f20f6a..3f8739b30 100644 --- a/client/core/controllers/coreSignalHandlers.cpp +++ b/client/core/controllers/coreSignalHandlers.cpp @@ -125,9 +125,9 @@ void CoreSignalHandlers::initInstallControllerHandler() { connect(m_coreController->m_installController, &InstallController::serverIsBusy, m_coreController->m_installUiController, &InstallUiController::serverIsBusy); connect(m_coreController->m_installUiController, &InstallUiController::cancelInstallation, m_coreController->m_installController, &InstallController::cancelInstallation); - connect(m_coreController->m_serversUiController, &ServersUiController::processedServerIndexChanged, - m_coreController->m_installUiController, [this](int serverIndex) { - if (serverIndex >= 0) { + connect(m_coreController->m_serversUiController, &ServersUiController::processedServerIdChanged, + m_coreController->m_installUiController, [this](const QString &serverId) { + if (!serverId.isEmpty()) { m_coreController->m_installUiController->clearProcessedServerCredentials(); } }); diff --git a/client/core/controllers/selfhosted/installController.cpp b/client/core/controllers/selfhosted/installController.cpp index 62973fed7..ddfbcdf47 100644 --- a/client/core/controllers/selfhosted/installController.cpp +++ b/client/core/controllers/selfhosted/installController.cpp @@ -216,9 +216,9 @@ void InstallController::clearCachedProfile(const QString &serverId, DockerContai return; } - adminConfig->clearCachedClientProfile(container); const ContainerConfig containerConfigModel = adminConfig->containerConfig(container); + adminConfig->clearCachedClientProfile(container); m_serversRepository->editServer(serverId, adminConfig->toJson(), serverConfigUtils::ConfigType::SelfHostedAdmin); emit clientRevocationRequested(serverId, containerConfigModel, container); diff --git a/client/core/controllers/settingsController.cpp b/client/core/controllers/settingsController.cpp index 3e0aae76a..e7d950e96 100644 --- a/client/core/controllers/settingsController.cpp +++ b/client/core/controllers/settingsController.cpp @@ -217,6 +217,11 @@ void SettingsController::toggleAutoStart(bool enable) bool SettingsController::isStartMinimizedEnabled() const { +#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) + if (!isAutoStartEnabled()) { + return false; + } +#endif return m_appSettingsRepository->isStartMinimized(); } diff --git a/client/core/installers/socks5Installer.cpp b/client/core/installers/socks5Installer.cpp index 3a58d36ee..6f3a6ddab 100644 --- a/client/core/installers/socks5Installer.cpp +++ b/client/core/installers/socks5Installer.cpp @@ -1,15 +1,17 @@ #include "socks5Installer.h" +#include "core/models/protocols/socks5ProxyProtocolConfig.h" #include "core/utils/containerEnum.h" #include "core/utils/containers/containerUtils.h" #include "core/utils/protocolEnum.h" -#include "core/utils/protocolEnum.h" #include "core/protocols/protocolUtils.h" #include "core/utils/constants/configKeys.h" #include "core/utils/constants/protocolConstants.h" #include "core/utils/selfhosted/sshSession.h" #include "core/utils/utilities.h" +#include + using namespace amnezia; using namespace ProtocolUtils; @@ -33,10 +35,29 @@ ContainerConfig Socks5Installer::generateConfig(DockerContainer container, int p ErrorCode Socks5Installer::extractConfigFromContainer(DockerContainer container, const ServerCredentials &credentials, SshSession* sshSession, ContainerConfig &config) { - Q_UNUSED(container); - Q_UNUSED(credentials); - Q_UNUSED(sshSession); - Q_UNUSED(config); + if (container != DockerContainer::Socks5Proxy || !sshSession) { + return ErrorCode::NoError; + } + + Socks5ProxyProtocolConfig *socks5Config = config.getSocks5ProxyProtocolConfig(); + if (!socks5Config) { + return ErrorCode::NoError; + } + + ErrorCode readError = ErrorCode::NoError; + const QByteArray configRaw = sshSession->getTextFileFromContainer( + container, credentials, QString::fromUtf8(protocols::socks5Proxy::proxyConfigPath), readError); + if (readError != ErrorCode::NoError || configRaw.trimmed().isEmpty()) { + return ErrorCode::NoError; + } + + const QString proxyConfig = QString::fromUtf8(configRaw); + static const QRegularExpression usernameAndPasswordRegExp(QStringLiteral("users (\\w+):CL:(\\w+)")); + const QRegularExpressionMatch usernameAndPasswordMatch = usernameAndPasswordRegExp.match(proxyConfig); + if (usernameAndPasswordMatch.hasMatch()) { + socks5Config->userName = usernameAndPasswordMatch.captured(1); + socks5Config->password = usernameAndPasswordMatch.captured(2); + } + return ErrorCode::NoError; } - diff --git a/client/core/models/api/apiV2ServerConfig.cpp b/client/core/models/api/apiV2ServerConfig.cpp index 2809675e5..aa02063c6 100644 --- a/client/core/models/api/apiV2ServerConfig.cpp +++ b/client/core/models/api/apiV2ServerConfig.cpp @@ -13,6 +13,7 @@ #include "core/utils/api/apiUtils.h" #include "core/models/api/apiConfig.h" #include "core/models/api/authData.h" +#include "core/utils/networkUtilities.h" namespace amnezia { @@ -67,6 +68,20 @@ ContainerConfig ApiV2ServerConfig::containerConfig(DockerContainer container) co return containers.value(container); } +QPair ApiV2ServerConfig::getDnsPair(const QString &primaryDns, const QString &secondaryDns) const +{ + QString d1 = dns1; + QString d2 = dns2; + + if (d1.isEmpty() || !NetworkUtilities::checkIPv4Format(d1)) { + d1 = primaryDns; + } + if (d2.isEmpty() || !NetworkUtilities::checkIPv4Format(d2)) { + d2 = secondaryDns; + } + return { d1, d2 }; +} + QJsonObject ApiV2ServerConfig::toJson() const { QJsonObject obj; diff --git a/client/core/models/api/apiV2ServerConfig.h b/client/core/models/api/apiV2ServerConfig.h index c2f9b8762..f27507ed1 100644 --- a/client/core/models/api/apiV2ServerConfig.h +++ b/client/core/models/api/apiV2ServerConfig.h @@ -3,6 +3,7 @@ #include #include +#include #include "core/utils/containerEnum.h" #include "core/utils/containers/containerUtils.h" @@ -43,6 +44,9 @@ struct ApiV2ServerConfig { bool isExternalPremium() const; bool hasContainers() const; ContainerConfig containerConfig(DockerContainer container) const; + + QPair getDnsPair(const QString &primaryDns, const QString &secondaryDns) const; + QJsonObject toJson() const; static ApiV2ServerConfig fromJson(const QJsonObject& json); }; diff --git a/client/core/models/selfhosted/nativeServerConfig.cpp b/client/core/models/selfhosted/nativeServerConfig.cpp index d8f0d80be..1cfd2a538 100644 --- a/client/core/models/selfhosted/nativeServerConfig.cpp +++ b/client/core/models/selfhosted/nativeServerConfig.cpp @@ -9,6 +9,7 @@ #include "core/protocols/protocolUtils.h" #include "core/utils/constants/configKeys.h" #include "core/utils/constants/protocolConstants.h" +#include "core/utils/networkUtilities.h" namespace amnezia { @@ -28,6 +29,20 @@ ContainerConfig NativeServerConfig::containerConfig(DockerContainer container) c return containers.value(container); } +QPair NativeServerConfig::getDnsPair(const QString &primaryDns, const QString &secondaryDns) const +{ + QString d1 = dns1; + QString d2 = dns2; + + if (d1.isEmpty() || !NetworkUtilities::checkIPv4Format(d1)) { + d1 = primaryDns; + } + if (d2.isEmpty() || !NetworkUtilities::checkIPv4Format(d2)) { + d2 = secondaryDns; + } + return { d1, d2 }; +} + QJsonObject NativeServerConfig::toJson() const { QJsonObject obj; diff --git a/client/core/models/selfhosted/nativeServerConfig.h b/client/core/models/selfhosted/nativeServerConfig.h index 87d11077a..46fb60f5e 100644 --- a/client/core/models/selfhosted/nativeServerConfig.h +++ b/client/core/models/selfhosted/nativeServerConfig.h @@ -3,6 +3,7 @@ #include #include +#include #include "core/utils/containerEnum.h" #include "core/utils/containers/containerUtils.h" @@ -25,6 +26,9 @@ struct NativeServerConfig { bool hasContainers() const; ContainerConfig containerConfig(DockerContainer container) const; + + QPair getDnsPair(const QString &primaryDns, const QString &secondaryDns) const; + QJsonObject toJson() const; static NativeServerConfig fromJson(const QJsonObject& json); }; diff --git a/client/core/models/selfhosted/selfHostedUserServerConfig.cpp b/client/core/models/selfhosted/selfHostedUserServerConfig.cpp index 982456ed2..9d8f77ce3 100644 --- a/client/core/models/selfhosted/selfHostedUserServerConfig.cpp +++ b/client/core/models/selfhosted/selfHostedUserServerConfig.cpp @@ -8,6 +8,7 @@ #include "core/utils/containerEnum.h" #include "core/utils/containers/containerUtils.h" #include "core/utils/protocolEnum.h" +#include "core/utils/networkUtilities.h" namespace amnezia { @@ -42,6 +43,21 @@ ContainerConfig SelfHostedUserServerConfig::containerConfig(DockerContainer cont return containers.value(container); } +QPair SelfHostedUserServerConfig::getDnsPair(const QString &primaryDns, + const QString &secondaryDns) const +{ + QString d1 = dns1; + QString d2 = dns2; + + if (d1.isEmpty() || !NetworkUtilities::checkIPv4Format(d1)) { + d1 = primaryDns; + } + if (d2.isEmpty() || !NetworkUtilities::checkIPv4Format(d2)) { + d2 = secondaryDns; + } + return { d1, d2 }; +} + QJsonObject SelfHostedUserServerConfig::toJson() const { QJsonObject obj; diff --git a/client/core/models/selfhosted/selfHostedUserServerConfig.h b/client/core/models/selfhosted/selfHostedUserServerConfig.h index 67d053a29..5c54819dc 100644 --- a/client/core/models/selfhosted/selfHostedUserServerConfig.h +++ b/client/core/models/selfhosted/selfHostedUserServerConfig.h @@ -3,6 +3,7 @@ #include #include +#include #include #include "core/utils/containerEnum.h" @@ -30,6 +31,9 @@ struct SelfHostedUserServerConfig { std::optional credentials() const; bool hasContainers() const; ContainerConfig containerConfig(DockerContainer container) const; + + QPair getDnsPair(const QString &primaryDns, const QString &secondaryDns) const; + QJsonObject toJson() const; static SelfHostedUserServerConfig fromJson(const QJsonObject &json); }; diff --git a/client/tests/testComplexOperations.cpp b/client/tests/testComplexOperations.cpp index 1117b5e13..9a6cb3a10 100644 --- a/client/tests/testComplexOperations.cpp +++ b/client/tests/testComplexOperations.cpp @@ -38,7 +38,7 @@ private slots: void init() { m_settings->clearSettings(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testDefaultServerChange.cpp b/client/tests/testDefaultServerChange.cpp index f0fb6163b..e4b6aed93 100644 --- a/client/tests/testDefaultServerChange.cpp +++ b/client/tests/testDefaultServerChange.cpp @@ -40,7 +40,7 @@ private slots: m_settings->clearSettings(); m_coreController->m_serversRepository->invalidateCache(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testMultipleImports.cpp b/client/tests/testMultipleImports.cpp index 932c0c902..e9879db28 100644 --- a/client/tests/testMultipleImports.cpp +++ b/client/tests/testMultipleImports.cpp @@ -41,7 +41,7 @@ private slots: m_settings->clearSettings(); m_coreController->m_serversRepository->invalidateCache(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testSelfHostedServerSetup.cpp b/client/tests/testSelfHostedServerSetup.cpp index fa1a783fb..6483e7f0f 100644 --- a/client/tests/testSelfHostedServerSetup.cpp +++ b/client/tests/testSelfHostedServerSetup.cpp @@ -146,7 +146,7 @@ private slots: void init() { m_settings->clearSettings(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testServerEdgeCases.cpp b/client/tests/testServerEdgeCases.cpp index 91dba71fd..9d0e865e5 100644 --- a/client/tests/testServerEdgeCases.cpp +++ b/client/tests/testServerEdgeCases.cpp @@ -40,7 +40,7 @@ private slots: m_settings->clearSettings(); m_coreController->m_serversRepository->invalidateCache(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testServerEdit.cpp b/client/tests/testServerEdit.cpp index 4e101eb6e..c48286192 100644 --- a/client/tests/testServerEdit.cpp +++ b/client/tests/testServerEdit.cpp @@ -40,7 +40,7 @@ private slots: m_settings->clearSettings(); m_coreController->m_serversRepository->invalidateCache(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testServersModelSync.cpp b/client/tests/testServersModelSync.cpp index 12b1288fe..1e5a169fc 100644 --- a/client/tests/testServersModelSync.cpp +++ b/client/tests/testServersModelSync.cpp @@ -39,7 +39,7 @@ private slots: void init() { m_settings->clearSettings(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testSettingsSignals.cpp b/client/tests/testSettingsSignals.cpp index 22c5c0677..1c557cbf4 100644 --- a/client/tests/testSettingsSignals.cpp +++ b/client/tests/testSettingsSignals.cpp @@ -133,6 +133,8 @@ private slots: void testStartMinimizedSignals() { QSignalSpy startMinimizedChangedSpy(m_coreController->m_settingsUiController, &SettingsUiController::startMinimizedChanged); + m_coreController->m_settingsUiController->toggleAutoStart(true); + bool initialStartMinimized = m_coreController->m_settingsController->isStartMinimizedEnabled(); m_coreController->m_settingsUiController->toggleStartMinimized(!initialStartMinimized); @@ -140,6 +142,21 @@ private slots: QVERIFY2(m_coreController->m_settingsController->isStartMinimizedEnabled() == !initialStartMinimized, "Start minimized state should be updated in SettingsController"); QVERIFY2(m_coreController->m_settingsUiController->isStartMinimizedEnabled() == !initialStartMinimized, "Start minimized state should be available in SettingsUiController"); QVERIFY2(m_coreController->m_appSettingsRepository->isStartMinimized() == !initialStartMinimized, "Start minimized state should be available in SecureAppSettingsRepository"); + + m_coreController->m_settingsUiController->toggleAutoStart(false); + } + + void testAutoStartDisablesStartMinimizedUi() { + QSignalSpy startMinimizedChangedSpy(m_coreController->m_settingsUiController, &SettingsUiController::startMinimizedChanged); + + m_coreController->m_settingsUiController->toggleAutoStart(true); + m_coreController->m_settingsUiController->toggleStartMinimized(true); + QVERIFY2(m_coreController->m_settingsUiController->isStartMinimizedEnabled(), "Start minimized should be enabled with autostart"); + + m_coreController->m_settingsUiController->toggleAutoStart(false); + QVERIFY2(startMinimizedChangedSpy.count() >= 1, "startMinimizedChanged signal should be emitted when autostart is disabled"); + QVERIFY2(!m_coreController->m_settingsUiController->isStartMinimizedEnabled(), "Start minimized should be disabled when autostart is disabled"); + QVERIFY2(!m_coreController->m_appSettingsRepository->isStartMinimized(), "Start minimized setting should be cleared when autostart is disabled"); } void testAutoConnectSignals() { diff --git a/client/tests/testSignalOrder.cpp b/client/tests/testSignalOrder.cpp index 8c6cf0d65..bbd6b7409 100644 --- a/client/tests/testSignalOrder.cpp +++ b/client/tests/testSignalOrder.cpp @@ -38,7 +38,7 @@ private slots: m_settings->clearSettings(); m_coreController->m_serversRepository->invalidateCache(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } diff --git a/client/tests/testUiServersModelAndController.cpp b/client/tests/testUiServersModelAndController.cpp index ca67ab612..b63d58859 100644 --- a/client/tests/testUiServersModelAndController.cpp +++ b/client/tests/testUiServersModelAndController.cpp @@ -23,18 +23,6 @@ using namespace amnezia; using namespace amnezia; -namespace { -int defaultServerRow(const QVector &descriptions, const QString &defaultServerId) -{ - for (int i = 0; i < descriptions.size(); ++i) { - if (descriptions.at(i).serverId == defaultServerId) { - return i; - } - } - return -1; -} -} // namespace - class TestUiServersModelAndController : public QObject { Q_OBJECT @@ -131,7 +119,7 @@ private slots: void init() { m_settings->clearSettings(); if (m_coreController->m_serversModel) { - m_coreController->m_serversModel->updateModel(QVector(), -1); + m_coreController->m_serversModel->updateModel(QVector(), QString()); } } @@ -274,7 +262,7 @@ private slots: QVector descriptionsNoDns = m_coreController->m_serversController->buildServerDescriptions( m_coreController->m_appSettingsRepository->useAmneziaDns()); const QString defIdNoDns = m_coreController->m_serversRepository->defaultServerId(); - m_coreController->m_serversModel->updateModel(descriptionsNoDns, defaultServerRow(descriptionsNoDns, defIdNoDns)); + m_coreController->m_serversModel->updateModel(descriptionsNoDns, defIdNoDns); QString descNoDns = m_coreController->m_serversModel->data( m_coreController->m_serversModel->index(0, 0), ServersModel::ServerDescriptionRole).toString(); @@ -293,7 +281,7 @@ private slots: QVector descriptionsWithDns = m_coreController->m_serversController->buildServerDescriptions( m_coreController->m_appSettingsRepository->useAmneziaDns()); const QString defIdWithDns = m_coreController->m_serversRepository->defaultServerId(); - m_coreController->m_serversModel->updateModel(descriptionsWithDns, defaultServerRow(descriptionsWithDns, defIdWithDns)); + m_coreController->m_serversModel->updateModel(descriptionsWithDns, defIdWithDns); QString descWithDns = m_coreController->m_serversModel->data( m_coreController->m_serversModel->index(0, 0), ServersModel::ServerDescriptionRole).toString(); diff --git a/client/ui/controllers/api/subscriptionUiController.cpp b/client/ui/controllers/api/subscriptionUiController.cpp index 581a10a2d..ab661d19c 100644 --- a/client/ui/controllers/api/subscriptionUiController.cpp +++ b/client/ui/controllers/api/subscriptionUiController.cpp @@ -65,6 +65,7 @@ SubscriptionUiController::SubscriptionUiController(ServersController* serversCon ApiCountryModel* apiCountryModel, ApiDevicesModel* apiDevicesModel, SettingsController* settingsController, + ConnectionController* connectionController, QObject *parent) : QObject(parent), m_serversController(serversController), @@ -76,13 +77,29 @@ SubscriptionUiController::SubscriptionUiController(ServersController* serversCon m_apiAccountInfoModel(apiAccountInfoModel), m_apiCountryModel(apiCountryModel), m_apiDevicesModel(apiDevicesModel), - m_settingsController(settingsController) + m_settingsController(settingsController), + m_connectionController(connectionController) { connect(m_apiServicesModel, &ApiServicesModel::serviceSelectionChanged, this, [this]() { ApiServicesModel::ApiServicesData selectedServiceData = m_apiServicesModel->selectedServiceData(); m_apiSubscriptionPlansModel->updateModel(selectedServiceData.subscriptionPlansJson); m_apiBenefitsModel->updateModel(selectedServiceData.benefits); }); + + connect(this, &SubscriptionUiController::installServerFromApiFinished, this, + [this](const QString &, int preferredDefaultServerIndex) { + if (m_connectionController->isConnected()) { + return; + } + + const int selectedServerIndex = preferredDefaultServerIndex >= 0 + ? preferredDefaultServerIndex + : (m_serversController->getServersCount() - 1); + const QString serverId = m_serversController->getServerId(selectedServerIndex); + if (!serverId.isEmpty()) { + m_serversController->setDefaultServer(serverId); + } + }); } bool SubscriptionUiController::exportVpnKey(const QString &serverId, const QString &fileName) diff --git a/client/ui/controllers/api/subscriptionUiController.h b/client/ui/controllers/api/subscriptionUiController.h index 8d28b52c9..a127bb74e 100644 --- a/client/ui/controllers/api/subscriptionUiController.h +++ b/client/ui/controllers/api/subscriptionUiController.h @@ -5,6 +5,7 @@ #include "core/controllers/serversController.h" #include "core/controllers/settingsController.h" +#include "core/controllers/connectionController.h" #include "core/controllers/api/servicesCatalogController.h" #include "core/controllers/api/subscriptionController.h" #include "ui/models/api/apiSubscriptionPlansModel.h" @@ -28,6 +29,7 @@ public: ApiCountryModel* apiCountryModel, ApiDevicesModel* apiDevicesModel, SettingsController* settingsController, + ConnectionController* connectionController, QObject *parent = nullptr); Q_PROPERTY(QList qrCodes READ getQrCodes NOTIFY vpnKeyExportReady) @@ -104,6 +106,7 @@ private: ApiCountryModel* m_apiCountryModel; ApiDevicesModel* m_apiDevicesModel; SettingsController* m_settingsController; + ConnectionController* m_connectionController; }; #endif // SUBSCRIPTIONUICONTROLLER_H diff --git a/client/ui/controllers/connectionUiController.h b/client/ui/controllers/connectionUiController.h index 14f3927ca..d490fcdba 100644 --- a/client/ui/controllers/connectionUiController.h +++ b/client/ui/controllers/connectionUiController.h @@ -44,7 +44,6 @@ signals: void connectionStateChanged(); void connectionErrorOccurred(ErrorCode errorCode); - void reconnectWithUpdatedContainer(const QString &message); void connectButtonClicked(); void preparingConfig(); diff --git a/client/ui/controllers/selfhosted/installUiController.cpp b/client/ui/controllers/selfhosted/installUiController.cpp index f413aac19..e9c92aca7 100644 --- a/client/ui/controllers/selfhosted/installUiController.cpp +++ b/client/ui/controllers/selfhosted/installUiController.cpp @@ -12,6 +12,7 @@ #include "core/utils/api/apiUtils.h" #include "core/controllers/selfhosted/installController.h" +#include "core/controllers/connectionController.h" #include "core/utils/networkUtilities.h" #include "core/utils/protocolEnum.h" #include "core/protocols/protocolUtils.h" @@ -51,6 +52,7 @@ InstallUiController::InstallUiController(InstallController *installController, Socks5ProxyConfigModel *socks5ConfigModel, MtProxyConfigModel* mtConfigModel, TelemtConfigModel *telemtConfigModel, + ConnectionController *connectionController, QObject *parent) : QObject(parent), m_installController(installController), @@ -69,7 +71,8 @@ InstallUiController::InstallUiController(InstallController *installController, m_sftpConfigModel(sftpConfigModel), m_socks5ConfigModel(socks5ConfigModel), m_mtProxyConfigModel(mtConfigModel), - m_telemtConfigModel(telemtConfigModel) + m_telemtConfigModel(telemtConfigModel), + m_connectionController(connectionController) { connect(m_installController, &InstallController::configValidated, this, &InstallUiController::configValidated); connect(m_installController, &InstallController::validationErrorOccurred, this, [this](ErrorCode errorCode) { @@ -133,6 +136,10 @@ void InstallUiController::install(DockerContainer container, int port, Transport finishMessage += tr("\nAdded containers that were already installed on the server"); } + if (!m_connectionController->isConnected()) { + m_serversController->setDefaultServer(newServerId); + } + emit installServerFinished(finishMessage); } else { const auto adminBefore = m_serversController->selfHostedAdminConfig(serverId); @@ -172,7 +179,12 @@ void InstallUiController::install(DockerContainer container, int port, Transport "All installed containers have been added to the application"); } - emit installContainerFinished(finishMessage, ContainerUtils::containerService(container) == ServiceType::Other); + const bool isServiceInstall = ContainerUtils::containerService(container) == ServiceType::Other; + if (!m_connectionController->isConnected() && !isServiceInstall) { + m_serversController->setDefaultContainer(serverId, container); + } + + emit installContainerFinished(finishMessage, isServiceInstall); } } @@ -276,15 +288,7 @@ void InstallUiController::updateContainer(const QString &serverId, int container const ContainerConfig updatedConfig = m_serversController->getContainerConfig(serverId, container); m_protocolModel->updateModel(updatedConfig); - - const auto defaultContainer = - m_serversController->getDefaultContainer(serverId); - if ((serverId == m_serversController->getDefaultServerId()) - && (container == defaultContainer)) { - emit currentContainerUpdated(); - } else { - emit updateContainerFinished(tr("Settings updated successfully"), closePage); - } + emit updateContainerFinished(tr("Settings updated successfully"), closePage); } else { emit installationErrorOccurred(errorCode); } @@ -307,13 +311,7 @@ void InstallUiController::updateContainer(const QString &serverId, int container if (errorCode == ErrorCode::NoError) { ContainerConfig updatedConfig = m_serversController->getContainerConfig(serverId, container); m_protocolModel->updateModel(updatedConfig); - - const auto defaultContainer = m_serversController->getDefaultContainer(serverId); - if ((serverId == m_serversController->getDefaultServerId()) && (container == defaultContainer)) { - emit currentContainerUpdated(); - } else { - emit updateContainerFinished(tr("Settings updated successfully"), closePage); - } + emit updateContainerFinished(tr("Settings updated successfully"), closePage); return; } @@ -517,6 +515,12 @@ void InstallUiController::setEncryptedPassphrase(QString passphrase) void InstallUiController::addEmptyServer() { m_installController->addEmptyServer(m_processedServerCredentials); + if (!m_connectionController->isConnected()) { + const QString newServerId = m_serversController->getServerId(m_serversController->getServersCount() - 1); + if (!newServerId.isEmpty()) { + m_serversController->setDefaultServer(newServerId); + } + } emit installServerFinished(tr("Server added successfully")); } diff --git a/client/ui/controllers/selfhosted/installUiController.h b/client/ui/controllers/selfhosted/installUiController.h index b0683552a..0c956dd80 100644 --- a/client/ui/controllers/selfhosted/installUiController.h +++ b/client/ui/controllers/selfhosted/installUiController.h @@ -9,6 +9,7 @@ #include "core/utils/protocolEnum.h" #include "core/controllers/serversController.h" #include "core/controllers/settingsController.h" +#include "core/controllers/connectionController.h" #include "core/controllers/selfhosted/usersController.h" #include "core/controllers/selfhosted/installController.h" #include "core/utils/errorCodes.h" @@ -52,6 +53,7 @@ public: Socks5ProxyConfigModel* socks5ConfigModel, MtProxyConfigModel* mtConfigModel, TelemtConfigModel* telemtConfigModel, + ConnectionController* connectionController, QObject *parent = nullptr); ~InstallUiController(); @@ -127,8 +129,6 @@ signals: void serverIsBusy(const bool isBusy); void cancelInstallation(); - void currentContainerUpdated(); - void cachedProfileCleared(const QString &message); void apiConfigRemoved(const QString &message); @@ -155,6 +155,7 @@ private: Socks5ProxyConfigModel* m_socks5ConfigModel; MtProxyConfigModel* m_mtProxyConfigModel; TelemtConfigModel* m_telemtConfigModel; + ConnectionController* m_connectionController; ServerCredentials m_processedServerCredentials; diff --git a/client/ui/controllers/serversUiController.cpp b/client/ui/controllers/serversUiController.cpp index 23097ddcc..13f3d397b 100644 --- a/client/ui/controllers/serversUiController.cpp +++ b/client/ui/controllers/serversUiController.cpp @@ -31,6 +31,12 @@ bool descriptionsHaveGatewayServers(const QVector &list) } return false; } + +const ServerDescription &emptyServerDescription() +{ + static const ServerDescription s_emptyDescription; + return s_emptyDescription; +} } // namespace ServersUiController::ServersUiController(ServersController* serversController, SettingsController* settingsController, @@ -100,8 +106,6 @@ void ServersUiController::setDefaultServer(const QString &serverId) return; } m_serversController->setDefaultServer(serverId); - updateModel(); - emit defaultServerIdChanged(serverId); } void ServersUiController::setDefaultContainer(const QString &serverId, int containerIndex) @@ -120,12 +124,12 @@ void ServersUiController::toggleAmneziaDns(bool enabled) updateModel(); } -void ServersUiController::onDefaultServerChanged(const QString &/*defaultServerId*/) +void ServersUiController::onDefaultServerChanged(const QString &defaultServerId) { - updateModel(); - setProcessedServerId(m_serversController->getDefaultServerId()); + m_serversModel->setDefaultServerId(defaultServerId); updateDefaultServerContainersModel(); - emit defaultServerIdChanged(m_serversController->getDefaultServerId()); + + emit defaultServerIdChanged(defaultServerId); } void ServersUiController::updateModel() @@ -136,27 +140,21 @@ void ServersUiController::updateModel() const QString defaultServerId = m_serversController->getDefaultServerId(); const bool hadServersFromGatewayBefore = descriptionsHaveGatewayServers(m_orderedServerDescriptions); const bool hasServersFromGatewayNow = descriptionsHaveGatewayServers(descriptions); - const int listCount = descriptions.size(); - const int defaultRowInDescriptions = rowForServerId(descriptions, defaultServerId); m_orderedServerDescriptions = descriptions; - if (listCount == 0) { - setProcessedServerId(QString()); - } else if (m_processedServerIndex >= listCount) { - setProcessedServerId(defaultServerId); + if (m_orderedServerDescriptions.isEmpty()) { + if (!m_processedServerId.isEmpty()) { + setProcessedServerId(QString()); + } } else if (!m_processedServerId.isEmpty()) { const int row = rowForServerId(m_orderedServerDescriptions, m_processedServerId); if (row < 0) { - setProcessedServerId(defaultServerId); - } else { - setProcessedServerId(m_processedServerId); + setProcessedServerId(QString()); } - } else if (defaultRowInDescriptions >= 0) { - setProcessedServerId(defaultServerId); } - m_serversModel->updateModel(m_orderedServerDescriptions, defaultRowInDescriptions); + m_serversModel->updateModel(m_orderedServerDescriptions, defaultServerId); updateContainersModel(); updateDefaultServerContainersModel(); @@ -166,7 +164,6 @@ void ServersUiController::updateModel() } emit defaultServerIdChanged(defaultServerId); - emit defaultServerIndexChanged(defaultServerIndex()); } QString ServersUiController::getDefaultServerId() const @@ -176,60 +173,35 @@ QString ServersUiController::getDefaultServerId() const QString ServersUiController::getDefaultServerName() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - return description.serverName; - } - } - return QString(); + return serverName(getDefaultServerId()); } QString ServersUiController::getDefaultServerDefaultContainerName() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - return ContainerUtils::containerHumanNames().value(description.defaultContainer); - } + const auto &description = serverDescriptionById(getDefaultServerId()); + if (description.serverId.isEmpty()) { + return QString(); } - return QString(); + return ContainerUtils::containerHumanNames().value(description.defaultContainer); } QString ServersUiController::getDefaultServerDescriptionCollapsed() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - return description.collapsedServerDescription; - } - } - return QString(); + return serverDescriptionById(getDefaultServerId()).collapsedServerDescription; } QString ServersUiController::getDefaultServerImagePathCollapsed() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - if (!description.isApiV2 || description.apiServerCountryCode.isEmpty()) { - return ""; - } - return QString("qrc:/countriesFlags/images/flagKit/%1.svg").arg(description.apiServerCountryCode.toUpper()); - } + const auto &description = serverDescriptionById(getDefaultServerId()); + if (!description.isApiV2 || description.apiServerCountryCode.isEmpty()) { + return ""; } - return ""; + return QString("qrc:/countriesFlags/images/flagKit/%1.svg").arg(description.apiServerCountryCode.toUpper()); } QString ServersUiController::getDefaultServerDescriptionExpanded() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - return description.expandedServerDescription; - } - } - return QString(); + return serverDescriptionById(getDefaultServerId()).expandedServerDescription; } bool ServersUiController::isDefaultServerDefaultContainerHasSplitTunneling() const @@ -281,15 +253,75 @@ bool ServersUiController::isDefaultServerDefaultContainerHasSplitTunneling() con bool ServersUiController::isDefaultServerFromApi() const { - const QString defaultServerId = m_serversController->getDefaultServerId(); + return isServerFromApi(getDefaultServerId()); +} + +bool ServersUiController::hasServerWithWriteAccess() const +{ for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == defaultServerId) { - return description.isApiV2; + if (description.hasWriteAccess) { + return true; } } return false; } +QString ServersUiController::serverName(const QString &serverId) const +{ + return serverDescriptionById(serverId).serverName; +} + +QString ServersUiController::serverHostName(const QString &serverId) const +{ + return serverDescriptionById(serverId).hostName; +} + +int ServersUiController::serverDefaultContainer(const QString &serverId) const +{ + const auto &description = serverDescriptionById(serverId); + return description.serverId.isEmpty() ? -1 : static_cast(description.defaultContainer); +} + +bool ServersUiController::isServerFromApi(const QString &serverId) const +{ + return serverDescriptionById(serverId).isServerFromGatewayApi; +} + +bool ServersUiController::isServerCountrySelectionAvailable(const QString &serverId) const +{ + return serverDescriptionById(serverId).isCountrySelectionAvailable; +} + +bool ServersUiController::isServerHasWriteAccess(const QString &serverId) const +{ + return serverDescriptionById(serverId).hasWriteAccess; +} + +bool ServersUiController::serverHasInstalledContainers(const QString &serverId) const +{ + return serverDescriptionById(serverId).hasInstalledVpnContainers; +} + +QString ServersUiController::serverAdEndpoint(const QString &serverId) const +{ + return serverDescriptionById(serverId).adEndpoint; +} + +bool ServersUiController::isServerRenewalAvailable(const QString &serverId) const +{ + return serverDescriptionById(serverId).isRenewalAvailable; +} + +bool ServersUiController::isServerSubscriptionExpired(const QString &serverId) const +{ + return serverDescriptionById(serverId).isSubscriptionExpired; +} + +bool ServersUiController::isServerSubscriptionExpiringSoon(const QString &serverId) const +{ + return serverDescriptionById(serverId).isSubscriptionExpiringSoon; +} + int ServersUiController::getProcessedContainerIndex() const { return m_processedContainerIndex; @@ -311,27 +343,17 @@ QString ServersUiController::getProcessedServerId() const void ServersUiController::setProcessedServerId(const QString &serverId) { - const int index = serverId.isEmpty() ? -1 : serverIndexForId(serverId); - if (!serverId.isEmpty() && index < 0) { - return; - } + const int newIndex = serverId.isEmpty() ? -1 : serverIndexForId(serverId); + const QString normalizedServerId = newIndex >= 0 ? serverId : QString(); - if (m_processedServerIndex != index || m_processedServerId != serverId) { - m_processedServerIndex = index; - m_processedServerId = serverId; - m_serversModel->setProcessedServerIndex(index); + if (m_processedServerId != normalizedServerId) { + m_processedServerId = normalizedServerId; - if (index >= 0) { + if (newIndex >= 0) { updateContainersModel(); - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == serverId) { - setProcessedContainerIndex(static_cast(description.defaultContainer)); - break; - } - } for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId != serverId) { + if (description.serverId != normalizedServerId) { continue; } if (description.isApiV2) { @@ -345,45 +367,12 @@ void ServersUiController::setProcessedServerId(const QString &serverId) } emit processedServerIdChanged(m_processedServerId); - emit processedServerIndexChanged(m_processedServerIndex); } } -int ServersUiController::getProcessedServerIndex() const -{ - return m_processedServerIndex; -} - -void ServersUiController::setProcessedServerIndex(int index) -{ - if (index < 0) { - setProcessedServerId(QString()); - return; - } - const QString id = getServerId(index); - if (!id.isEmpty()) { - setProcessedServerId(id); - } -} - -int ServersUiController::defaultServerIndex() const -{ - return rowForServerId(m_orderedServerDescriptions, getDefaultServerId()); -} - bool ServersUiController::processedServerIsPremium() const { - for (const auto &description : m_orderedServerDescriptions) { - if (description.serverId == m_processedServerId) { - return description.isPremium; - } - } - return false; -} - -const ServerCredentials ServersUiController::getProcessedServerCredentials() const -{ - return m_serversController->getServerCredentials(m_processedServerId); + return processedServerDescription().isPremium; } bool ServersUiController::isDefaultServerCurrentlyProcessed() const @@ -393,18 +382,22 @@ bool ServersUiController::isDefaultServerCurrentlyProcessed() const bool ServersUiController::isProcessedServerHasWriteAccess() const { - ServerCredentials credentials = m_serversController->getServerCredentials(m_processedServerId); - return (!credentials.userName.isEmpty() && !credentials.secretData.isEmpty()); + return isServerHasWriteAccess(m_processedServerId); } -QString ServersUiController::getDefaultServerDescription(const QString &serverId) const +const ServerDescription &ServersUiController::processedServerDescription() const +{ + return serverDescriptionById(m_processedServerId); +} + +const ServerDescription &ServersUiController::serverDescriptionById(const QString &serverId) const { for (const auto &description : m_orderedServerDescriptions) { if (description.serverId == serverId) { - return description.baseDescription; + return description; } } - return QString(); + return emptyServerDescription(); } bool ServersUiController::hasServersFromGatewayApi() const @@ -467,6 +460,11 @@ int ServersUiController::getServerIndexById(const QString &serverId) const return rowForServerId(m_orderedServerDescriptions, serverId); } +int ServersUiController::getServersCount() const +{ + return m_orderedServerDescriptions.size(); +} + void ServersUiController::updateContainersModel() { if (m_processedServerId.isEmpty()) { diff --git a/client/ui/controllers/serversUiController.h b/client/ui/controllers/serversUiController.h index 6342faf22..eb85a9436 100644 --- a/client/ui/controllers/serversUiController.h +++ b/client/ui/controllers/serversUiController.h @@ -19,7 +19,6 @@ class ServersUiController : public QObject Q_OBJECT Q_PROPERTY(QString defaultServerId READ getDefaultServerId NOTIFY defaultServerIdChanged) - Q_PROPERTY(int defaultServerIndex READ defaultServerIndex NOTIFY defaultServerIndexChanged) Q_PROPERTY(QString defaultServerName READ getDefaultServerName NOTIFY defaultServerIdChanged) Q_PROPERTY(QString defaultServerDefaultContainerName READ getDefaultServerDefaultContainerName NOTIFY defaultServerIdChanged) @@ -30,9 +29,8 @@ class ServersUiController : public QObject Q_PROPERTY(bool isDefaultServerFromApi READ isDefaultServerFromApi NOTIFY defaultServerIdChanged) Q_PROPERTY(QString processedServerId READ getProcessedServerId WRITE setProcessedServerId NOTIFY processedServerIdChanged) - Q_PROPERTY(int processedServerIndex READ getProcessedServerIndex WRITE setProcessedServerIndex NOTIFY processedServerIndexChanged) Q_PROPERTY(int processedContainerIndex READ getProcessedContainerIndex WRITE setProcessedContainerIndex NOTIFY processedContainerIndexChanged) - Q_PROPERTY(bool processedServerIsPremium READ processedServerIsPremium NOTIFY processedServerIndexChanged) + Q_PROPERTY(bool processedServerIsPremium READ processedServerIsPremium NOTIFY processedServerIdChanged) Q_PROPERTY(bool hasServersFromGatewayApi READ hasServersFromGatewayApi NOTIFY hasServersFromGatewayApiChanged) @@ -72,20 +70,27 @@ public slots: QString getDefaultServerDescriptionExpanded() const; bool isDefaultServerDefaultContainerHasSplitTunneling() const; bool isDefaultServerFromApi() const; + bool hasServerWithWriteAccess() const; + + QString serverName(const QString &serverId) const; + QString serverHostName(const QString &serverId) const; + int serverDefaultContainer(const QString &serverId) const; + bool isServerFromApi(const QString &serverId) const; + bool isServerCountrySelectionAvailable(const QString &serverId) const; + bool isServerHasWriteAccess(const QString &serverId) const; + bool serverHasInstalledContainers(const QString &serverId) const; + QString serverAdEndpoint(const QString &serverId) const; + bool isServerRenewalAvailable(const QString &serverId) const; + bool isServerSubscriptionExpired(const QString &serverId) const; + bool isServerSubscriptionExpiringSoon(const QString &serverId) const; QString getProcessedServerId() const; void setProcessedServerId(const QString &serverId); - int getProcessedServerIndex() const; - void setProcessedServerIndex(int index); - - int defaultServerIndex() const; - int getProcessedContainerIndex() const; void setProcessedContainerIndex(int index); bool processedServerIsPremium() const; - const ServerCredentials getProcessedServerCredentials() const; bool isDefaultServerCurrentlyProcessed() const; bool isProcessedServerHasWriteAccess() const; @@ -97,15 +102,14 @@ public slots: QString getServerId(int index) const; int getServerIndexById(const QString &serverId) const; + int getServersCount() const; QStringList getAllInstalledServicesName(int serverIndex) const; signals: void errorOccurred(const QString &errorMessage); void finished(const QString &message); void defaultServerIdChanged(const QString &serverId); - void defaultServerIndexChanged(int index); void processedServerIdChanged(const QString &serverId); - void processedServerIndexChanged(int index); void processedContainerIndexChanged(int index); void hasServersFromGatewayApiChanged(); void updateApiCountryModel(); @@ -115,7 +119,8 @@ public: void updateModel(); private: - QString getDefaultServerDescription(const QString &serverId) const; + const ServerDescription &serverDescriptionById(const QString &serverId) const; + const ServerDescription &processedServerDescription() const; int serverIndexForId(const QString &serverId) const; bool listHasServersFromGatewayApi() const; @@ -130,7 +135,6 @@ private: QVector m_orderedServerDescriptions; - int m_processedServerIndex = -1; QString m_processedServerId; int m_processedContainerIndex = -1; }; diff --git a/client/ui/controllers/settingsUiController.cpp b/client/ui/controllers/settingsUiController.cpp index 6037aed76..c960852ac 100644 --- a/client/ui/controllers/settingsUiController.cpp +++ b/client/ui/controllers/settingsUiController.cpp @@ -164,6 +164,7 @@ void SettingsUiController::restoreAppConfigFromData(const QByteArray &data) emit amneziaDnsToggled(amneziaDnsEnabled); emit restoreBackupFinished(); + emit startMinimizedChanged(); } else { emit errorOccurred(errorCode); } @@ -177,6 +178,7 @@ QString SettingsUiController::getAppVersion() void SettingsUiController::clearSettings() { m_settingsController->clearSettings(); + emit startMinimizedChanged(); emit resetLanguageToSystem(); emit changeSettingsFinished(tr("All settings have been reset to default values")); @@ -204,6 +206,9 @@ bool SettingsUiController::isAutoStartEnabled() void SettingsUiController::toggleAutoStart(bool enable) { m_settingsController->toggleAutoStart(enable); + if (!enable) { + emit startMinimizedChanged(); + } } bool SettingsUiController::isStartMinimizedEnabled() diff --git a/client/ui/models/serversModel.cpp b/client/ui/models/serversModel.cpp index 018146f99..58a36edfc 100644 --- a/client/ui/models/serversModel.cpp +++ b/client/ui/models/serversModel.cpp @@ -20,20 +20,25 @@ using namespace amnezia; +namespace { +int rowForServerId(const QVector &descriptions, const QString &serverId) +{ + if (serverId.isEmpty()) { + return -1; + } + + for (int i = 0; i < descriptions.size(); ++i) { + if (descriptions.at(i).serverId == serverId) { + return i; + } + } + + return -1; +} +} // namespace + ServersModel::ServersModel(QObject *parent) : QAbstractListModel(parent) { - connect(this, &ServersModel::defaultServerIndexChanged, this, &ServersModel::defaultServerNameChanged); - - connect(this, &ServersModel::defaultServerIndexChanged, this, [this](const int serverIndex) { - if (serverIndex < 0 || serverIndex >= m_descriptions.size()) { - return; - } - auto defaultContainer = m_descriptions.at(serverIndex).defaultContainer; - emit ServersModel::defaultServerDefaultContainerChanged(defaultContainer); - emit ServersModel::defaultServerNameChanged(); - }); - - connect(this, &ServersModel::processedServerIndexChanged, this, &ServersModel::processedServerChanged); } int ServersModel::rowCount(const QModelIndex &parent) const @@ -56,52 +61,22 @@ QVariant ServersModel::data(const QModelIndex &index, int role) const return row.serverName; case ServerDescriptionRole: return configVersion ? row.baseDescription : (row.baseDescription + row.hostName); - case CollapsedServerDescriptionRole: - return row.collapsedServerDescription; - case ExpandedServerDescriptionRole: - return row.expandedServerDescription; case HostNameRole: return row.hostName; - case CredentialsRole: - return QVariant::fromValue(serverCredentials(index.row())); + case ServerIdRole: + return row.serverId; case CredentialsLoginRole: return serverCredentials(index.row()).userName; case IsDefaultRole: - return index.row() == m_defaultServerIndex; - case IsCurrentlyProcessedRole: - return index.row() == m_processedServerIndex; + return row.serverId == m_defaultServerId; case HasWriteAccessRole: return row.hasWriteAccess; - case ContainsAmneziaDnsRole: - return row.primaryDnsIsAmnezia; case DefaultContainerRole: return QVariant::fromValue(row.defaultContainer); case HasInstalledContainers: return row.hasInstalledVpnContainers; - case IsServerFromTelegramApiRole: - return false; case IsServerFromGatewayApiRole: return row.isServerFromGatewayApi; - case ApiConfigRole: - return QVariant(); - case IsCountrySelectionAvailableRole: - return row.isCountrySelectionAvailable; - case ApiAvailableCountriesRole: - return row.apiAvailableCountries; - case ApiServerCountryCodeRole: - return row.apiServerCountryCode; - case HasAmneziaDns: - return row.primaryDnsIsAmnezia; - case IsAdVisibleRole: - return row.isAdVisible; - case AdHeaderRole: - return row.adHeader; - case AdDescriptionRole: - return row.adDescription; - case AdEndpointRole: - return row.adEndpoint; - case IsRenewalAvailableRole: - return row.isRenewalAvailable; case IsSubscriptionExpiredRole: return row.isSubscriptionExpired; case IsSubscriptionExpiringSoonRole: @@ -117,68 +92,32 @@ QVariant ServersModel::data(const int index, int role) const return data(modelIndex, role); } -void ServersModel::updateModel(const QVector &descriptions, int defaultServerIndex) +void ServersModel::updateModel(const QVector &descriptions, + const QString &defaultServerId) { beginResetModel(); m_descriptions = descriptions; - m_defaultServerIndex = defaultServerIndex; + m_defaultServerId = defaultServerId; endResetModel(); - emit defaultServerIndexChanged(m_defaultServerIndex); - emit processedServerChanged(); } -const int ServersModel::getDefaultServerIndex() +void ServersModel::setDefaultServerId(const QString &serverId) { - return m_defaultServerIndex; -} - -const int ServersModel::getServersCount() -{ - return m_descriptions.size(); -} - -bool ServersModel::hasServerWithWriteAccess() -{ - for (size_t i = 0; i < getServersCount(); i++) { - if (qvariant_cast(data(static_cast(i), HasWriteAccessRole))) { - return true; - } + if (m_defaultServerId == serverId) { + return; } - return false; -} -void ServersModel::setProcessedServerIndex(const int index) -{ - if (m_processedServerIndex != index) { - m_processedServerIndex = index; - emit processedServerIndexChanged(m_processedServerIndex); + const int oldIndex = rowForServerId(m_descriptions, m_defaultServerId); + const int newIndex = rowForServerId(m_descriptions, serverId); + m_defaultServerId = serverId; + + const QVector roles = { IsDefaultRole }; + if (oldIndex >= 0 && oldIndex < m_descriptions.size()) { + emit dataChanged(this->index(oldIndex), this->index(oldIndex), roles); + } + if (newIndex >= 0 && newIndex < m_descriptions.size()) { + emit dataChanged(this->index(newIndex), this->index(newIndex), roles); } -} - -const ServerCredentials ServersModel::getProcessedServerCredentials() -{ - return serverCredentials(m_processedServerIndex); -} - -bool ServersModel::isDefaultServerCurrentlyProcessed() -{ - return m_defaultServerIndex == m_processedServerIndex; -} - -bool ServersModel::isDefaultServerFromApi() -{ - return data(m_defaultServerIndex, IsServerFromTelegramApiRole).toBool() - || data(m_defaultServerIndex, IsServerFromGatewayApiRole).toBool(); -} - -bool ServersModel::isProcessedServerHasWriteAccess() -{ - return qvariant_cast(data(m_processedServerIndex, HasWriteAccessRole)); -} - -bool ServersModel::isDefaultServerHasWriteAccess() -{ - return qvariant_cast(data(m_defaultServerIndex, HasWriteAccessRole)); } QHash ServersModel::roleNames() const @@ -187,41 +126,22 @@ QHash ServersModel::roleNames() const roles[NameRole] = "name"; roles[ServerDescriptionRole] = "serverDescription"; - roles[CollapsedServerDescriptionRole] = "collapsedServerDescription"; - roles[ExpandedServerDescriptionRole] = "expandedServerDescription"; roles[HostNameRole] = "hostName"; + roles[ServerIdRole] = "serverId"; - roles[CredentialsRole] = "credentials"; roles[CredentialsLoginRole] = "credentialsLogin"; roles[IsDefaultRole] = "isDefault"; - roles[IsCurrentlyProcessedRole] = "isCurrentlyProcessed"; - roles[HasWriteAccessRole] = "hasWriteAccess"; - roles[ContainsAmneziaDnsRole] = "containsAmneziaDns"; - roles[DefaultContainerRole] = "defaultContainer"; roles[HasInstalledContainers] = "hasInstalledContainers"; - roles[IsServerFromTelegramApiRole] = "isServerFromTelegramApi"; roles[IsServerFromGatewayApiRole] = "isServerFromGatewayApi"; - roles[ApiConfigRole] = "apiConfig"; - roles[IsCountrySelectionAvailableRole] = "isCountrySelectionAvailable"; - roles[ApiAvailableCountriesRole] = "apiAvailableCountries"; - roles[ApiServerCountryCodeRole] = "apiServerCountryCode"; - - roles[IsAdVisibleRole] = "isAdVisible"; - roles[AdHeaderRole] = "adHeader"; - roles[AdDescriptionRole] = "adDescription"; - roles[AdEndpointRole] = "adEndpoint"; - roles[IsRenewalAvailableRole] = "isRenewalAvailable"; roles[IsSubscriptionExpiredRole] = "isSubscriptionExpired"; roles[IsSubscriptionExpiringSoonRole] = "isSubscriptionExpiringSoon"; - roles[HasAmneziaDns] = "hasAmneziaDns"; - return roles; } @@ -233,40 +153,3 @@ ServerCredentials ServersModel::serverCredentials(int index) const return m_descriptions.at(index).selfHostedSshCredentials; } -bool ServersModel::isServerFromApi(const int serverIndex) -{ - return data(serverIndex, IsServerFromTelegramApiRole).toBool() - || data(serverIndex, IsServerFromGatewayApiRole).toBool(); -} - -QVariant ServersModel::getDefaultServerData(const QString roleString) -{ - auto roles = roleNames(); - for (auto it = roles.begin(); it != roles.end(); it++) { - if (QString(it.value()) == roleString) { - return data(m_defaultServerIndex, it.key()); - } - } - - return {}; -} - -QVariant ServersModel::getProcessedServerData(const QString &roleString) -{ - auto roles = roleNames(); - for (auto it = roles.begin(); it != roles.end(); it++) { - if (QString(it.value()) == roleString) { - return data(m_processedServerIndex, it.key()); - } - } - - return {}; -} - -bool ServersModel::serverHasInstalledContainers(const int serverIndex) const -{ - if (serverIndex < 0 || serverIndex >= m_descriptions.size()) { - return false; - } - return m_descriptions.at(serverIndex).hasInstalledVpnContainers; -} diff --git a/client/ui/models/serversModel.h b/client/ui/models/serversModel.h index 90637e18b..39e29903f 100644 --- a/client/ui/models/serversModel.h +++ b/client/ui/models/serversModel.h @@ -14,39 +14,22 @@ public: enum Roles { NameRole = Qt::UserRole + 1, ServerDescriptionRole, - CollapsedServerDescriptionRole, - ExpandedServerDescriptionRole, HostNameRole, + ServerIdRole, - CredentialsRole, CredentialsLoginRole, IsDefaultRole, - IsCurrentlyProcessedRole, HasWriteAccessRole, - ContainsAmneziaDnsRole, - DefaultContainerRole, HasInstalledContainers, - IsServerFromTelegramApiRole, IsServerFromGatewayApiRole, - ApiConfigRole, - IsCountrySelectionAvailableRole, - ApiAvailableCountriesRole, - ApiServerCountryCodeRole, - IsAdVisibleRole, - AdHeaderRole, - AdDescriptionRole, - AdEndpointRole, - IsRenewalAvailableRole, IsSubscriptionExpiredRole, IsSubscriptionExpiringSoonRole, - - HasAmneziaDns }; ServersModel(QObject *parent = nullptr); @@ -56,52 +39,19 @@ public: QVariant data(const int index, int role = Qt::DisplayRole) const; public slots: - const int getDefaultServerIndex(); - bool isDefaultServerCurrentlyProcessed(); - bool isDefaultServerFromApi(); - - bool isProcessedServerHasWriteAccess(); - bool isDefaultServerHasWriteAccess(); - bool hasServerWithWriteAccess(); - - const int getServersCount(); - - void setProcessedServerIndex(const int index); - - const ServerCredentials getProcessedServerCredentials(); - QVariant getProcessedServerData(const QString &roleString); - - QVariant getDefaultServerData(const QString roleString); - - bool isServerFromApi(const int serverIndex); - - void updateModel(const QVector &descriptions, int defaultServerIndex); + void updateModel(const QVector &descriptions, + const QString &defaultServerId); + void setDefaultServerId(const QString &serverId); protected: QHash roleNames() const override; -signals: - void processedServerIndexChanged(const int index); - void processedServerChanged(); - - void defaultServerIndexChanged(const int index); - void defaultServerNameChanged(); - void defaultServerDescriptionChanged(); - - void defaultServerDefaultContainerChanged(const int containerIndex); - - void updateApiCountryModel(); - void updateApiServicesModel(); - private: ServerCredentials serverCredentials(int index) const; - bool serverHasInstalledContainers(const int serverIndex) const; - QVector m_descriptions; - int m_defaultServerIndex = -1; - int m_processedServerIndex = -1; + QString m_defaultServerId; }; #endif // SERVERSMODEL_H diff --git a/client/ui/qml/Components/AdLabel.qml b/client/ui/qml/Components/AdLabel.qml index cf2073fac..59fb6f444 100644 --- a/client/ui/qml/Components/AdLabel.qml +++ b/client/ui/qml/Components/AdLabel.qml @@ -51,11 +51,11 @@ Rectangle { } Keys.onEnterPressed: { - Qt.openUrlExternally(ServersModel.getDefaultServerData("adEndpoint")) + Qt.openUrlExternally(ServersUiController.serverAdEndpoint(ServersUiController.defaultServerId)) } Keys.onReturnPressed: { - Qt.openUrlExternally(ServersModel.getDefaultServerData("adEndpoint")) + Qt.openUrlExternally(ServersUiController.serverAdEndpoint(ServersUiController.defaultServerId)) } RowLayout { @@ -144,7 +144,7 @@ Rectangle { onClicked: function() { root.forceActiveFocus() - Qt.openUrlExternally(ServersModel.getDefaultServerData("adEndpoint")) + Qt.openUrlExternally(ServersUiController.serverAdEndpoint(ServersUiController.defaultServerId)) } } } diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index 2f17f4b60..f66ba77bb 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -182,7 +182,6 @@ Button { } onClicked: { - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) ConnectionController.connectButtonClicked() } diff --git a/client/ui/qml/Components/GamepadLoader.qml b/client/ui/qml/Components/GamepadLoader.qml index 5dc39a96c..f1e7020aa 100644 --- a/client/ui/qml/Components/GamepadLoader.qml +++ b/client/ui/qml/Components/GamepadLoader.qml @@ -13,7 +13,6 @@ Item { onButtonStartChanged: { if (buttonStart) { - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) ConnectionController.connectButtonClicked() } } diff --git a/client/ui/qml/Components/HomeContainersListView.qml b/client/ui/qml/Components/HomeContainersListView.qml index c1e8ac489..c969f200e 100644 --- a/client/ui/qml/Components/HomeContainersListView.qml +++ b/client/ui/qml/Components/HomeContainersListView.qml @@ -48,7 +48,7 @@ ListViewType { showImage: !isInstalled checkable: isInstalled && !ConnectionController.isConnected - checked: proxyDefaultServerContainersModel.mapToSource(index) === ServersModel.getDefaultServerData("defaultContainer") + checked: proxyDefaultServerContainersModel.mapToSource(index) === ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) onClicked: { if (ConnectionController.isConnected && isInstalled) { @@ -58,7 +58,7 @@ ListViewType { if (checked) { containersDropDown.closeTriggered() - ServersUiController.setDefaultContainer(ServersUiController.getServerId(ServersUiController.defaultServerIndex), proxyDefaultServerContainersModel.mapToSource(index)) + ServersUiController.setDefaultContainer(ServersUiController.defaultServerId, proxyDefaultServerContainersModel.mapToSource(index)) } else { ServersUiController.processedContainerIndex = proxyDefaultServerContainersModel.mapToSource(index) PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings) diff --git a/client/ui/qml/Components/RenameServerDrawer.qml b/client/ui/qml/Components/RenameServerDrawer.qml index 328c8f537..c66d8b608 100644 --- a/client/ui/qml/Components/RenameServerDrawer.qml +++ b/client/ui/qml/Components/RenameServerDrawer.qml @@ -46,7 +46,7 @@ DrawerType2 { } if (serverName.textField.text !== root.serverNameText) { - ServersUiController.editServerName(ServersUiController.getServerId(ServersUiController.processedServerIndex), serverName.textField.text); + ServersUiController.editServerName(ServersUiController.processedServerId, serverName.textField.text); } root.closeTriggered() } diff --git a/client/ui/qml/Components/ServersListView.qml b/client/ui/qml/Components/ServersListView.qml index 6e92a1fd1..7a3b0e0e4 100644 --- a/client/ui/qml/Components/ServersListView.qml +++ b/client/ui/qml/Components/ServersListView.qml @@ -17,7 +17,7 @@ import "../Config" ListViewType { id: root - property int selectedIndex: ServersUiController.defaultServerIndex + property int selectedIndex: ServersUiController.getServerIndexById(ServersUiController.defaultServerId) anchors.top: serversMenuHeader.bottom anchors.right: parent.right @@ -29,8 +29,8 @@ ListViewType { Connections { target: ServersUiController - function onDefaultServerIndexChanged() { - root.selectedIndex = ServersUiController.defaultServerIndex + function onDefaultServerIdChanged() { + root.selectedIndex = ServersUiController.getServerIndexById(ServersUiController.defaultServerId) } } @@ -106,14 +106,14 @@ ListViewType { z: 1 onClicked: function() { - ServersUiController.processedServerIndex = index + ServersUiController.setProcessedServerId(serverId) - if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { - if (ServersModel.getProcessedServerData("isCountrySelectionAvailable")) { + if (ServersUiController.isServerFromApi(ServersUiController.processedServerId)) { + if (ServersUiController.isServerCountrySelectionAvailable(ServersUiController.processedServerId)) { PageController.goToPage(PageEnum.PageSettingsApiAvailableCountries) } else { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), false) + let result = SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, false) PageController.showBusyIndicator(false) if (!result) { return diff --git a/client/ui/qml/Components/SettingsContainersListView.qml b/client/ui/qml/Components/SettingsContainersListView.qml index 9e51ae8d8..34d375767 100644 --- a/client/ui/qml/Components/SettingsContainersListView.qml +++ b/client/ui/qml/Components/SettingsContainersListView.qml @@ -34,14 +34,14 @@ ListViewType { if (isVpnContainer) { // var isThirdPartyConfig = root.model.data(index, ContainersModel.IsThirdPartyConfigRole) if (isThirdPartyConfig) { - InstallController.updateProtocols(ServersUiController.getServerId(ServersUiController.processedServerIndex), containerIndex) + InstallController.updateProtocols(ServersUiController.processedServerId, containerIndex) PageController.goToPage(PageEnum.PageProtocolRaw) return } } if (isIpsec) { - InstallController.updateProtocols(ServersUiController.getServerId(ServersUiController.processedServerIndex), containerIndex) + InstallController.updateProtocols(ServersUiController.processedServerId, containerIndex) PageController.goToPage(PageEnum.PageProtocolRaw) } else if (isDns) { PageController.goToPage(PageEnum.PageServiceDnsSettings) @@ -52,7 +52,7 @@ ListViewType { TelemtConfigModel.updateModel(config) PageController.goToPage(PageEnum.PageServiceTelemtSettings) } else { - InstallController.updateProtocols(ServersUiController.getServerId(ServersUiController.processedServerIndex), containerIndex) + InstallController.updateProtocols(ServersUiController.processedServerId, containerIndex) PageController.goToPage(PageEnum.PageSettingsServerProtocol) } diff --git a/client/ui/qml/Components/SubscriptionExpiredDrawer.qml b/client/ui/qml/Components/SubscriptionExpiredDrawer.qml index b1b27f16b..fe04e844e 100644 --- a/client/ui/qml/Components/SubscriptionExpiredDrawer.qml +++ b/client/ui/qml/Components/SubscriptionExpiredDrawer.qml @@ -15,7 +15,7 @@ DrawerType2 { property bool isRenewalAvailable: false onOpened: { - isRenewalAvailable = ServersModel.getDefaultServerData("isRenewalAvailable") && !ApiAccountInfoModel.data("isInAppPurchase") + isRenewalAvailable = ServersUiController.isServerRenewalAvailable(ServersUiController.defaultServerId) && !ApiAccountInfoModel.data("isInAppPurchase") } expandedStateContent: ColumnLayout { @@ -43,7 +43,7 @@ DrawerType2 { anchors.left: parent.left anchors.right: parent.right - text: ServersModel.getDefaultServerData("name") + qsTr(" subscription has expired") + text: ServersUiController.serverName(ServersUiController.defaultServerId) + qsTr(" subscription has expired") horizontalAlignment: Text.AlignLeft } } @@ -76,7 +76,7 @@ DrawerType2 { textColor: AmneziaStyle.color.midnightBlack clickedFunc: function() { - SubscriptionUiController.getRenewalLink(ServersUiController.getServerId(ServersUiController.defaultServerIndex)) + SubscriptionUiController.getRenewalLink(ServersUiController.defaultServerId) } } @@ -96,7 +96,7 @@ DrawerType2 { clickedFunc: function() { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.defaultServerIndex), false) + let result = SubscriptionUiController.getAccountInfo(ServersUiController.defaultServerId, false) PageController.showBusyIndicator(false) if (result) { root.closeTriggered() diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 12b811652..7298aea9a 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -344,14 +344,14 @@ PageType { Keys.onReturnPressed: this.clicked() onClicked: { - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) + ServersUiController.setProcessedServerId(ServersUiController.defaultServerId) - if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { - if (ServersModel.getProcessedServerData("isCountrySelectionAvailable")) { + if (ServersUiController.isServerFromApi(ServersUiController.processedServerId)) { + if (ServersUiController.isServerCountrySelectionAvailable(ServersUiController.processedServerId)) { PageController.goToPage(PageEnum.PageSettingsApiAvailableCountries) } else { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), false) + let result = SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, false) PageController.showBusyIndicator(false) if (!result) { return @@ -420,13 +420,13 @@ PageType { target: ServersUiController - function onDefaultServerIndexChanged() { + function onDefaultServerIdChanged() { updateContainersModelFilters() } } function updateContainersModelFilters() { - if (ServersModel.isDefaultServerHasWriteAccess()) { + if (ServersUiController.isServerHasWriteAccess(ServersUiController.defaultServerId)) { proxyDefaultServerContainersModel.filters = ContainersModelFilters.getWriteAccessProtocolsListFilters() } else { proxyDefaultServerContainersModel.filters = ContainersModelFilters.getReadAccessProtocolsListFilters() diff --git a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml index 12b08fc20..f5a484848 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml @@ -435,13 +435,13 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.Awg) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg) } var noButtonFunction = function() {} diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 74f998ae0..9053d71ea 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -555,13 +555,13 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.Awg) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg) } var noButtonFunction = function() {} diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 1e216e2fd..d375b6633 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -428,13 +428,13 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.OpenVpn) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.OpenVpn) } var noButtonFunction = function() { if (!GC.isMobile()) { diff --git a/client/ui/qml/Pages2/PageProtocolRaw.qml b/client/ui/qml/Pages2/PageProtocolRaw.qml index 881c20bac..16e37bb6a 100644 --- a/client/ui/qml/Pages2/PageProtocolRaw.qml +++ b/client/ui/qml/Pages2/PageProtocolRaw.qml @@ -184,7 +184,7 @@ PageType { var yesButtonFunction = function() { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.removeContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } var noButtonFunction = function() {} diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml index 730750f33..4fc326bde 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml @@ -123,13 +123,13 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard) } var noButtonFunction = function() {} showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction) diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml index 72257cb2f..682cb27b1 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml @@ -123,13 +123,13 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard) } var noButtonFunction = function() { if (!GC.isMobile()) { diff --git a/client/ui/qml/Pages2/PageProtocolXrayFlowSettings.qml b/client/ui/qml/Pages2/PageProtocolXrayFlowSettings.qml index afde16088..03dc51d3b 100644 --- a/client/ui/qml/Pages2/PageProtocolXrayFlowSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXrayFlowSettings.qml @@ -107,7 +107,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageProtocolXraySecuritySettings.qml b/client/ui/qml/Pages2/PageProtocolXraySecuritySettings.qml index fc1a58de1..c4c202c3a 100644 --- a/client/ui/qml/Pages2/PageProtocolXraySecuritySettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXraySecuritySettings.qml @@ -274,7 +274,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageProtocolXraySettings.qml b/client/ui/qml/Pages2/PageProtocolXraySettings.qml index c63d58eca..557a9a71b 100644 --- a/client/ui/qml/Pages2/PageProtocolXraySettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXraySettings.qml @@ -184,13 +184,13 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.Xray) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray) } var noButtonFunction = function() { if (!GC.isMobile()) saveButton.forceActiveFocus() diff --git a/client/ui/qml/Pages2/PageProtocolXrayTransportSettings.qml b/client/ui/qml/Pages2/PageProtocolXrayTransportSettings.qml index bbda7eb87..d124c77a6 100644 --- a/client/ui/qml/Pages2/PageProtocolXrayTransportSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXrayTransportSettings.qml @@ -737,7 +737,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageProtocolXrayXPaddingBytesSettings.qml b/client/ui/qml/Pages2/PageProtocolXrayXPaddingBytesSettings.qml index 026c8cfa7..566c03922 100644 --- a/client/ui/qml/Pages2/PageProtocolXrayXPaddingBytesSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXrayXPaddingBytesSettings.qml @@ -90,7 +90,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageProtocolXrayXPaddingSettings.qml b/client/ui/qml/Pages2/PageProtocolXrayXPaddingSettings.qml index b06b745f2..db7a5aab5 100644 --- a/client/ui/qml/Pages2/PageProtocolXrayXPaddingSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXrayXPaddingSettings.qml @@ -206,7 +206,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageProtocolXrayXmuxSettings.qml b/client/ui/qml/Pages2/PageProtocolXrayXmuxSettings.qml index dff46b2dd..dcbb77ec8 100644 --- a/client/ui/qml/Pages2/PageProtocolXrayXmuxSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXrayXmuxSettings.qml @@ -203,7 +203,7 @@ PageType { var yesButtonText = qsTr("Continue") var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Unable change settings while there is an active connection")) return } diff --git a/client/ui/qml/Pages2/PageServiceDnsSettings.qml b/client/ui/qml/Pages2/PageServiceDnsSettings.qml index 5dac3959e..15e8be89a 100644 --- a/client/ui/qml/Pages2/PageServiceDnsSettings.qml +++ b/client/ui/qml/Pages2/PageServiceDnsSettings.qml @@ -79,7 +79,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot remove AmneziaDNS from running server")) } else { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.removeContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } } var noButtonFunction = function() {} diff --git a/client/ui/qml/Pages2/PageServiceMtProxySettings.qml b/client/ui/qml/Pages2/PageServiceMtProxySettings.qml index a1c185104..5041184b9 100644 --- a/client/ui/qml/Pages2/PageServiceMtProxySettings.qml +++ b/client/ui/qml/Pages2/PageServiceMtProxySettings.qml @@ -100,7 +100,7 @@ PageType { function mtProxyScheduleUpdate(closePage) { var cp = closePage === undefined ? false : closePage Qt.callLater(function () { - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.MtProxy, cp) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.MtProxy, cp) }) } @@ -172,7 +172,7 @@ PageType { return } isCheckingStatus = true - InstallController.refreshContainerStatus(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.refreshContainerStatus(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } // Block back navigation and Escape (via PageStart.isControlsDisabled) while SSH/update or diagnostics refresh runs. @@ -200,7 +200,7 @@ PageType { } if (NetworkReachabilityController.hasInternetAccess) { isCheckingStatus = true - InstallController.refreshContainerStatus(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.refreshContainerStatus(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } } } @@ -276,7 +276,7 @@ PageType { root.savedPublicHost = MtProxyConfigModel.getPublicHost() if (status === 1) { MtProxyConfigModel.setEnabled(true) - InstallController.fetchContainerSecret(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.fetchContainerSecret(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } else if (status === 2) { MtProxyConfigModel.setEnabled(false) } @@ -418,7 +418,7 @@ PageType { } function effectiveHost() { - return root.savedPublicHost !== "" ? root.savedPublicHost : ServersModel.getProcessedServerData("hostName") + return root.savedPublicHost !== "" ? root.savedPublicHost : ServersUiController.serverHostName(ServersUiController.processedServerId) } function tmeLink() { @@ -720,7 +720,7 @@ PageType { Layout.bottomMargin: 24 Layout.leftMargin: 0 Layout.rightMargin: 16 - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() text: qsTr("Delete MTProxy") textColor: AmneziaStyle.color.vibrantRed clickedFunction: function () { @@ -730,7 +730,7 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.removeContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, function () { }) @@ -784,7 +784,7 @@ PageType { } function mtProxyEffectiveHostForLinks() { - return root.savedPublicHost !== "" ? root.savedPublicHost : ServersModel.getProcessedServerData("hostName") + return root.savedPublicHost !== "" ? root.savedPublicHost : ServersUiController.serverHostName(ServersUiController.processedServerId) } function mtProxyTmeLinkForAdditional(baseHex) { @@ -815,9 +815,9 @@ PageType { isUpdating = true if (checked) { root.pendingUpdateAfterEnable = true - InstallController.setContainerEnabled(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, true) + InstallController.setContainerEnabled(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, true) } else { - InstallController.setContainerEnabled(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, false) + InstallController.setContainerEnabled(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, false) } } } @@ -855,7 +855,7 @@ PageType { hoverEnabled: true image: "qrc:/images/controls/refresh-cw.svg" imageColor: AmneziaStyle.color.paleGray - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() onClicked: { var secretSnapshot = secret showQuestionDrawer( @@ -889,7 +889,7 @@ PageType { Layout.rightMargin: 16 Layout.bottomMargin: 4 headerText: qsTr("Public host / IP") - textField.placeholderText: ServersModel.getProcessedServerData("hostName") + textField.placeholderText: ServersUiController.serverHostName(ServersUiController.processedServerId) textField.text: publicHost textField.maximumLength: 253 textField.validator: PublicHostInputValidator { @@ -936,7 +936,7 @@ PageType { Layout.rightMargin: 16 Layout.bottomMargin: 12 visible: publicHostTextField.textField.text !== "" && - publicHostTextField.textField.text !== ServersModel.getProcessedServerData("hostName") + publicHostTextField.textField.text !== ServersUiController.serverHostName(ServersUiController.processedServerId) text: qsTr("⚠ This overrides the server IP in connection links. Make sure this host/domain points to your server.") color: AmneziaStyle.color.goldenApricot font.pixelSize: 12 @@ -1281,7 +1281,7 @@ PageType { implicitWidth: 32 implicitHeight: 32 hoverEnabled: true - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() image: "qrc:/images/controls/trash.svg" imageColor: AmneziaStyle.color.vibrantRed onClicked: { @@ -1628,7 +1628,7 @@ PageType { enabled: !diagLoading onClicked: { diagLoading = true - InstallController.refreshContainerDiagnostics(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, parseInt(port)) + InstallController.refreshContainerDiagnostics(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, parseInt(port)) } } } @@ -1754,7 +1754,7 @@ PageType { Layout.bottomMargin: 32 Layout.rightMargin: 16 Layout.leftMargin: 16 - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() enabled: !root.mtProxyNetworkBlocked text: qsTr("Save") clickedFunc: function () { diff --git a/client/ui/qml/Pages2/PageServiceSftpSettings.qml b/client/ui/qml/Pages2/PageServiceSftpSettings.qml index 2f6bbbb30..16593d070 100644 --- a/client/ui/qml/Pages2/PageServiceSftpSettings.qml +++ b/client/ui/qml/Pages2/PageServiceSftpSettings.qml @@ -73,7 +73,7 @@ PageType { Layout.rightMargin: 16 text: qsTr("Host") - descriptionText: ServersModel.getProcessedServerData("hostName") + descriptionText: ServersUiController.serverHostName(ServersUiController.processedServerId) descriptionOnTop: true @@ -173,7 +173,7 @@ PageType { clickedFunc: function() { PageController.showBusyIndicator(true) - InstallController.mountSftpDrive(ServersUiController.getServerId(ServersUiController.processedServerIndex), port, password, username) + InstallController.mountSftpDrive(ServersUiController.processedServerId, port, password, username) PageController.showBusyIndicator(false) } } diff --git a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml index 0e86ddc6a..bf1f3f56e 100644 --- a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml +++ b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml @@ -71,7 +71,7 @@ PageType { Layout.bottomMargin: 16 text: qsTr("Host") - descriptionText: ServersModel.getProcessedServerData("hostName") + descriptionText: ServersUiController.serverHostName(ServersUiController.processedServerId) descriptionOnTop: true @@ -285,7 +285,7 @@ PageType { } PageController.goToPage(PageEnum.PageSetupWizardInstalling) - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.Socks5Proxy) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Socks5Proxy) tempPort = portTextField.textField.text tempUsername = usernameTextField.textField.text tempPassword = passwordTextField.textField.text diff --git a/client/ui/qml/Pages2/PageServiceTelemtSettings.qml b/client/ui/qml/Pages2/PageServiceTelemtSettings.qml index 320300f98..4d7648b8f 100644 --- a/client/ui/qml/Pages2/PageServiceTelemtSettings.qml +++ b/client/ui/qml/Pages2/PageServiceTelemtSettings.qml @@ -70,7 +70,7 @@ PageType { function telemtScheduleUpdate(closePage) { var cp = closePage === undefined ? false : closePage Qt.callLater(function () { - InstallController.updateContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, ProtocolEnum.Telemt, cp) + InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Telemt, cp) }) } @@ -110,7 +110,7 @@ PageType { return } isCheckingStatus = true - InstallController.refreshContainerStatus(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.refreshContainerStatus(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } onNavigationBlockedWhileBusyChanged: { @@ -137,7 +137,7 @@ PageType { } if (NetworkReachabilityController.hasInternetAccess) { isCheckingStatus = true - InstallController.refreshContainerStatus(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.refreshContainerStatus(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } } } @@ -212,7 +212,7 @@ PageType { root.savedPublicHost = TelemtConfigModel.getPublicHost() if (status === 1) { TelemtConfigModel.setEnabled(true) - InstallController.fetchContainerSecret(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.fetchContainerSecret(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } else if (status === 2) { TelemtConfigModel.setEnabled(false) } @@ -355,7 +355,7 @@ PageType { } function effectiveHost() { - return root.savedPublicHost !== "" ? root.savedPublicHost : ServersModel.getProcessedServerData("hostName") + return root.savedPublicHost !== "" ? root.savedPublicHost : ServersUiController.serverHostName(ServersUiController.processedServerId) } function tmeLink() { @@ -657,7 +657,7 @@ PageType { Layout.bottomMargin: 24 Layout.leftMargin: 0 Layout.rightMargin: 16 - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() text: qsTr("Delete Telemt") textColor: AmneziaStyle.color.vibrantRed clickedFunction: function () { @@ -667,7 +667,7 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function () { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.removeContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, function () { }) @@ -708,9 +708,9 @@ PageType { isUpdating = true if (checked) { root.pendingUpdateAfterEnable = true - InstallController.setContainerEnabled(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, true) + InstallController.setContainerEnabled(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, true) } else { - InstallController.setContainerEnabled(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, false) + InstallController.setContainerEnabled(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, false) } } } @@ -748,7 +748,7 @@ PageType { hoverEnabled: true image: "qrc:/images/controls/refresh-cw.svg" imageColor: AmneziaStyle.color.paleGray - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() onClicked: { showQuestionDrawer( qsTr("Generate new secret?"), @@ -780,7 +780,7 @@ PageType { Layout.rightMargin: 16 Layout.bottomMargin: 4 headerText: qsTr("Public host / IP") - textField.placeholderText: ServersModel.getProcessedServerData("hostName") + textField.placeholderText: ServersUiController.serverHostName(ServersUiController.processedServerId) textField.text: publicHost textField.onEditingFinished: { textField.text = textField.text.replace(/^\s+|\s+$/g, '') @@ -809,7 +809,7 @@ PageType { Layout.rightMargin: 16 Layout.bottomMargin: 12 visible: publicHostTextField.textField.text !== "" && - publicHostTextField.textField.text !== ServersModel.getProcessedServerData("hostName") + publicHostTextField.textField.text !== ServersUiController.serverHostName(ServersUiController.processedServerId) text: qsTr("⚠ This overrides the server IP in connection links. Make sure this host/domain points to your server.") color: AmneziaStyle.color.goldenApricot font.pixelSize: 12 @@ -1240,7 +1240,7 @@ PageType { enabled: !diagLoading onClicked: { diagLoading = true - InstallController.refreshContainerDiagnostics(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, parseInt(port)) + InstallController.refreshContainerDiagnostics(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, parseInt(port)) } } } @@ -1366,7 +1366,7 @@ PageType { Layout.bottomMargin: 32 Layout.rightMargin: 16 Layout.leftMargin: 16 - visible: ServersModel.isProcessedServerHasWriteAccess() + visible: ServersUiController.isProcessedServerHasWriteAccess() text: qsTr("Save") clickedFunc: function () { var portValue = portTextField.textField.text === "" diff --git a/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml b/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml index 4e5d62a41..40c15a94c 100644 --- a/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml +++ b/client/ui/qml/Pages2/PageSettingsApiAvailableCountries.qml @@ -24,8 +24,8 @@ PageType { property bool isInAppPurchase: false function updateSubscriptionState() { - root.subscriptionExpired = ServersModel.getProcessedServerData("isSubscriptionExpired") - root.subscriptionExpiringSoon = ServersModel.getProcessedServerData("isSubscriptionExpiringSoon") + root.subscriptionExpired = ServersUiController.isServerSubscriptionExpired(ServersUiController.processedServerId) + root.subscriptionExpiringSoon = ServersUiController.isServerSubscriptionExpiringSoon(ServersUiController.processedServerId) root.isSubscriptionRenewalAvailable = ApiAccountInfoModel.data("isSubscriptionRenewalAvailable") root.isInAppPurchase = ApiAccountInfoModel.data("isInAppPurchase") } @@ -35,14 +35,22 @@ PageType { } Connections { - target: ServersModel + target: ServersUiController - function onProcessedServerChanged() { + function onProcessedServerIdChanged() { root.processedServer = proxyServersModel.get(0) root.updateSubscriptionState() } } + Connections { + target: ServersModel + + function onModelReset() { + root.processedServer = proxyServersModel.get(0) + } + } + Connections { target: ApiAccountInfoModel @@ -58,8 +66,8 @@ PageType { sourceModel: ServersModel filters: [ ValueFilter { - roleName: "isCurrentlyProcessed" - value: true + roleName: "serverId" + value: ServersUiController.processedServerId } ] @@ -108,7 +116,7 @@ PageType { actionButtonFunction: function() { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), false) + let result = SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, false) PageController.showBusyIndicator(false) if (!result) { return @@ -148,7 +156,7 @@ PageType { text: qsTr("Renew subscription") clickedFunc: function() { - SubscriptionUiController.getRenewalLink(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.getRenewalLink(ServersUiController.processedServerId) } } @@ -200,7 +208,7 @@ PageType { PageController.showBusyIndicator(true) var prevIndex = ApiCountryModel.currentIndex ApiCountryModel.currentIndex = index - if (!SubscriptionUiController.updateServiceFromGateway(ServersUiController.getServerId(ServersUiController.processedServerIndex), countryCode, countryName)) { + if (!SubscriptionUiController.updateServiceFromGateway(ServersUiController.processedServerId, countryCode, countryName)) { ApiCountryModel.currentIndex = prevIndex } PageController.showBusyIndicator(false) diff --git a/client/ui/qml/Pages2/PageSettingsApiDevices.qml b/client/ui/qml/Pages2/PageSettingsApiDevices.qml index 6aecdc634..ea78ede77 100644 --- a/client/ui/qml/Pages2/PageSettingsApiDevices.qml +++ b/client/ui/qml/Pages2/PageSettingsApiDevices.qml @@ -82,7 +82,7 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - var serverId = ServersUiController.getServerId(ServersUiController.processedServerIndex) + var serverId = ServersUiController.processedServerId Qt.callLater(deactivateExternalDevice, serverId, supportTag, countryCode) } var noButtonFunction = function() { diff --git a/client/ui/qml/Pages2/PageSettingsApiNativeConfigs.qml b/client/ui/qml/Pages2/PageSettingsApiNativeConfigs.qml index 51b12bd2d..87e3fda66 100644 --- a/client/ui/qml/Pages2/PageSettingsApiNativeConfigs.qml +++ b/client/ui/qml/Pages2/PageSettingsApiNativeConfigs.qml @@ -191,7 +191,7 @@ PageType { } if (fileName !== "") { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.exportNativeConfig(ServersUiController.getServerId(ServersUiController.processedServerIndex), countryCode, fileName) + let result = SubscriptionUiController.exportNativeConfig(ServersUiController.processedServerId, countryCode, fileName) PageController.showBusyIndicator(false) if (result) { @@ -202,9 +202,9 @@ PageType { function revokeConfig(countryCode) { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.revokeNativeConfig(ServersUiController.getServerId(ServersUiController.processedServerIndex), countryCode) + let result = SubscriptionUiController.revokeNativeConfig(ServersUiController.processedServerId, countryCode) if (result) { - SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), true) + SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, true) } PageController.showBusyIndicator(false) diff --git a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml index 2dd6439c0..e87533c5a 100644 --- a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml @@ -76,10 +76,18 @@ PageType { } } + Connections { + target: ServersUiController + + function onProcessedServerIdChanged() { + root.processedServer = proxyServersModel.get(0) + } + } + Connections { target: ServersModel - function onProcessedServerChanged() { + function onModelReset() { root.processedServer = proxyServersModel.get(0) } } @@ -91,8 +99,8 @@ PageType { sourceModel: ServersModel filters: [ ValueFilter { - roleName: "isCurrentlyProcessed" - value: true + roleName: "serverId" + value: ServersUiController.processedServerId } ] @@ -131,7 +139,7 @@ PageType { actionButtonImage: "qrc:/images/controls/edit-3.svg" - headerText: root.processedServer.name + headerText: root.processedServer != null ? root.processedServer.name : "" actionButtonFunction: function() { serverNameEditDrawer.openTriggered() @@ -186,7 +194,7 @@ PageType { textColor: AmneziaStyle.color.midnightBlack clickedFunc: function() { - SubscriptionUiController.getRenewalLink(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.getRenewalLink(ServersUiController.processedServerId) } } } @@ -246,7 +254,7 @@ PageType { text: qsTr("Renew subscription") clickedFunc: function() { - SubscriptionUiController.getRenewalLink(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.getRenewalLink(ServersUiController.processedServerId) } } @@ -258,8 +266,8 @@ PageType { SwitcherType { id: switcher - readonly property bool isVlessProtocol: SubscriptionUiController.isVlessProtocol(ServersUiController.getServerId(ServersUiController.processedServerIndex)) - readonly property bool isProtocolSwitchBlocked: ServersModel.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected + readonly property bool isVlessProtocol: SubscriptionUiController.isVlessProtocol(ServersUiController.processedServerId) + readonly property bool isProtocolSwitchBlocked: ServersUiController.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected Layout.fillWidth: true Layout.topMargin: 24 @@ -277,8 +285,8 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot change protocol during active connection")) } else { PageController.showBusyIndicator(true) - SubscriptionUiController.setCurrentProtocol(ServersUiController.getServerId(ServersUiController.processedServerIndex), switcher.isVlessProtocol ? "awg" : "vless") - SubscriptionUiController.updateServiceFromGateway(ServersUiController.getServerId(ServersUiController.processedServerIndex), "", "", true) + SubscriptionUiController.setCurrentProtocol(ServersUiController.processedServerId, switcher.isVlessProtocol ? "awg" : "vless") + SubscriptionUiController.updateServiceFromGateway(ServersUiController.processedServerId, "", "", true) PageController.showBusyIndicator(false) } } @@ -326,7 +334,7 @@ PageType { PageController.goToPage(PageEnum.PageSettingsApiSubscriptionKey) PageController.showBusyIndicator(true) - SubscriptionUiController.prepareVpnKeyExport(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.prepareVpnKeyExport(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } @@ -432,7 +440,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot reload API config during active connection")) } else { PageController.showBusyIndicator(true) - SubscriptionUiController.updateServiceFromGateway(ServersUiController.getServerId(ServersUiController.processedServerIndex), "", "", true) + SubscriptionUiController.updateServiceFromGateway(ServersUiController.processedServerId, "", "", true) PageController.showBusyIndicator(false) } } @@ -470,8 +478,8 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot unlink device during active connection")) } else { PageController.showBusyIndicator(true) - if (SubscriptionUiController.deactivateDevice(ServersUiController.getServerId(ServersUiController.processedServerIndex))) { - SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), true) + if (SubscriptionUiController.deactivateDevice(ServersUiController.processedServerId)) { + SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, true) } PageController.showBusyIndicator(false) } @@ -507,7 +515,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot remove server during active connection")) } else { PageController.showBusyIndicator(true) - SubscriptionUiController.removeServer(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.removeServer(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } } @@ -526,6 +534,6 @@ PageType { anchors.fill: parent expandedHeight: parent.height * 0.35 - serverNameText: root.processedServer.name + serverNameText: root.processedServer != null ? root.processedServer.name : "" } } diff --git a/client/ui/qml/Pages2/PageSettingsApiSubscriptionKey.qml b/client/ui/qml/Pages2/PageSettingsApiSubscriptionKey.qml index 848884475..8777f514e 100644 --- a/client/ui/qml/Pages2/PageSettingsApiSubscriptionKey.qml +++ b/client/ui/qml/Pages2/PageSettingsApiSubscriptionKey.qml @@ -21,10 +21,18 @@ PageType { property var processedServer + Connections { + target: ServersUiController + + function onProcessedServerIdChanged() { + root.processedServer = proxyServersModel.get(0) + } + } + Connections { target: ServersModel - function onProcessedServerChanged() { + function onModelReset() { root.processedServer = proxyServersModel.get(0) } } @@ -36,8 +44,8 @@ PageType { sourceModel: ServersModel filters: [ ValueFilter { - roleName: "isCurrentlyProcessed" - value: true + roleName: "serverId" + value: ServersUiController.processedServerId } ] @@ -48,7 +56,7 @@ PageType { Component.onCompleted: { PageController.showBusyIndicator(true) - SubscriptionUiController.prepareVpnKeyExport(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.prepareVpnKeyExport(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } @@ -119,7 +127,7 @@ PageType { if (fileName !== "") { PageController.showBusyIndicator(true) - let ok = SubscriptionUiController.exportVpnKey(ServersUiController.getServerId(ServersUiController.processedServerIndex), fileName) + let ok = SubscriptionUiController.exportVpnKey(ServersUiController.processedServerId, fileName) PageController.showBusyIndicator(false) if (ok) { PageController.showNotificationMessage(qsTr("Config file saved")) @@ -144,7 +152,7 @@ PageType { clickedFunc: function() { PageController.showBusyIndicator(true) - SubscriptionUiController.prepareVpnKeyExport(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.prepareVpnKeyExport(ServersUiController.processedServerId) PageController.showBusyIndicator(false) vpnKeyDrawer.openTriggered() } diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index 29e42af3f..f01b1f908 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -154,10 +154,10 @@ PageType { text: qsTr("Start minimized") descriptionText: qsTr("Launch application minimized (works with autostart option turned on)") - enabled: switcherAutoStart.checked + enabled: SettingsController.isAutoStartEnabled() opacity: enabled ? 1.0 : 0.5 - checked: SettingsController.startMinimized + checked: SettingsController.isAutoStartEnabled() && SettingsController.startMinimized onToggled: function() { if (checked !== SettingsController.startMinimized) { SettingsController.toggleStartMinimized(checked) diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index ba68c20c5..9c6e23f42 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -37,7 +37,7 @@ PageType { anchors.right: parent.right anchors.left: parent.left - property var isServerFromApi: ServersModel.isServerFromApi(ServersUiController.defaultServerIndex) + property var isServerFromApi: ServersUiController.isDefaultServerFromApi enabled: !isServerFromApi diff --git a/client/ui/qml/Pages2/PageSettingsServerData.qml b/client/ui/qml/Pages2/PageSettingsServerData.qml index f34d2d522..94ad2a16d 100644 --- a/client/ui/qml/Pages2/PageSettingsServerData.qml +++ b/client/ui/qml/Pages2/PageSettingsServerData.qml @@ -59,7 +59,7 @@ PageType { Connections { target: ServersUiController - function onProcessedServerIndexChanged() { + function onProcessedServerIdChanged() { root.isServerWithWriteAccess = ServersUiController.isProcessedServerHasWriteAccess() } } @@ -111,7 +111,7 @@ PageType { readonly property var tColor: AmneziaStyle.color.paleGray readonly property var clickedHandler: function() { PageController.showBusyIndicator(true) - InstallController.scanServerForInstalledContainers(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + InstallController.scanServerForInstalledContainers(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } } @@ -134,7 +134,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot reboot server during active connection")) } else { PageController.showBusyIndicator(true) - InstallController.rebootServer(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + InstallController.rebootServer(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } } @@ -164,7 +164,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot remove server during active connection")) } else { PageController.showBusyIndicator(true) - InstallController.removeServer(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + InstallController.removeServer(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } } @@ -194,7 +194,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot clear server from Amnezia software during active connection")) } else { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeAllContainers(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + InstallController.removeAllContainers(ServersUiController.processedServerId) } } var noButtonFunction = function() { @@ -208,7 +208,7 @@ PageType { QtObject { id: reset - property bool isVisible: ServersModel.getProcessedServerData("isServerFromTelegramApi") + property bool isVisible: ServersUiController.isServerFromApi(ServersUiController.processedServerId) readonly property string title: qsTr("Reset API config") readonly property string description: "" readonly property var tColor: AmneziaStyle.color.vibrantRed @@ -223,7 +223,7 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot reset API config during active connection")) } else { PageController.showBusyIndicator(true) - SubscriptionUiController.removeApiConfig(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + SubscriptionUiController.removeApiConfig(ServersUiController.processedServerId) PageController.showBusyIndicator(false) } } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 8611d10f0..ac0e67a16 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -31,10 +31,18 @@ PageType { } } + Connections { + target: ServersUiController + + function onProcessedServerIdChanged() { + root.processedServer = proxyServersModel.get(0) + } + } + Connections { target: ServersModel - function onProcessedServerChanged() { + function onModelReset() { root.processedServer = proxyServersModel.get(0) } } @@ -46,8 +54,8 @@ PageType { sourceModel: ServersModel filters: [ ValueFilter { - roleName: "isCurrentlyProcessed" - value: true + roleName: "serverId" + value: ServersUiController.processedServerId } ] @@ -80,11 +88,14 @@ PageType { actionButtonImage: "qrc:/images/controls/edit-3.svg" - headerText: root.processedServer.name + headerText: root.processedServer != null ? root.processedServer.name : "" descriptionText: { - if (root.processedServer.isServerFromTelegramApi) { + if (root.processedServer == null) { + return "" + } + if (ServersUiController.isServerFromApi(ServersUiController.processedServerId)) { return root.processedServer.serverDescription - } else if (root.processedServer.hasWriteAccess) { + } else if (ServersUiController.isProcessedServerHasWriteAccess()) { return root.processedServer.credentialsLogin + " · " + root.processedServer.hostName } else { return root.processedServer.hostName @@ -104,7 +115,7 @@ PageType { anchors.fill: parent expandedHeight: root.height * 0.35 - serverNameText: root.processedServer.name + serverNameText: root.processedServer != null ? root.processedServer.name : "" } TabBar { @@ -112,8 +123,8 @@ PageType { Layout.fillWidth: true - currentIndex: (ServersModel.getProcessedServerData("isServerFromTelegramApi") - && !ServersModel.getProcessedServerData("hasInstalledContainers")) ? + currentIndex: (ServersUiController.isServerFromApi(ServersUiController.processedServerId) + && !ServersUiController.serverHasInstalledContainers(ServersUiController.processedServerId)) ? root.pageSettingsServerData : root.pageSettingsServerProtocols background: Rectangle { diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml index e7ffe90db..5d61a7d3c 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocol.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocol.qml @@ -76,7 +76,7 @@ PageType { clickedFunction: function() { if (isClientProtocolExists) { - InstallController.openClientSettings(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, protocolIndex) + InstallController.openClientSettings(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, protocolIndex) PageController.goToPage(clientProtocolPage); } else { PageController.showNotificationMessage(qsTr("Click the \"connect\" button to create a connection configuration")) @@ -104,7 +104,7 @@ PageType { visible: delegateContent.isServerSettingsVisible clickedFunction: function() { - InstallController.openServerSettings(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex, protocolIndex) + InstallController.openServerSettings(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, protocolIndex) PageController.goToPage(serverProtocolPage); } @@ -140,14 +140,14 @@ PageType { var noButtonText = qsTr("Cancel") var yesButtonFunction = function() { - if (ConnectionController.isConnected && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + if (ConnectionController.isConnected && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { var message = qsTr("Unable to clear %1 profile while there is an active connection").arg(ContainersModel.getProcessedContainerName()) PageController.showNotificationMessage(message) return } PageController.showBusyIndicator(true) - InstallController.clearCachedProfile(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.clearCachedProfile(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) PageController.showBusyIndicator(false) } @@ -186,12 +186,12 @@ PageType { var yesButtonFunction = function() { if (ServersUiController.isDefaultServerCurrentlyProcessed() && ConnectionController.isConnected - && ServersModel.getDefaultServerData("defaultContainer") === ServersUiController.processedContainerIndex) { + && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex) { PageController.showNotificationMessage(qsTr("Cannot remove active container")) } else { PageController.goToPage(PageEnum.PageDeinstalling) - InstallController.removeContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), ServersUiController.processedContainerIndex) + InstallController.removeContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } } var noButtonFunction = function() { diff --git a/client/ui/qml/Pages2/PageSettingsServerProtocols.qml b/client/ui/qml/Pages2/PageSettingsServerProtocols.qml index 762dcb1d0..f11df7bec 100644 --- a/client/ui/qml/Pages2/PageSettingsServerProtocols.qml +++ b/client/ui/qml/Pages2/PageSettingsServerProtocols.qml @@ -32,7 +32,7 @@ PageType { Connections { target: ServersUiController - function onProcessedServerIndexChanged() { + function onProcessedServerIdChanged() { settingsContainersListView.updateContainersModelFilters() } } diff --git a/client/ui/qml/Pages2/PageSettingsServerServices.qml b/client/ui/qml/Pages2/PageSettingsServerServices.qml index 6f8fda2c8..520c60436 100644 --- a/client/ui/qml/Pages2/PageSettingsServerServices.qml +++ b/client/ui/qml/Pages2/PageSettingsServerServices.qml @@ -28,7 +28,7 @@ PageType { Connections { target: ServersUiController - function onProcessedServerIndexChanged() { + function onProcessedServerIdChanged() { settingsContainersListView.updateContainersModelFilters() } } diff --git a/client/ui/qml/Pages2/PageSettingsServersList.qml b/client/ui/qml/Pages2/PageSettingsServersList.qml index 478900d4e..7d6e60601 100644 --- a/client/ui/qml/Pages2/PageSettingsServersList.qml +++ b/client/ui/qml/Pages2/PageSettingsServersList.qml @@ -77,7 +77,7 @@ PageType { servicesNameString += servicesName[i] + " · " } - if (ServersModel.isServerFromApi(index)) { + if (ServersUiController.isServerFromApi(serverId)) { return servicesNameString + serverDescription } else { return servicesNameString + hostName @@ -86,11 +86,11 @@ PageType { rightImageSource: "qrc:/images/controls/chevron-right.svg" clickedFunction: function() { - ServersUiController.setProcessedServerIndex(index) + ServersUiController.setProcessedServerId(serverId) - if (ServersModel.getProcessedServerData("isServerFromGatewayApi")) { + if (ServersUiController.isServerFromApi(ServersUiController.processedServerId)) { PageController.showBusyIndicator(true) - let result = SubscriptionUiController.getAccountInfo(ServersUiController.getServerId(ServersUiController.processedServerIndex), false) + let result = SubscriptionUiController.getAccountInfo(ServersUiController.processedServerId, false) PageController.showBusyIndicator(false) if (!result) { return diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index d3ab32659..168d38270 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -20,7 +20,7 @@ import "../Components" PageType { id: root - property var isServerFromTelegramApi: ServersModel.getDefaultServerData("isServerFromTelegramApi") + property var isServerFromTelegramApi: ServersUiController.isServerFromApi(ServersUiController.defaultServerId) property bool pageEnabled diff --git a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml index 24436cc38..e2d528624 100644 --- a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml +++ b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml @@ -121,7 +121,7 @@ PageType { var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0].textField.text InstallController.setProcessedServerCredentials(_hostname, _username, _secretData) - ServersUiController.setProcessedServerIndex(-1) + ServersUiController.setProcessedServerId("") PageController.showBusyIndicator(true) var isConnectionOpened = InstallController.checkSshConnection() diff --git a/client/ui/qml/Pages2/PageSetupWizardEasy.qml b/client/ui/qml/Pages2/PageSetupWizardEasy.qml index faefd1e25..0e0ee1769 100644 --- a/client/ui/qml/Pages2/PageSetupWizardEasy.qml +++ b/client/ui/qml/Pages2/PageSetupWizardEasy.qml @@ -165,7 +165,7 @@ PageType { InstallController.install(listView.dockerContainer, listView.containerDefaultPort, listView.containerDefaultTransportProto, - ServersUiController.getServerId(ServersUiController.processedServerIndex)) + ServersUiController.processedServerId) } else { PageController.goToPage(PageEnum.PageSetupWizardProtocols) } diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index 2d7841496..01ced7f03 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -15,22 +15,21 @@ import "../Config" PageType { id: root - Component.onCompleted: PageController.disableTabBar(true) + Component.onCompleted: { + root.installingContainerIndex = ServersUiController.processedContainerIndex + PageController.disableTabBar(true) + } Component.onDestruction: PageController.disableTabBar(false) property bool isTimerRunning: true property string progressBarText: qsTr("Usually it takes no more than 5 minutes") property bool isCancelButtonVisible: false + property int installingContainerIndex: -1 Connections { target: InstallController function onInstallContainerFinished(finishedMessage, isServiceInstall) { - var containerIndex = ServersUiController.processedContainerIndex - if (!ConnectionController.isConnected && !ContainersModel.isServiceContainer(containerIndex)) { - ServersUiController.setDefaultContainer(ServersUiController.getServerId(ServersUiController.processedServerIndex), containerIndex) - } - PageController.closePage() // close installing page PageController.closePage() // close protocol settings page @@ -46,18 +45,13 @@ PageType { } function onInstallServerFinished(finishedMessage) { - if (!ConnectionController.isConnected) { - ServersUiController.setDefaultServerAtIndex(ServersModel.getServersCount() - 1); - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) - } - PageController.goToPageHome() PageController.showNotificationMessage(finishedMessage) } function onServerAlreadyExists(serverIndex) { PageController.goToStartPage() - ServersUiController.setProcessedServerIndex(serverIndex) + ServersUiController.setProcessedServerId(ServersUiController.getServerId(serverIndex)) PageController.goToPage(PageEnum.PageSettingsServerInfo, false) PageController.showErrorMessage(qsTr("The server has already been added to the application")) @@ -83,8 +77,8 @@ PageType { sourceModel: ContainersModel filters: [ ValueFilter { - roleName: "isCurrentlyProcessed" - value: true + roleName: "dockerContainer" + value: root.installingContainerIndex } ] } diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index bd51a3ced..57fd1324f 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -243,7 +243,7 @@ PageType { } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.install(dockerContainer, port.textField.text, transportProtoSelector.currentIndex, ServersUiController.getServerId(ServersUiController.processedServerIndex)) + InstallController.install(dockerContainer, port.textField.text, transportProtoSelector.currentIndex, ServersUiController.processedServerId) } } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 0ea626ef0..9e5d834f0 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -43,7 +43,7 @@ PageType { var configFileName var containerIndex = ServersUiController.processedContainerIndex - var serverId = ServersUiController.getServerId(ServersUiController.processedServerIndex) + var serverId = ServersUiController.processedServerId switch (type) { case PageShare.ConfigType.AmneziaConnection: { @@ -249,7 +249,7 @@ PageType { onClicked: { accessTypeSelector.currentIndex = 1 PageController.showBusyIndicator(true) - ExportController.updateClientManagementModel(ServersUiController.getServerId(ServersUiController.processedServerIndex), + ExportController.updateClientManagementModel(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) PageController.showBusyIndicator(false) } @@ -332,8 +332,10 @@ PageType { } Component.onCompleted: { - if (ServersModel.isDefaultServerHasWriteAccess() && ServersModel.getDefaultServerData("hasInstalledContainers")) { - serverSelectorListView.selectedIndex = proxyServersModel.mapFromSource(ServersUiController.defaultServerIndex) + if (ServersUiController.isServerHasWriteAccess(ServersUiController.defaultServerId) + && ServersUiController.serverHasInstalledContainers(ServersUiController.defaultServerId)) { + serverSelectorListView.selectedIndex = + proxyServersModel.mapFromSource(ServersUiController.getServerIndexById(ServersUiController.defaultServerId)) } else { serverSelectorListView.selectedIndex = 0 } @@ -344,7 +346,7 @@ PageType { function handler() { serverSelector.text = selectedText - ServersUiController.setProcessedServerIndex(proxyServersModel.mapToSource(selectedIndex)) + ServersUiController.setProcessedServerId(ServersUiController.getServerId(proxyServersModel.mapToSource(selectedIndex))) } } } @@ -394,7 +396,7 @@ PageType { target: serverSelector function onServerSelectorIndexChanged() { - var defaultContainer = proxyContainersModel.mapFromSource(ServersModel.getProcessedServerData("defaultContainer")) + var defaultContainer = proxyContainersModel.mapFromSource(ServersUiController.serverDefaultContainer(ServersUiController.processedServerId)) containerSelectorListView.selectedIndex = defaultContainer containerSelectorListView.positionViewAtIndex(selectedIndex, ListView.Beginning) containerSelectorListView.triggerCurrentItem() @@ -417,7 +419,7 @@ PageType { if (accessTypeSelector.currentIndex === 1) { PageController.showBusyIndicator(true) - ExportController.updateClientManagementModel(ServersUiController.getServerId(ServersUiController.processedServerIndex), + ExportController.updateClientManagementModel(ServersUiController.processedServerId, ServersUiController.processedContainerIndex) PageController.showBusyIndicator(false) } @@ -793,7 +795,7 @@ PageType { PageController.showBusyIndicator(true) ExportController.renameClient(proxyClientManagementModel.mapToSource(index), clientNameEditor.textField.text, - ServersUiController.getServerId(ServersUiController.processedServerIndex), + ServersUiController.processedServerId, ServersUiController.processedContainerIndex) PageController.showBusyIndicator(false) Qt.callLater(function(){ clientsListView.freezeFilter = false }) @@ -829,14 +831,14 @@ PageType { clientInfoDrawer.closeTriggered() PageController.showBusyIndicator(true) ExportController.revokeConfig(proxyClientManagementModel.mapToSource(index), - ServersUiController.getServerId(ServersUiController.processedServerIndex), + ServersUiController.processedServerId, ServersUiController.processedContainerIndex) } var noButtonFunction = function() { } - var isActiveConfigForCurrentClient = ServersModel.isDefaultServerCurrentlyProcessed() - && ServersModel.getDefaultServerData("defaultContainer") === ContainersModel.getProcessedContainerIndex() + var isActiveConfigForCurrentClient = ServersUiController.isDefaultServerCurrentlyProcessed() + && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex if ((ConnectionController.isConnectionInProgress || ConnectionController.isConnected) && isActiveConfigForCurrentClient) { diff --git a/client/ui/qml/Pages2/PageShareFullAccess.qml b/client/ui/qml/Pages2/PageShareFullAccess.qml index 7fb0dd61d..b6c7bdc30 100644 --- a/client/ui/qml/Pages2/PageShareFullAccess.qml +++ b/client/ui/qml/Pages2/PageShareFullAccess.qml @@ -118,14 +118,14 @@ PageType { } Component.onCompleted: { - serverSelectorListView.currentIndex = ServersModel.isDefaultServerHasWriteAccess() ? - proxyServersModel.mapFromSource(ServersUiController.defaultServerIndex) : 0 + serverSelectorListView.currentIndex = ServersUiController.isServerHasWriteAccess(ServersUiController.defaultServerId) ? + proxyServersModel.mapFromSource(ServersUiController.getServerIndexById(ServersUiController.defaultServerId)) : 0 serverSelectorListView.triggerCurrentItem() } function handler() { serverSelector.text = selectedText - ServersUiController.setProcessedServerIndex(proxyServersModel.mapToSource(selectedIndex)) + ServersUiController.setProcessedServerId(ServersUiController.getServerId(proxyServersModel.mapToSource(selectedIndex))) } } } @@ -155,7 +155,7 @@ PageType { ExportController.exportErrorOccurred(qsTr("Access error!")) return } else { - ExportController.generateFullAccessConfig(ServersUiController.getServerId(ServersUiController.processedServerIndex)) + ExportController.generateFullAccessConfig(ServersUiController.processedServerId) } PageController.showBusyIndicator(false) diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 5096be733..08824f5a2 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -144,7 +144,7 @@ PageType { } function onRemoveServerFinished(finishedMessage) { - if (!ServersModel.getServersCount()) { + if (!ServersUiController.getServersCount()) { PageController.goToPageHome() } else { PageController.goToStartPage() @@ -156,22 +156,11 @@ PageType { function onNoInstalledContainers() { PageController.setTriggeredByConnectButton(true) - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) + ServersUiController.setProcessedServerId(ServersUiController.defaultServerId) PageController.goToPage(PageEnum.PageSetupWizardEasy) } } - Connections { - objectName: "connectionControllerConnections" - - target: ConnectionController - - function onReconnectWithUpdatedContainer(message) { - PageController.showNotificationMessage(message) - PageController.closePage() - } - } - Connections { objectName: "importControllerConnections" @@ -227,7 +216,7 @@ PageType { } function onApiServerRemoved(message) { - if (!ServersModel.getServersCount()) { + if (!ServersUiController.getServersCount()) { PageController.goToPageHome() } else { PageController.goToStartPage() @@ -237,15 +226,6 @@ PageType { } function onInstallServerFromApiFinished(message, preferredDefaultIndex) { - if (!ConnectionController.isConnected) { - if (preferredDefaultIndex !== undefined && preferredDefaultIndex >= 0) { - ServersUiController.setDefaultServerAtIndex(preferredDefaultIndex) - } else { - ServersUiController.setDefaultServerAtIndex(ServersModel.getServersCount() - 1); - } - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) - } - PageController.goToPageHome() PageController.showNotificationMessage(message) } @@ -286,7 +266,7 @@ PageType { } else { tabBar.visible = true pagePath = PageController.getPagePath(PageEnum.PageHome) - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) + ServersUiController.setProcessedServerId(ServersUiController.defaultServerId) } tabBarStackView.push(pagePath, { "objectName" : pagePath }) @@ -360,7 +340,7 @@ PageType { image: "qrc:/images/controls/home.svg" clickedFunc: function () { tabBarStackView.goToTabBarPage(PageEnum.PageHome) - ServersUiController.setProcessedServerIndex(ServersUiController.defaultServerIndex) + ServersUiController.setProcessedServerId(ServersUiController.defaultServerId) tabBar.currentIndex = 0 } } @@ -374,15 +354,15 @@ PageType { function onModelReset() { if (!SettingsController.isOnTv()) { - var hasServerWithWriteAccess = ServersModel.hasServerWithWriteAccess() + var hasServerWithWriteAccess = ServersUiController.hasServerWithWriteAccess() shareTabButton.visible = hasServerWithWriteAccess shareTabButton.width = hasServerWithWriteAccess ? undefined : 0 } } } - visible: !SettingsController.isOnTv() && ServersModel.hasServerWithWriteAccess() - width: !SettingsController.isOnTv() && ServersModel.hasServerWithWriteAccess() ? undefined : 0 + visible: !SettingsController.isOnTv() && ServersUiController.hasServerWithWriteAccess() + width: !SettingsController.isOnTv() && ServersUiController.hasServerWithWriteAccess() ? undefined : 0 isSelected: tabBar.currentIndex === 1 image: "qrc:/images/controls/share-2.svg" diff --git a/client/ui/utils/qAutoStart.cpp b/client/ui/utils/qAutoStart.cpp index 7ccdb4ec9..2023184f4 100644 --- a/client/ui/utils/qAutoStart.cpp +++ b/client/ui/utils/qAutoStart.cpp @@ -124,7 +124,7 @@ void Autostart::setAutostart(bool autostart) { if (file.open(QIODevice::ReadWrite)) { QTextStream stream(&file); stream << "[Desktop Entry]" << Qt::endl; - stream << "Exec=AmneziaVPN" << Qt::endl; + stream << "Exec=" << appPath() << Qt::endl; stream << "Type=Application" << Qt::endl; stream << "Name=AmneziaVPN" << Qt::endl; stream << "Comment=Client of your self-hosted VPN" << Qt::endl;