From 583f058dd9356eed143564c8b1ee7e86c414ceee Mon Sep 17 00:00:00 2001 From: MrMirDan Date: Tue, 9 Jun 2026 17:10:22 +0300 Subject: [PATCH] update: separated self-hosted dns settings --- .../core/controllers/connectionController.cpp | 2 +- .../selfhosted/exportController.cpp | 18 ++++----- .../selfhosted/installController.cpp | 3 +- client/core/controllers/serversController.cpp | 40 +++++++++++++++++++ client/core/controllers/serversController.h | 3 ++ .../selfHostedAdminServerConfig.cpp | 13 ++++-- .../selfhosted/selfHostedAdminServerConfig.h | 4 +- client/core/models/serverDescription.cpp | 6 +-- client/core/utils/constants/configKeys.h | 1 + 9 files changed, 69 insertions(+), 21 deletions(-) diff --git a/client/core/controllers/connectionController.cpp b/client/core/controllers/connectionController.cpp index 55a1e7a32..8e986574d 100644 --- a/client/core/controllers/connectionController.cpp +++ b/client/core/controllers/connectionController.cpp @@ -73,7 +73,7 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId, if (!cfg.has_value()) return ErrorCode::InternalError; container = cfg->defaultContainer; containerConfigModel = cfg->containerConfig(container); - dns = cfg->getDnsPair(m_appSettingsRepository->useAmneziaDns(), primaryDns, secondaryDns); + dns = cfg->getDnsPair(primaryDns, secondaryDns); hostName = cfg->hostName; description = cfg->description; break; diff --git a/client/core/controllers/selfhosted/exportController.cpp b/client/core/controllers/selfhosted/exportController.cpp index 75faccf20..382b27254 100644 --- a/client/core/controllers/selfhosted/exportController.cpp +++ b/client/core/controllers/selfhosted/exportController.cpp @@ -65,13 +65,15 @@ ExportController::ExportResult ExportController::generateConnectionConfig(const } ContainerConfig containerConfig = adminConfig->containerConfig(container); + const QPair dns = adminConfig->getDnsPair(m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns()); + if (ContainerUtils::containerService(container) != ServiceType::Other) { SshSession sshSession; Proto protocol = ContainerUtils::defaultProtocol(container); DnsSettings dnsSettings = { - m_appSettingsRepository->primaryDns(), - m_appSettingsRepository->secondaryDns() + dns.first, + dns.second }; auto configurator = ConfiguratorBase::create(protocol, &sshSession); @@ -88,10 +90,6 @@ ExportController::ExportResult ExportController::generateConnectionConfig(const } } - const QPair dns = adminConfig->getDnsPair(m_appSettingsRepository->useAmneziaDns(), - m_appSettingsRepository->primaryDns(), - m_appSettingsRepository->secondaryDns()); - adminConfig->containers.clear(); adminConfig->containers[container] = containerConfig; adminConfig->defaultContainer = container; @@ -133,16 +131,14 @@ ExportController::NativeConfigResult ExportController::generateNativeConfig(cons result.errorCode = ErrorCode::InternalError; return result; } - const QPair dns = adminConfig->getDnsPair(m_appSettingsRepository->useAmneziaDns(), - m_appSettingsRepository->primaryDns(), - m_appSettingsRepository->secondaryDns()); + const QPair dns = adminConfig->getDnsPair(m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns()); ContainerConfig modifiedContainerConfig = containerConfig; modifiedContainerConfig.container = container; DnsSettings dnsSettings = { - m_appSettingsRepository->primaryDns(), - m_appSettingsRepository->secondaryDns() + dns.first, + dns.second }; SshSession sshSession; diff --git a/client/core/controllers/selfhosted/installController.cpp b/client/core/controllers/selfhosted/installController.cpp index abf317441..b95256ae1 100644 --- a/client/core/controllers/selfhosted/installController.cpp +++ b/client/core/controllers/selfhosted/installController.cpp @@ -211,7 +211,8 @@ ErrorCode InstallController::updateContainer(const QString &serverId, DockerCont newConfig.getXrayProtocolConfig() && newConfig.getXrayProtocolConfig()->serverConfig.isThirdPartyConfig; if (errorCode == ErrorCode::NoError && xrayServerSettingsChanged && !skipXrayInboundSync) { - DnsSettings dnsSettings = { m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns() }; + const QPair dns = adminConfig->getDnsPair(m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns()); + DnsSettings dnsSettings = { dns.first, dns.second }; XrayConfigurator xrayConfigurator(&sshSession); qDebug() << "InstallController::updateContainer applying Xray server inbound sync, reinstall=" << reinstallRequired; diff --git a/client/core/controllers/serversController.cpp b/client/core/controllers/serversController.cpp index e7b71fd4a..e69f093ac 100644 --- a/client/core/controllers/serversController.cpp +++ b/client/core/controllers/serversController.cpp @@ -83,6 +83,46 @@ bool ServersController::renameServer(const QString &serverId, const QString &nam } } +bool ServersController::changeServerDns(const QString &serverId, const QString &primaryDns, const QString &secondaryDns, const int &dnsMode) +{ + const serverConfigUtils::ConfigType kind = m_serversRepository->serverKind(serverId); + if(kind == serverConfigUtils::ConfigType::SelfHostedAdmin) { + auto cfg = m_serversRepository->selfHostedAdminConfig(serverId); + if (!cfg.has_value()) return false; + cfg->dns1 = primaryDns; + cfg->dns2 = secondaryDns; + cfg->dnsMode = dnsMode; + m_serversRepository->editServer(serverId, cfg->toJson(), kind); + return true; + }else{ + return false; + } +} + +QPair ServersController::getDnsPair(const QString &serverId) const +{ + const serverConfigUtils::ConfigType kind = m_serversRepository->serverKind(serverId); + if (kind == serverConfigUtils::ConfigType::SelfHostedAdmin) { + const auto cfg = m_serversRepository->selfHostedAdminConfig(serverId); + return cfg.has_value() + ? cfg->getDnsPair(m_appSettingsRepository->primaryDns(), m_appSettingsRepository->primaryDns()) + : QPair(); + } else { + return QPair(); + } +} + +int ServersController::getDnsMode(const QString &serverId) const +{ + const serverConfigUtils::ConfigType kind = m_serversRepository->serverKind(serverId); + if (kind == serverConfigUtils::ConfigType::SelfHostedAdmin) { + const auto cfg = m_serversRepository->selfHostedAdminConfig(serverId); + return cfg.has_value() ? cfg->dnsMode : int(); + } else { + return int(); + } +} + void ServersController::removeServer(const QString &serverId) { m_serversRepository->removeServer(serverId); diff --git a/client/core/controllers/serversController.h b/client/core/controllers/serversController.h index e8286ed4c..4a9e5eb13 100644 --- a/client/core/controllers/serversController.h +++ b/client/core/controllers/serversController.h @@ -37,6 +37,7 @@ public: // Server management bool renameServer(const QString &serverId, const QString &name); + bool changeServerDns(const QString &serverId, const QString &primaryDns, const QString &secondaryDns, const int &dnsMode); void removeServer(const QString &serverId); void setDefaultServer(const QString &serverId); @@ -57,6 +58,8 @@ public: QMap getServerContainersMap(const QString &serverId) const; DockerContainer getDefaultContainer(const QString &serverId) const; ContainerConfig getContainerConfig(const QString &serverId, DockerContainer container) const; + QPair getDnsPair(const QString &serverId) const; + int getDnsMode(const QString &serverId) const; // Validation bool isServerFromApiAlreadyExists(const QString &userCountryCode, const QString &serviceType, const QString &serviceProtocol) const; diff --git a/client/core/models/selfhosted/selfHostedAdminServerConfig.cpp b/client/core/models/selfhosted/selfHostedAdminServerConfig.cpp index 6c514f371..98482ab73 100644 --- a/client/core/models/selfhosted/selfHostedAdminServerConfig.cpp +++ b/client/core/models/selfhosted/selfHostedAdminServerConfig.cpp @@ -64,15 +64,14 @@ void SelfHostedAdminServerConfig::clearCachedClientProfile(DockerContainer conta containers[container] = cleared; } -QPair SelfHostedAdminServerConfig::getDnsPair(bool isAmneziaDnsEnabled, const QString &primaryDns, - const QString &secondaryDns) const +QPair SelfHostedAdminServerConfig::getDnsPair(const QString &primaryDns, const QString &secondaryDns) const { QString d1 = dns1; QString d2 = dns2; const bool dnsOnServer = containers.contains(DockerContainer::Dns); if (d1.isEmpty() || !NetworkUtilities::checkIPv4Format(d1)) { - d1 = (isAmneziaDnsEnabled && dnsOnServer) ? protocols::dns::amneziaDnsIp : primaryDns; + d1 = ((dnsMode == 1) && dnsOnServer) ? protocols::dns::amneziaDnsIp : primaryDns; } if (d2.isEmpty() || !NetworkUtilities::checkIPv4Format(d2)) { d2 = secondaryDns; @@ -110,6 +109,9 @@ QJsonObject SelfHostedAdminServerConfig::toJson() const if (!dns2.isEmpty()) { obj[configKey::dns2] = dns2; } + if (dnsMode > -1) { + obj[configKey::dnsMode] = dnsMode; + } if (!userName.isEmpty()) { obj[configKey::userName] = userName; @@ -147,6 +149,11 @@ SelfHostedAdminServerConfig SelfHostedAdminServerConfig::fromJson(const QJsonObj config.dns1 = json.value(configKey::dns1).toString(); config.dns2 = json.value(configKey::dns2).toString(); + if (json.contains(configKey::dnsMode)) { + config.dnsMode = json.value(configKey::dnsMode).toInt(); + } else { + config.dnsMode = 0; + } config.userName = json.value(configKey::userName).toString(); config.password = json.value(configKey::password).toString(); diff --git a/client/core/models/selfhosted/selfHostedAdminServerConfig.h b/client/core/models/selfhosted/selfHostedAdminServerConfig.h index bd4a04716..f216cbfcb 100644 --- a/client/core/models/selfhosted/selfHostedAdminServerConfig.h +++ b/client/core/models/selfhosted/selfHostedAdminServerConfig.h @@ -26,6 +26,7 @@ struct SelfHostedAdminServerConfig { DockerContainer defaultContainer; QString dns1; QString dns2; + int dnsMode = 0; QString userName; QString password; @@ -41,8 +42,7 @@ struct SelfHostedAdminServerConfig { void clearCachedClientProfile(DockerContainer container); - QPair getDnsPair(bool isAmneziaDnsEnabled, const QString &primaryDns, - const QString &secondaryDns) const; + QPair getDnsPair(const QString &primaryDns, const QString &secondaryDns) const; QJsonObject toJson() const; static SelfHostedAdminServerConfig fromJson(const QJsonObject &json); diff --git a/client/core/models/serverDescription.cpp b/client/core/models/serverDescription.cpp index c533a094b..c6771b468 100644 --- a/client/core/models/serverDescription.cpp +++ b/client/core/models/serverDescription.cpp @@ -80,8 +80,8 @@ QString getProtocolName(DockerContainer defaultContainer, const QMap