diff --git a/include/configs/proxy/WireguardBean.h b/include/configs/proxy/WireguardBean.h index a180ddb..ef52846 100644 --- a/include/configs/proxy/WireguardBean.h +++ b/include/configs/proxy/WireguardBean.h @@ -72,5 +72,98 @@ namespace Configs { QString ToShareLink() override; bool IsEndpoint() override {return true;} + + private: + bool parseWgConfig(const QString &config) + { + if (!config.contains("[Interface]") || !config.contains("[Peer]")) return false; + auto lines = config.split("\n"); + for (const auto& line : lines) + { + if (line.trimmed().isEmpty()) continue; + if (line.contains("[Interface]") || line.contains("[Peer]")) continue; + if (!line.contains("=")) return false; + auto eqIdx = line.indexOf("="); + if (line.startsWith("PrivateKey")) + { + privateKey = line.mid(eqIdx + 1).trimmed(); + } + if (line.startsWith("Address")) + { + auto addresses = line.mid(eqIdx + 1).trimmed().split(","); + for (const auto& address : addresses) localAddress.append(address.trimmed()); + } + if (line.startsWith("MTU")) + { + MTU = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("PublicKey")) + { + publicKey = line.mid(eqIdx + 1).trimmed(); + } + if (line.startsWith("PresharedKey")) + { + preSharedKey = line.mid(eqIdx + 1).trimmed(); + } + if (line.startsWith("PersistentKeepalive")) + { + persistentKeepalive = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("Endpoint")) + { + auto addrPort = line.mid(eqIdx + 1).trimmed(); + if (!addrPort.contains(":")) return false; + serverAddress = addrPort.split(":")[0].trimmed(); + serverPort = addrPort.split(":")[1].trimmed().toInt(); + } + if (line.startsWith("S1")) + { + enable_amnezia = true; + init_packet_junk_size = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("S2")) + { + enable_amnezia = true; + response_packet_junk_size = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("Jc")) + { + enable_amnezia = true; + junk_packet_count = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("Jmin")) + { + enable_amnezia = true; + junk_packet_min_size = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("Jmax")) + { + enable_amnezia = true; + junk_packet_max_size = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("H1")) + { + enable_amnezia = true; + init_packet_magic_header = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("H2")) + { + enable_amnezia = true; + response_packet_magic_header = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("H3")) + { + enable_amnezia = true; + underload_packet_magic_header = line.mid(eqIdx + 1).toInt(); + } + if (line.startsWith("H4")) + { + enable_amnezia = true; + transport_packet_magic_header = line.mid(eqIdx + 1).toInt(); + } + } + name = "Wg file config"; + return true; + }; }; } // namespace Configs diff --git a/include/configs/sub/GroupUpdater.hpp b/include/configs/sub/GroupUpdater.hpp index cf0fbb2..c673d00 100644 --- a/include/configs/sub/GroupUpdater.hpp +++ b/include/configs/sub/GroupUpdater.hpp @@ -11,6 +11,8 @@ namespace Subscription { void updateSingBox(const QString &str); + void updateWireguardFileConfig(const QString &str); + int gid_add_to = -1; QList> updated_order; diff --git a/src/configs/proxy/Link2Bean.cpp b/src/configs/proxy/Link2Bean.cpp index c9962c1..a922485 100644 --- a/src/configs/proxy/Link2Bean.cpp +++ b/src/configs/proxy/Link2Bean.cpp @@ -396,6 +396,8 @@ namespace Configs { } bool WireguardBean::TryParseLink(const QString &link) { + if (parseWgConfig(link)) return true; + auto url = QUrl(link); if (!url.isValid()) return false; auto query = GetQuery(url); diff --git a/src/configs/sub/GroupUpdater.cpp b/src/configs/sub/GroupUpdater.cpp index b64f711..e3a91c8 100644 --- a/src/configs/sub/GroupUpdater.cpp +++ b/src/configs/sub/GroupUpdater.cpp @@ -84,6 +84,13 @@ namespace Subscription { return; } + // Wireguard Config + if (str.contains("[Interface]") && str.contains("[Peer]")) + { + updateWireguardFileConfig(str); + return; + } + // Multi line if (str.count("\n") > 0 && needParse) { auto list = Disect(str); @@ -345,6 +352,15 @@ namespace Subscription { } } + void RawUpdater::updateWireguardFileConfig(const QString& str) + { + auto ent = Configs::ProfileManager::NewProxyEntity("wireguard"); + auto ok = ent->WireguardBean()->TryParseLink(str); + if (!ok) return; + updated_order += ent; + } + + QString Node2QString(const fkyaml::node &n, const QString &def = "") { try { return n.as_str().c_str();