#include "protocolConfig.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/containerEnum.h" #include "core/utils/containers/containerUtils.h" #include "core/utils/protocolEnum.h" #include "core/models/protocols/ikev2ProtocolConfig.h" #include "core/models/protocols/dnsProtocolConfig.h" #include "core/models/protocols/mtProxyProtocolConfig.h" #include "core/models/protocols/telemtProtocolConfig.h" namespace amnezia { using namespace ProtocolEnumNS; using namespace ProtocolUtils; Proto ProtocolConfig::type() const { return std::visit([](auto&& arg) -> Proto { using T = std::decay_t; if constexpr (std::is_same_v) { return Proto::Awg; } else if constexpr (std::is_same_v) { return Proto::WireGuard; } else if constexpr (std::is_same_v) { return Proto::OpenVpn; } else if constexpr (std::is_same_v) { return Proto::Xray; } else if constexpr (std::is_same_v) { return Proto::Sftp; } else if constexpr (std::is_same_v) { return Proto::Socks5Proxy; } else if constexpr (std::is_same_v) { return Proto::Ikev2; } else if constexpr (std::is_same_v) { return Proto::TorWebSite; } else if constexpr (std::is_same_v) { return Proto::Dns; } else if constexpr (std::is_same_v) { return Proto::MtProxy; } else if constexpr (std::is_same_v) { return Proto::Telemt; } return Proto::Unknown; }, data); } QString ProtocolConfig::port() const { return std::visit([](auto&& arg) -> QString { using T = std::decay_t; if constexpr (std::is_same_v) { return arg.serverConfig.port; } else if constexpr (std::is_same_v) { return arg.serverConfig.port; } else if constexpr (std::is_same_v) { return arg.serverConfig.port; } else if constexpr (std::is_same_v) { return arg.serverConfig.port; } else if constexpr (std::is_same_v) { return arg.port; } else if constexpr (std::is_same_v) { return arg.port; } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return arg.port.isEmpty() ? QString(protocols::mtProxy::defaultPort) : arg.port; } else if constexpr (std::is_same_v) { return arg.port.isEmpty() ? QString(protocols::telemt::defaultPort) : arg.port; } return QString(); }, data); } QString ProtocolConfig::transportProto() const { return std::visit([](auto&& arg) -> QString { using T = std::decay_t; if constexpr (std::is_same_v) { return arg.serverConfig.transportProto; } else if constexpr (std::is_same_v) { return arg.serverConfig.transportProto; } else if constexpr (std::is_same_v) { return arg.serverConfig.transportProto; } else if constexpr (std::is_same_v) { return arg.serverConfig.transportProto; } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return QString(); } else if constexpr (std::is_same_v) { return QStringLiteral("tcp"); } else if constexpr (std::is_same_v) { return QStringLiteral("tcp"); } return QString(); }, data); } bool ProtocolConfig::hasClientConfig() const { return std::visit([](auto&& arg) -> bool { using T = std::decay_t; if constexpr (std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v) { return arg.hasClientConfig(); } return false; }, data); } QString ProtocolConfig::clientId() const { return std::visit([](auto&& arg) -> QString { using T = std::decay_t; if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->clientId; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->clientId; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->clientId; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->id; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->clientId; } } return QString(); }, data); } QJsonObject ProtocolConfig::getClientConfigJson() const { return std::visit([](auto&& arg) -> QJsonObject { using T = std::decay_t; if constexpr (std::is_same_v) { if (arg.hasClientConfig()) { return arg.clientConfig->toJson(); } } else if constexpr (std::is_same_v) { if (arg.hasClientConfig()) { return arg.clientConfig->toJson(); } } else if constexpr (std::is_same_v) { if (arg.hasClientConfig()) { return arg.clientConfig->toJson(); } } else if constexpr (std::is_same_v) { if (arg.hasClientConfig()) { return arg.clientConfig->toJson(); } } else if constexpr (std::is_same_v) { if (arg.hasClientConfig()) { return arg.clientConfig->toJson(); } } return QJsonObject(); }, data); } void ProtocolConfig::setClientConfigJson(const QJsonObject& json) { std::visit([&json](auto&& arg) { using T = std::decay_t; if constexpr (std::is_same_v) { arg.setClientConfig(AwgClientConfig::fromJson(json)); } else if constexpr (std::is_same_v) { arg.setClientConfig(WireGuardClientConfig::fromJson(json)); } else if constexpr (std::is_same_v) { arg.setClientConfig(OpenVpnClientConfig::fromJson(json)); } else if constexpr (std::is_same_v) { arg.setClientConfig(XrayClientConfig::fromJson(json)); } else if constexpr (std::is_same_v) { arg.setClientConfig(Ikev2ClientConfig::fromJson(json)); } }, data); } void ProtocolConfig::clearClientConfig() { std::visit([](auto&& arg) { using T = std::decay_t; if constexpr (std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v) { arg.clearClientConfig(); } }, data); } QString ProtocolConfig::nativeConfig() const { return std::visit([](auto&& arg) -> QString { using T = std::decay_t; if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->nativeConfig; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->nativeConfig; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->nativeConfig; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->nativeConfig; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { return arg.clientConfig->nativeConfig; } } return QString(); }, data); } void ProtocolConfig::setNativeConfig(const QString &config) { std::visit([&config](auto&& arg) { using T = std::decay_t; if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { arg.clientConfig->nativeConfig = config; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { arg.clientConfig->nativeConfig = config; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { arg.clientConfig->nativeConfig = config; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { arg.clientConfig->nativeConfig = config; } } else if constexpr (std::is_same_v) { if (arg.clientConfig.has_value()) { arg.clientConfig->nativeConfig = config; } } }, data); } bool ProtocolConfig::isThirdPartyConfig() const { return std::visit([](auto&& arg) -> bool { using T = std::decay_t; if constexpr (std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v) { return arg.serverConfig.isThirdPartyConfig; } return false; }, data); } QJsonObject ProtocolConfig::toJson() const { return std::visit([](auto&& arg) -> QJsonObject { return arg.toJson(); }, data); } ProtocolConfig ProtocolConfig::fromJson(const QJsonObject& json, Proto type) { switch (type) { case Proto::Awg: return ProtocolConfig{AwgProtocolConfig::fromJson(json)}; case Proto::WireGuard: return ProtocolConfig{WireGuardProtocolConfig::fromJson(json)}; case Proto::OpenVpn: return ProtocolConfig{OpenVpnProtocolConfig::fromJson(json)}; case Proto::Xray: case Proto::SSXray: return ProtocolConfig{XrayProtocolConfig::fromJson(json)}; case Proto::Sftp: return ProtocolConfig{SftpProtocolConfig::fromJson(json)}; case Proto::Socks5Proxy: return ProtocolConfig{Socks5ProxyProtocolConfig::fromJson(json)}; case Proto::Ikev2: return ProtocolConfig{Ikev2ProtocolConfig::fromJson(json)}; case Proto::TorWebSite: return ProtocolConfig{TorProtocolConfig::fromJson(json)}; case Proto::Dns: return ProtocolConfig{DnsProtocolConfig::fromJson(json)}; case Proto::MtProxy: return ProtocolConfig{MtProxyProtocolConfig::fromJson(json)}; case Proto::Telemt: return ProtocolConfig{TelemtProtocolConfig::fromJson(json)}; default: return ProtocolConfig{AwgProtocolConfig{}}; } } } // namespace amnezia