diff --git a/CMakeLists.txt b/CMakeLists.txt index 7907308..323dc05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,7 @@ set(PROJECT_SOURCES src/configs/outbounds/anyTLS.cpp src/configs/outbounds/http.cpp src/configs/outbounds/hysteria.cpp + src/configs/outbounds/hysteria2.cpp src/configs/outbounds/shadowsocks.cpp src/configs/outbounds/socks.cpp src/configs/outbounds/ssh.cpp @@ -266,30 +267,8 @@ set(PROJECT_SOURCES src/configs/outbounds/vmess.cpp src/configs/outbounds/wireguard.cpp include/configs/generate.h - src/configs/generate.cpp include/configs/common/utils.h src/configs/common/utils.cpp - include/configs/outbounds/custom.h - include/configs/outbounds/chain.h - include/configs/outbounds/extracore.h - include/ui/profile/edit_socks.h - src/ui/profile/edit_socks.cpp - include/ui/profile/edit_socks.ui - include/ui/profile/edit_http.h - src/ui/profile/edit_http.cpp - include/ui/profile/edit_http.ui - include/ui/profile/edit_trojan.h - src/ui/profile/edit_trojan.cpp - include/ui/profile/edit_trojan.ui - include/ui/profile/edit_hysteria.h - src/ui/profile/edit_hysteria.cpp - include/ui/profile/edit_hysteria.ui - include/ui/profile/edit_tuic.h - src/ui/profile/edit_tuic.cpp - include/ui/profile/edit_tuic.ui - include/ui/profile/edit_advanced.h - src/ui/profile/edit_advanced.cpp - include/ui/profile/edit_advanced.ui ) if (NOT APPLE AND Qt6_VERSION VERSION_GREATER_EQUAL 6.9.0) diff --git a/include/configs/baseConfig.h b/include/configs/baseConfig.h index e84c118..b61834f 100644 --- a/include/configs/baseConfig.h +++ b/include/configs/baseConfig.h @@ -1,7 +1,9 @@ #pragma once -#include -#include "include/global/Configs.hpp" +#include + +#include "generate.h" +#include "include/global/ConfigItem.hpp" namespace Configs { @@ -13,13 +15,9 @@ namespace Configs class baseConfig : public JsonStore { public: - virtual bool ParseFromLink(const QString& link) { - return false; - } + virtual bool ParseFromLink(const QString& link); - virtual bool ParseFromJson(const QJsonObject& object) { - return false; - } + virtual bool ParseFromJson(const QJsonObject& object); virtual QString ExportToLink() { return {}; @@ -29,8 +27,24 @@ namespace Configs return {}; } - virtual BuildResult Build() { - return {{}, "base class function called!"}; - } + virtual BuildResult Build(); + }; + + class outboundMeta + { + public: + virtual ~outboundMeta() = default; + + void ResolveDomainToIP(const std::function &onFinished); + + virtual QString DisplayAddress(); + + virtual QString DisplayName(); + + virtual QString DisplayType() { return {}; }; + + virtual QString DisplayTypeAndName(); + + virtual bool IsEndpoint() { return false; }; }; } diff --git a/include/configs/common/Outbound.h b/include/configs/common/Outbound.h index a6231be..4d45365 100644 --- a/include/configs/common/Outbound.h +++ b/include/configs/common/Outbound.h @@ -1,10 +1,5 @@ #pragma once -#include -#include #include "DialFields.h" -#include "multiplex.h" -#include "TLS.h" -#include "transport.h" #include "include/configs/baseConfig.h" namespace Configs @@ -26,85 +21,6 @@ namespace Configs _add(new configItem("dial_fields", dynamic_cast(dialFields.get()), jsonStore)); } - void ResolveDomainToIP(const std::function &onFinished) { - bool noResolve = false; - auto serverAddr = GetAddress(); - if (IsIpAddress(serverAddr) || serverAddr.isEmpty()) noResolve = true; - if (noResolve) { - onFinished(); - return; - } - QHostInfo::lookupHost(serverAddr, QApplication::instance(), [=, this](const QHostInfo &host) { - auto addrs = host.addresses(); - if (!addrs.isEmpty()) SetAddress(addrs.first().toString()); - onFinished(); - }); - } - - virtual void SetAddress(QString newAddr) { - server = std::move(newAddr); - } - - virtual QString GetAddress() - { - return server; - } - - virtual void SetPort(int newPort) { - server_port = newPort; - } - - virtual QString GetPort() { - return QString::number(server_port); - } - - virtual QString DisplayAddress() - { - return ::DisplayAddress(server, server_port); - } - - virtual QString DisplayName() - { - if (name.isEmpty()) { - return DisplayAddress(); - } - return name; - } - - virtual QString DisplayType() { return {}; }; - - QString DisplayTypeAndName() - { - return QString("[%1] %2").arg(DisplayType(), DisplayName()); - } - - virtual bool HasMux() { return false; } - - virtual bool HasTransport() { return false; } - - virtual bool HasTLS() { return false; } - - virtual bool MustTLS() { return false; } - - virtual std::shared_ptr GetTLS() { return std::make_shared(); } - - virtual std::shared_ptr GetTransport() { return std::make_shared(); } - - virtual std::shared_ptr GetMux() { return std::make_shared(); } - - virtual bool IsEndpoint() { return false; }; - - QString ExportJsonLink() { - auto json = ExportToJson(); - QUrl url; - url.setScheme("json"); - url.setHost("throne"); - url.setFragment(QJsonObject2QString(json, true) - .toUtf8() - .toBase64(QByteArray::Base64UrlEncoding)); - return url.toString(); - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; diff --git a/include/configs/common/multiplex.h b/include/configs/common/multiplex.h index 4473860..f949bc5 100644 --- a/include/configs/common/multiplex.h +++ b/include/configs/common/multiplex.h @@ -51,21 +51,6 @@ namespace Configs _add(new configItem("brutal", dynamic_cast(brutal.get()), jsonStore)); } - int getMuxState() { - if (enabled) return 1; - if (!unspecified) return 2; - return 0; - } - - void saveMuxState(int state) { - if (state == 1) { - enabled = true; - return; - } - enabled = false; - if (state == 0) unspecified = true; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; diff --git a/include/configs/common/transport.h b/include/configs/common/transport.h index a062fdc..3f95e9c 100644 --- a/include/configs/common/transport.h +++ b/include/configs/common/transport.h @@ -37,10 +37,6 @@ namespace Configs _add(new configItem("service_name", &service_name, string)); } - QString getHeadersString(); - - static QStringList getHeaderPairs(QString rawHeader); - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; diff --git a/include/configs/common/utils.h b/include/configs/common/utils.h index dd6607c..b37ec29 100644 --- a/include/configs/common/utils.h +++ b/include/configs/common/utils.h @@ -7,8 +7,4 @@ namespace Configs void mergeUrlQuery(QUrlQuery& baseQuery, const QString& strQuery); void mergeJsonObjects(QJsonObject& baseObject, const QJsonObject& obj); - - QStringList jsonObjectToQStringList(const QJsonObject& obj); - - QJsonObject qStringListToJsonObject(const QStringList& list); } diff --git a/include/configs/generate.h b/include/configs/generate.h index 735910f..8c921c4 100644 --- a/include/configs/generate.h +++ b/include/configs/generate.h @@ -1,165 +1,10 @@ #pragma once -#include #include -#include -#include namespace Configs { - enum OSType - { - Unknown = 0, - Linux = 1, - Windows = 2, - Darwin = 3, - }; - - class ExtraCoreData - { - public: - QString path; - QString args; - QString config; - QString configDir; - bool noLog; - }; - - class DNSDeps - { - public: - bool needDirectDnsRules = false; - QJsonArray directDomains; - QJsonArray directRuleSets; - QJsonArray directSuffixes; - QJsonArray directKeywords; - QJsonArray directRegexes; - }; - - class HijackDeps - { - public: - QJsonArray hijackDomains; - QJsonArray hijackDomainSuffix; - QJsonArray hijackDomainRegex; - QJsonArray hijackGeoAssets; - }; - - class TunDeps - { - public: - QJsonArray directIPSets; - QJsonArray directIPCIDRs; - }; - - class RoutingDeps - { - public: - int defaultOutboundID; - QList neededOutbounds; - QStringList neededRuleSets; - std::map outboundMap; - }; - - class BuildPrerequisities - { - public: - std::shared_ptr extraCoreData = std::make_shared(); - std::shared_ptr dnsDeps = std::make_shared(); - std::shared_ptr hijackDeps = std::make_shared(); - std::shared_ptr tunDeps = std::make_shared(); - std::shared_ptr routingDeps = std::make_shared(); - }; - - class BuildConfigResult { - public: + struct BuildResult { + QJsonObject object; QString error; - QJsonObject coreConfig; - std::shared_ptr extraCoreData; - - QList> outboundStats; }; - - class BuildSingBoxConfigContext - { - public: - bool forTest = false; - bool forExport = false; - bool tunEnabled = false; - bool isResolvedUsed = false; - std::shared_ptr ent = std::make_shared(nullptr, nullptr, nullptr); - std::shared_ptr buildPrerequisities = std::make_shared(); - OSType os; - - QString error; - QStringList warnings; - QJsonArray outbounds; - QJsonArray endpoints; - std::shared_ptr buildConfigResult = std::make_shared(); - }; - - inline QString get_jsdelivr_link(QString link) - { - if(dataStore->routing->ruleset_mirror == Mirrors::GITHUB) - return link; - if(auto url = QUrl(link); url.isValid() && url.host() == "raw.githubusercontent.com") - { - QStringList list = url.path().split('/'); - QString result; - switch(dataStore->routing->ruleset_mirror) { - case Mirrors::GCORE: result = "https://gcore.jsdelivr.net/gh"; break; - case Mirrors::QUANTIL: result = "https://quantil.jsdelivr.net/gh"; break; - case Mirrors::FASTLY: result = "https://fastly.jsdelivr.net/gh"; break; - case Mirrors::CDN: result = "https://cdn.jsdelivr.net/gh"; break; - default: result = "https://testingcf.jsdelivr.net/gh"; - } - - int index = 0; - foreach(QString item, list) - { - if(!item.isEmpty()) - { - if(index == 2) - result += "@" + item; - else - result += "/" + item; - index++; - } - } - return result; - } - return link; - } - - void CalculatePrerequisities(std::shared_ptr &ctx); - - void buildLogSections(std::shared_ptr &ctx); - - void buildDNSSection(std::shared_ptr &ctx, bool useDnsObj = true); - - void buildNTPSection(std::shared_ptr &ctx); - - void buildCertificateSection(std::shared_ptr &ctx); - - void buildInboundSection(std::shared_ptr &ctx); - - void buildOutboundsSection(std::shared_ptr &ctx); - - void buildRouteSection(std::shared_ptr &ctx); - - void buildExperimentalSection(std::shared_ptr &ctx); - - std::shared_ptr BuildSingBoxConfig(const std::shared_ptr &ent); - - class BuildTestConfigResult { - public: - QString error; - QMap fullConfigs; - QMap tag2entID; - QJsonObject coreConfig; - QStringList outboundTags; - }; - - bool IsValid(const std::shared_ptr &ent); - - std::shared_ptr BuildTestConfig(const QList > &profiles); } diff --git a/include/configs/outbounds/anyTLS.h b/include/configs/outbounds/anyTLS.h index 650361d..557cc7f 100644 --- a/include/configs/outbounds/anyTLS.h +++ b/include/configs/outbounds/anyTLS.h @@ -22,18 +22,6 @@ namespace Configs _add(new configItem("tls", dynamic_cast(tls.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool MustTLS() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -41,6 +29,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/http.h b/include/configs/outbounds/http.h index 0f3499f..07a9ce1 100644 --- a/include/configs/outbounds/http.h +++ b/include/configs/outbounds/http.h @@ -23,14 +23,6 @@ namespace Configs _add(new configItem("tls", dynamic_cast(tls.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -38,6 +30,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/hysteria.h b/include/configs/outbounds/hysteria.h index 047bd57..4388ee6 100644 --- a/include/configs/outbounds/hysteria.h +++ b/include/configs/outbounds/hysteria.h @@ -48,18 +48,6 @@ namespace Configs _add(new configItem("tls", dynamic_cast(tls.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool MustTLS() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -67,6 +55,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/shadowsocks.h b/include/configs/outbounds/shadowsocks.h index a133db6..9d1fbab 100644 --- a/include/configs/outbounds/shadowsocks.h +++ b/include/configs/outbounds/shadowsocks.h @@ -27,14 +27,6 @@ namespace Configs _add(new configItem("multiplex", dynamic_cast(multiplex.get()), jsonStore)); } - bool HasMux() override { - return true; - } - - std::shared_ptr GetMux() override { - return multiplex; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -42,6 +34,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/socks.h b/include/configs/outbounds/socks.h index 7c52bbd..7d1c48f 100644 --- a/include/configs/outbounds/socks.h +++ b/include/configs/outbounds/socks.h @@ -27,6 +27,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/ssh.h b/include/configs/outbounds/ssh.h index 230cea8..959cc40 100644 --- a/include/configs/outbounds/ssh.h +++ b/include/configs/outbounds/ssh.h @@ -34,6 +34,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/tailscale.h b/include/configs/outbounds/tailscale.h index 6b709fb..1c99d07 100644 --- a/include/configs/outbounds/tailscale.h +++ b/include/configs/outbounds/tailscale.h @@ -1,11 +1,14 @@ #pragma once +#include "include/configs/baseConfig.h" #include "include/configs/common/Outbound.h" namespace Configs { - class tailscale : public outbound + class tailscale : public baseConfig, public outboundMeta { public: + std::shared_ptr commons = std::make_shared(); + QString state_directory = "$HOME/.tailscale"; QString auth_key; QString control_url = "https://controlplane.tailscale.com"; @@ -18,8 +21,9 @@ namespace Configs bool advertise_exit_node = false; bool globalDNS = false; - tailscale() : outbound() + tailscale() { + _add(new configItem("commons", dynamic_cast(commons.get()), jsonStore)); _add(new configItem("state_directory", &state_directory, itemType::string)); _add(new configItem("auth_key", &auth_key, itemType::string)); _add(new configItem("control_url", &control_url, itemType::string)); @@ -40,10 +44,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; - void SetAddress(QString newAddr) override; - QString GetAddress() override; + // outboundMeta overrides QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/trojan.h b/include/configs/outbounds/trojan.h index ad528be..2d0895c 100644 --- a/include/configs/outbounds/trojan.h +++ b/include/configs/outbounds/trojan.h @@ -22,30 +22,6 @@ namespace Configs _add(new configItem("transport", dynamic_cast(transport.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool HasMux() override { - return true; - } - - bool HasTransport() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - - std::shared_ptr GetMux() override { - return multiplex; - } - - std::shared_ptr GetTransport() override { - return transport; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -53,6 +29,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/tuic.h b/include/configs/outbounds/tuic.h index 69ffa5e..d33252f 100644 --- a/include/configs/outbounds/tuic.h +++ b/include/configs/outbounds/tuic.h @@ -32,18 +32,6 @@ namespace Configs _add(new configItem("tls", dynamic_cast(tls.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool MustTLS() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -51,6 +39,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/vless.h b/include/configs/outbounds/vless.h index ebe7d0f..6fb29aa 100644 --- a/include/configs/outbounds/vless.h +++ b/include/configs/outbounds/vless.h @@ -28,30 +28,6 @@ namespace Configs _add(new configItem("transport", dynamic_cast(transport.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool HasMux() override { - return true; - } - - bool HasTransport() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - - std::shared_ptr GetMux() override { - return multiplex; - } - - std::shared_ptr GetTransport() override { - return transport; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -59,6 +35,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/vmess.h b/include/configs/outbounds/vmess.h index 112e98e..10715e6 100644 --- a/include/configs/outbounds/vmess.h +++ b/include/configs/outbounds/vmess.h @@ -36,30 +36,6 @@ namespace Configs _add(new configItem("multiplex", dynamic_cast(multiplex.get()), jsonStore)); } - bool HasTLS() override { - return true; - } - - bool HasMux() override { - return true; - } - - bool HasTransport() override { - return true; - } - - std::shared_ptr GetTLS() override { - return tls; - } - - std::shared_ptr GetMux() override { - return multiplex; - } - - std::shared_ptr GetTransport() override { - return transport; - } - // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; @@ -67,6 +43,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; + // outboundMeta overrides + QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; + bool IsEndpoint() override; }; } diff --git a/include/configs/outbounds/wireguard.h b/include/configs/outbounds/wireguard.h index 5bcb8d3..e843c05 100644 --- a/include/configs/outbounds/wireguard.h +++ b/include/configs/outbounds/wireguard.h @@ -1,4 +1,5 @@ #pragma once +#include "include/configs/baseConfig.h" #include "include/configs/common/Outbound.h" namespace Configs @@ -31,9 +32,10 @@ namespace Configs BuildResult Build() override; }; - class wireguard : public outbound + class wireguard : public baseConfig, public outboundMeta { public: + std::shared_ptr commons = std::make_shared(); QString private_key; std::shared_ptr peer = std::make_shared(); QStringList address; @@ -54,8 +56,10 @@ namespace Configs int underload_packet_magic_header = 0; int transport_packet_magic_header = 0; - wireguard() : outbound() + wireguard() { + _add(new configItem("commons", dynamic_cast(commons.get()), jsonStore)); + _add(new configItem("private_key", &private_key, itemType::string)); _add(new configItem("peer", dynamic_cast(peer.get()), jsonStore)); _add(new configItem("address", &address, itemType::stringList)); @@ -83,12 +87,11 @@ namespace Configs QJsonObject ExportToJson() override; BuildResult Build() override; - void SetPort(int newPort) override; - QString GetPort(); - void SetAddress(QString newAddr) override; - QString GetAddress() override; + // outboundMeta overrides QString DisplayAddress() override; + QString DisplayName() override; QString DisplayType() override; + QString DisplayTypeAndName() override; bool IsEndpoint() override; }; } diff --git a/src/configs/common/DialFields.cpp b/src/configs/common/DialFields.cpp index 729e7a7..7fadff8 100644 --- a/src/configs/common/DialFields.cpp +++ b/src/configs/common/DialFields.cpp @@ -18,7 +18,7 @@ namespace Configs { } bool DialFields::ParseFromJson(const QJsonObject& object) { - if (object.isEmpty()) return false; + if (object == nullptr) return false; if (object.contains("reuse_addr")) reuse_addr = object["reuse_addr"].toBool(); if (object.contains("connect_timeout")) connect_timeout = object["connect_timeout"].toString(); diff --git a/src/configs/common/Outbound.cpp b/src/configs/common/Outbound.cpp index bda3484..ede4927 100644 --- a/src/configs/common/Outbound.cpp +++ b/src/configs/common/Outbound.cpp @@ -1,51 +1,11 @@ #include "include/configs/common/Outbound.h" -#include "include/configs/common/utils.h" namespace Configs { - bool outbound::ParseFromLink(const QString& link) - { - auto url = QUrl(link); - if (!url.isValid()) return false; - - if (url.hasFragment()) name = url.fragment(QUrl::FullyDecoded); - server = url.host(); - server_port = url.port(); - dialFields->ParseFromLink(link); - return true; - } - bool outbound::ParseFromJson(const QJsonObject& object) - { - if (object.isEmpty()) return false; - if (object.contains("tag")) name = object["tag"].toString(); - if (object.contains("server")) server = object["server"].toString(); - if (object.contains("server_port")) server_port = object["server_port"].toInt(); - dialFields->ParseFromJson(object); - return true; - } - QString outbound::ExportToLink() - { - QUrlQuery query; - mergeUrlQuery(query, dialFields->ExportToLink()); - return query.toString(); - } - QJsonObject outbound::ExportToJson() - { - QJsonObject object; - if (!name.isEmpty()) object["tag"] = name; - if (!server.isEmpty()) object["server"] = server; - if (server_port > 0) object["server_port"] = server_port; - auto dialFieldsObj = dialFields->ExportToJson(); - mergeJsonObjects(object, dialFieldsObj); - return object; - } - BuildResult outbound::Build() - { - QJsonObject object; - if (!server.isEmpty()) object["server"] = server; - if (server_port > 0) object["server_port"] = server_port; - mergeJsonObjects(object, dialFields->Build().object); - return {object, ""}; - } + bool OutboundCommons::ParseFromLink(const QString& link) { return false; } + bool OutboundCommons::ParseFromJson(const QJsonObject& object) { return false; } + QString OutboundCommons::ExportToLink() { return {}; } + QJsonObject OutboundCommons::ExportToJson() { return {}; } + BuildResult OutboundCommons::Build() { return {}; } } diff --git a/src/configs/common/TLS.cpp b/src/configs/common/TLS.cpp index e66b9df..547f1de 100644 --- a/src/configs/common/TLS.cpp +++ b/src/configs/common/TLS.cpp @@ -1,312 +1,29 @@ #include "include/configs/common/TLS.h" -#include -#include - -#include "include/configs/common/utils.h" - namespace Configs { - bool uTLS::ParseFromLink(const QString& link) - { - auto url = QUrl(link); - if (!url.isValid()) return false; - auto query = QUrlQuery(url.query(QUrl::ComponentFormattingOption::FullyDecoded)); + bool uTLS::ParseFromLink(const QString& link) { return false; } + bool uTLS::ParseFromJson(const QJsonObject& object) { return false; } + QString uTLS::ExportToLink() { return {}; } + QJsonObject uTLS::ExportToJson() { return {}; } + BuildResult uTLS::Build() { return {}; } - // handle the common format - if (query.hasQueryItem("fp")) fingerPrint = query.queryItemValue("fp"); - if (!fingerPrint.isEmpty()) enabled = true; - return true; - } - bool uTLS::ParseFromJson(const QJsonObject& object) - { - if (object.isEmpty()) return false; - if (object.contains("enabled")) enabled = object["enabled"].toBool(); - if (object.contains("fingerprint")) fingerPrint = object["fingerprint"].toString(); - return true; - } - QString uTLS::ExportToLink() - { - QUrlQuery query; - if (!enabled) return ""; - if (!fingerPrint.isEmpty()) query.addQueryItem("fp", fingerPrint); - return query.toString(); - } - QJsonObject uTLS::ExportToJson() - { - QJsonObject object; - if (!enabled) return object; - object["enabled"] = enabled; - if (!fingerPrint.isEmpty()) object["fingerprint"] = fingerPrint; - return object; - } - BuildResult uTLS::Build() - { - auto obj = ExportToJson(); - if ((obj.isEmpty() || obj["enabled"].toBool() == false) && !dataStore->utlsFingerprint.isEmpty()) { - obj["enabled"] = true; - obj["fingerprint"] = dataStore->utlsFingerprint; - } - return {ExportToJson(), ""}; - } + bool ECH::ParseFromLink(const QString& link) { return false; } + bool ECH::ParseFromJson(const QJsonObject& object) { return false; } + QString ECH::ExportToLink() { return {}; } + QJsonObject ECH::ExportToJson() { return {}; } + BuildResult ECH::Build() { return {}; } - bool ECH::ParseFromLink(const QString& link) - { - auto url = QUrl(link); - if (!url.isValid()) return false; - auto query = QUrlQuery(url.query(QUrl::ComponentFormattingOption::FullyDecoded)); + bool Reality::ParseFromLink(const QString& link) { return false; } + bool Reality::ParseFromJson(const QJsonObject& object) { return false; } + QString Reality::ExportToLink() { return {}; } + QJsonObject Reality::ExportToJson() { return {}; } + BuildResult Reality::Build() { return {}; } - if (query.hasQueryItem("ech_enabled")) enabled = query.queryItemValue("ech_enabled") == "true"; - if (query.hasQueryItem("ech_config")) config = query.queryItemValue("ech_config").split(","); - if (query.hasQueryItem("ech_config_path")) config_path = query.queryItemValue("ech_config_path"); - return true; - } - bool ECH::ParseFromJson(const QJsonObject& object) - { - if (object.isEmpty()) return false; - if (object.contains("enabled")) enabled = object["enabled"].toBool(); - if (object.contains("config")) { - config = QJsonArray2QListString(object["config"].toArray()); - } - if (object.contains("config_path")) config_path = object["config_path"].toString(); - return true; - } - QString ECH::ExportToLink() - { - QUrlQuery query; - if (!enabled) return ""; - query.addQueryItem("ech_enabled", "true"); - if (!config.isEmpty()) query.addQueryItem("ech_config", config.join(",")); - if (!config_path.isEmpty()) query.addQueryItem("ech_config_path", config_path); - return query.toString(); - } - QJsonObject ECH::ExportToJson() - { - QJsonObject object; - if (!enabled) return object; - object["enabled"] = enabled; - if (!config.isEmpty()) { - object["config"] = QListStr2QJsonArray(config); - } - if (!config_path.isEmpty()) object["config_path"] = config_path; - return object; - } - BuildResult ECH::Build() - { - return {ExportToJson(), ""}; - } - - bool Reality::ParseFromLink(const QString& link) - { - auto url = QUrl(link); - if (!url.isValid()) return false; - auto query = QUrlQuery(url.query(QUrl::ComponentFormattingOption::FullyDecoded)); - - // handle the common format - if (query.hasQueryItem("pbk")) - { - enabled = true; - public_key = query.queryItemValue("pbk"); - short_id = query.queryItemValue("sid"); - } - return true; - } - bool Reality::ParseFromJson(const QJsonObject& object) - { - if (object.isEmpty()) return false; - if (object.contains("enabled")) enabled = object["enabled"].toBool(); - if (object.contains("public_key")) public_key = object["public_key"].toString(); - if (object.contains("short_id")) short_id = object["short_id"].toString(); - return true; - } - QString Reality::ExportToLink() - { - QUrlQuery query; - if (!enabled) return ""; - query.addQueryItem("pbk", public_key); - query.addQueryItem("sid", short_id); - return query.toString(); - } - QJsonObject Reality::ExportToJson() - { - QJsonObject object; - if (!enabled) return object; - object["enabled"] = enabled; - if (!public_key.isEmpty()) object["public_key"] = public_key; - if (!short_id.isEmpty()) object["short_id"] = short_id; - return object; - } - BuildResult Reality::Build() - { - QJsonObject object; - if (!public_key.isEmpty() || enabled) { - object["enabled"] = true; - object["public_key"] = public_key; - if (!short_id.isEmpty()) object["short_id"] = short_id; - } - return {object, ""}; - } - - bool TLS::ParseFromLink(const QString& link) - { - auto url = QUrl(link); - if (!url.isValid()) return false; - auto query = QUrlQuery(url.query(QUrl::ComponentFormattingOption::FullyDecoded)); - - if (query.hasQueryItem("security")) enabled = query.queryItemValue("security") - .replace("reality", "tls") - .replace("none", "") - .replace("0", "") - .replace("false", "tls") - .replace("1", "tls") - .replace("true", "tls") == "tls"; - if (query.hasQueryItem("disable_sni")) disable_sni = query.queryItemValue("disable_sni").replace("1", "true") == "true"; - if (query.hasQueryItem("sni")) server_name = query.queryItemValue("sni"); - if (query.hasQueryItem("peer")) server_name = query.queryItemValue("peer"); - if (query.hasQueryItem("allowInsecure")) insecure = query.queryItemValue("allowInsecure").replace("1", "true") == "true"; - if (query.hasQueryItem("allow_insecure")) insecure = query.queryItemValue("allow_insecure").replace("1", "true") == "true"; - if (query.hasQueryItem("insecure")) insecure = query.queryItemValue("insecure").replace("1", "true") == "true"; - if (query.hasQueryItem("alpn")) alpn = query.queryItemValue("alpn").split(","); - if (query.hasQueryItem("tls_min_version")) min_version = query.queryItemValue("tls_min_version"); - if (query.hasQueryItem("tls_max_version")) max_version = query.queryItemValue("tls_max_version"); - if (query.hasQueryItem("tls_cipher_suites")) cipher_suites = query.queryItemValue("tls_cipher_suites").split(","); - if (query.hasQueryItem("tls_curve_preferences")) curve_preferences = query.queryItemValue("tls_curve_preferences").split(","); - if (query.hasQueryItem("tls_certificate")) certificate = query.queryItemValue("tls_certificate").split(","); - if (query.hasQueryItem("tls_certificate_path")) certificate_path = query.queryItemValue("tls_certificate_path"); - if (query.hasQueryItem("tls_certificate_public_key_sha256")) certificate_public_key_sha256 = query.queryItemValue("tls_certificate_public_key_sha256").split(","); - if (query.hasQueryItem("tls_client_certificate")) client_certificate = query.queryItemValue("tls_client_certificate").split(","); - if (query.hasQueryItem("tls_client_certificate_path")) client_certificate_path = query.queryItemValue("tls_client_certificate_path"); - if (query.hasQueryItem("tls_client_key")) client_key = query.queryItemValue("tls_client_key").split(","); - if (query.hasQueryItem("tls_client_key_path")) client_key_path = query.queryItemValue("tls_client_key_path"); - if (query.hasQueryItem("tls_fragment")) fragment = query.queryItemValue("tls_fragment") == "true"; - if (query.hasQueryItem("tls_fragment_fallback_delay")) fragment_fallback_delay = query.queryItemValue("tls_fragment_fallback_delay"); - if (query.hasQueryItem("tls_record_fragment")) record_fragment = query.queryItemValue("tls_record_fragment") == "true"; - if (!server_name.isEmpty()) enabled = true; - ech->ParseFromLink(link); - utls->ParseFromLink(link); - reality->ParseFromLink(link); - return true; - } - bool TLS::ParseFromJson(const QJsonObject& object) - { - if (object.isEmpty()) return false; - if (object.contains("enabled")) enabled = object["enabled"].toBool(); - if (object.contains("disable_sni")) disable_sni = object["disable_sni"].toBool(); - if (object.contains("server_name")) server_name = object["server_name"].toString(); - if (object.contains("insecure")) insecure = object["insecure"].toBool(); - if (object.contains("alpn")) { - alpn = QJsonArray2QListString(object["alpn"].toArray()); - } - if (object.contains("min_version")) min_version = object["min_version"].toString(); - if (object.contains("max_version")) max_version = object["max_version"].toString(); - if (object.contains("cipher_suites")) { - cipher_suites = QJsonArray2QListString(object["cipher_suites"].toArray()); - } - if (object.contains("curve_preferences")) { - curve_preferences = QJsonArray2QListString(object["curve_preferences"].toArray()); - } - if (object.contains("certificate")) { - if (object["certificate"].isString()) { - certificate = object["certificate"].toString().split("\n", Qt::SkipEmptyParts); - } else { - certificate = QJsonArray2QListString(object["certificate"].toArray()); - } - } - if (object.contains("certificate_path")) certificate_path = object["certificate_path"].toString(); - if (object.contains("certificate_public_key_sha256")) { - certificate_public_key_sha256 = QJsonArray2QListString(object["certificate_public_key_sha256"].toArray()); - } - if (object.contains("client_certificate")) { - client_certificate = QJsonArray2QListString(object["client_certificate"].toArray()); - } - if (object.contains("client_certificate_path")) client_certificate_path = object["client_certificate_path"].toString(); - if (object.contains("client_key")) { - client_key = QJsonArray2QListString(object["client_key"].toArray()); - } - if (object.contains("client_key_path")) client_key_path = object["client_key_path"].toString(); - if (object.contains("fragment")) fragment = object["fragment"].toBool(); - if (object.contains("fragment_fallback_delay")) fragment_fallback_delay = object["fragment_fallback_delay"].toString(); - if (object.contains("record_fragment")) record_fragment = object["record_fragment"].toBool(); - if (object.contains("ech")) ech->ParseFromJson(object["ech"].toObject()); - if (object.contains("utls")) utls->ParseFromJson(object["utls"].toObject()); - if (object.contains("reality")) reality->ParseFromJson(object["reality"].toObject()); - return true; - } - QString TLS::ExportToLink() - { - QUrlQuery query; - if (!enabled) return ""; - query.addQueryItem("security", "tls"); - if (disable_sni) query.addQueryItem("disable_sni", "true"); - if (!server_name.isEmpty()) query.addQueryItem("sni", server_name); - if (insecure) query.addQueryItem("allowInsecure", "true"); - if (!alpn.isEmpty()) query.addQueryItem("alpn", alpn.join(",")); - if (!min_version.isEmpty()) query.addQueryItem("tls_min_version", min_version); - if (!max_version.isEmpty()) query.addQueryItem("tls_max_version", max_version); - if (!cipher_suites.isEmpty()) query.addQueryItem("tls_cipher_suites", cipher_suites.join(",")); - if (!curve_preferences.isEmpty()) query.addQueryItem("tls_curve_preferences", curve_preferences.join(",")); - if (!certificate.isEmpty()) query.addQueryItem("tls_certificate", certificate.join(",")); - if (!certificate_path.isEmpty()) query.addQueryItem("tls_certificate_path", certificate_path); - if (!certificate_public_key_sha256.isEmpty()) query.addQueryItem("tls_certificate_public_key_sha256", certificate_public_key_sha256.join(",")); - if (!client_certificate.isEmpty()) query.addQueryItem("tls_client_certificate", client_certificate.join(",")); - if (!client_certificate_path.isEmpty()) query.addQueryItem("tls_client_certificate_path", client_certificate_path); - if (!client_key.isEmpty()) query.addQueryItem("tls_client_key", client_key.join(",")); - if (!client_key_path.isEmpty()) query.addQueryItem("tls_client_key_path", client_key_path); - if (fragment) query.addQueryItem("tls_fragment", "true"); - if (!fragment_fallback_delay.isEmpty()) query.addQueryItem("tls_fragment_fallback_delay", fragment_fallback_delay); - if (record_fragment) query.addQueryItem("tls_record_fragment", "true"); - mergeUrlQuery(query, ech->ExportToLink()); - mergeUrlQuery(query, utls->ExportToLink()); - mergeUrlQuery(query, reality->ExportToLink()); - return query.toString(); - } - QJsonObject TLS::ExportToJson() - { - QJsonObject object; - if (!enabled) return object; - object["enabled"] = enabled; - if (disable_sni) object["disable_sni"] = disable_sni; - if (!server_name.isEmpty()) object["server_name"] = server_name; - if (insecure) object["insecure"] = insecure; - if (!alpn.isEmpty()) { - object["alpn"] = QListStr2QJsonArray(alpn); - } - if (!min_version.isEmpty()) object["min_version"] = min_version; - if (!max_version.isEmpty()) object["max_version"] = max_version; - if (!cipher_suites.isEmpty()) { - object["cipher_suites"] = QListStr2QJsonArray(cipher_suites); - } - if (!curve_preferences.isEmpty()) { - object["curve_preferences"] = QListStr2QJsonArray(curve_preferences); - } - if (!certificate.isEmpty()) { - object["certificate"] = QListStr2QJsonArray(certificate); - } - if (!certificate_path.isEmpty()) object["certificate_path"] = certificate_path; - if (!certificate_public_key_sha256.isEmpty()) { - object["certificate_public_key_sha256"] = QListStr2QJsonArray(certificate_public_key_sha256); - } - if (!client_certificate.isEmpty()) object["client_certificate"] = QListStr2QJsonArray(client_certificate); - if (!client_certificate_path.isEmpty()) object["client_certificate_path"] = client_certificate_path; - if (!client_key.isEmpty()) { - object["client_key"] = QListStr2QJsonArray(client_key); - } - if (!client_key_path.isEmpty()) object["client_key_path"] = client_key_path; - if (fragment) object["fragment"] = fragment; - if (!fragment_fallback_delay.isEmpty()) object["fragment_fallback_delay"] = fragment_fallback_delay; - if (record_fragment) object["record_fragment"] = record_fragment; - if (ech->enabled) object["ech"] = ech->ExportToJson(); - if (utls->enabled) object["utls"] = utls->ExportToJson(); - if (reality->enabled) object["reality"] = reality->ExportToJson(); - return object; - } - BuildResult TLS::Build() - { - auto obj = ExportToJson(); - if (!obj.isEmpty() && obj["enabled"].toBool()) { - if (dataStore->skip_cert) obj["insecure"] = true; - } - return {ExportToJson(), ""}; - } + bool TLS::ParseFromLink(const QString& link) { return false; } + bool TLS::ParseFromJson(const QJsonObject& object) { return false; } + QString TLS::ExportToLink() { return {}; } + QJsonObject TLS::ExportToJson() { return {}; } + BuildResult TLS::Build() { return {}; } } diff --git a/src/configs/common/multiplex.cpp b/src/configs/common/multiplex.cpp index cf4028b..cc2edc6 100644 --- a/src/configs/common/multiplex.cpp +++ b/src/configs/common/multiplex.cpp @@ -1,4 +1,7 @@ #include "include/configs/common/multiplex.h" + +#include + #include "include/configs/common/utils.h" namespace Configs { @@ -15,7 +18,7 @@ namespace Configs { } bool TcpBrutal::ParseFromJson(const QJsonObject& object) { - if (object.isEmpty()) return false; + if (object == nullptr) return false; if (object.contains("enabled")) enabled = object["enabled"].toBool(); if (object.contains("up_mbps")) up_mbps = object["up_mbps"].toInt(); if (object.contains("down_mbps")) down_mbps = object["down_mbps"].toInt(); @@ -51,8 +54,7 @@ namespace Configs { auto query = QUrlQuery(url.query(QUrl::ComponentFormattingOption::FullyDecoded)); if (query.hasQueryItem("mux")) enabled = query.queryItemValue("mux") == "true"; - else unspecified = true; - if (query.hasQueryItem("mux_protocol")) protocol = query.queryItemValue("mux_protocol"); + protocol = query.hasQueryItem("mux_protocol") ? query.queryItemValue("mux_protocol") : "smux"; if (query.hasQueryItem("mux_max_connections")) max_connections = query.queryItemValue("mux_max_connections").toInt(); if (query.hasQueryItem("mux_min_streams")) min_streams = query.queryItemValue("mux_min_streams").toInt(); if (query.hasQueryItem("mux_max_streams")) max_streams = query.queryItemValue("mux_max_streams").toInt(); @@ -62,13 +64,8 @@ namespace Configs { } bool Multiplex::ParseFromJson(const QJsonObject& object) { - if (object.isEmpty()) - { - unspecified = true; - return false; - } + if (object == nullptr) return false; if (object.contains("enabled")) enabled = object["enabled"].toBool(); - else unspecified = true; if (object.contains("protocol")) protocol = object["protocol"].toString(); if (object.contains("max_connections")) max_connections = object["max_connections"].toInt(); if (object.contains("min_streams")) min_streams = object["min_streams"].toInt(); @@ -105,13 +102,7 @@ namespace Configs { } BuildResult Multiplex::Build() { - auto obj = ExportToJson(); - if (unspecified && dataStore->mux_default_on) obj["enabled"] = true; - if (!obj["enabled"].toBool()) return {{}, ""}; - if (protocol.isEmpty()) obj["protocol"] = dataStore->mux_protocol; - if (max_streams == 0 && max_connections == 0 && min_streams == 0) obj["max_streams"] = dataStore->mux_concurrency; - if (dataStore->mux_padding) obj["padding"] = true; - return {obj, ""}; + return {ExportToJson(), ""}; } } diff --git a/src/configs/common/transport.cpp b/src/configs/common/transport.cpp index d1797af..c2f5aff 100644 --- a/src/configs/common/transport.cpp +++ b/src/configs/common/transport.cpp @@ -1,150 +1,11 @@ #include "include/configs/common/transport.h" -#include -#include -#include - -#include "include/configs/common/utils.h" - namespace Configs { - - QString Transport::getHeadersString() { - QString result; - for (int i=0;i