From 9d666595e0244916f6363b45cbec9792383b62fc Mon Sep 17 00:00:00 2001 From: parhelia512 <0011d3@gmail.com> Date: Wed, 3 Dec 2025 14:22:56 +0800 Subject: [PATCH] feat: support SIP008 format subscription --- include/configs/outbounds/shadowsocks.h | 1 + include/configs/sub/GroupUpdater.hpp | 2 ++ src/configs/outbounds/shadowsocks.cpp | 18 +++++++++++++++++ src/configs/sub/GroupUpdater.cpp | 27 +++++++++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/include/configs/outbounds/shadowsocks.h b/include/configs/outbounds/shadowsocks.h index a133db6..059a2c6 100644 --- a/include/configs/outbounds/shadowsocks.h +++ b/include/configs/outbounds/shadowsocks.h @@ -38,6 +38,7 @@ namespace Configs // baseConfig overrides bool ParseFromLink(const QString& link) override; bool ParseFromJson(const QJsonObject& object) override; + bool ParseFromSIP008(const QJsonObject& object); QString ExportToLink() override; QJsonObject ExportToJson() override; BuildResult Build() override; diff --git a/include/configs/sub/GroupUpdater.hpp b/include/configs/sub/GroupUpdater.hpp index 08a5291..fb31c9c 100644 --- a/include/configs/sub/GroupUpdater.hpp +++ b/include/configs/sub/GroupUpdater.hpp @@ -11,6 +11,8 @@ namespace Subscription { void updateWireguardFileConfig(const QString &str); + void updateSIP008(const QString &str); + int gid_add_to = -1; QList> updated_order; diff --git a/src/configs/outbounds/shadowsocks.cpp b/src/configs/outbounds/shadowsocks.cpp index dc09426..175c05c 100644 --- a/src/configs/outbounds/shadowsocks.cpp +++ b/src/configs/outbounds/shadowsocks.cpp @@ -62,6 +62,24 @@ namespace Configs { return true; } + bool shadowsocks::ParseFromSIP008(const QJsonObject& object) + { + if (object.isEmpty()) return false; + outbound::ParseFromJson(object); + if (object.contains("remarks")) name = object["remarks"].toString(); + if (object.contains("method")) method = object["method"].toString(); + if (object.contains("password")) password = object["password"].toString(); + if (object.contains("plugin")) plugin = object["plugin"].toString().replace("simple-obfs", "obfs-local"); + if (object.contains("plugin_opts")) plugin_opts = object["plugin_opts"].toString(); + if (object.contains("uot")) + { + if (object["uot"].isBool()) uot = object["uot"].toBool(); + if (object["uot"].isObject()) uot = object["uot"].toObject()["enabled"].toBool(); + } + if (object.contains("multiplex")) multiplex->ParseFromJson(object["multiplex"].toObject()); + return !(server.isEmpty() || method.isEmpty() || password.isEmpty()); + } + QString shadowsocks::ExportToLink() { QUrl url; diff --git a/src/configs/sub/GroupUpdater.cpp b/src/configs/sub/GroupUpdater.cpp index 6a278dc..cd30530 100644 --- a/src/configs/sub/GroupUpdater.cpp +++ b/src/configs/sub/GroupUpdater.cpp @@ -80,6 +80,13 @@ namespace Subscription { return; } + // SIP008 + if (str.contains("version") && str.contains("servers")) + { + updateSIP008(str); + return; + } + // Multi line if (str.count("\n") > 0 && needParse) { auto list = Disect(str); @@ -327,6 +334,26 @@ namespace Subscription { updated_order += ent; } + void RawUpdater::updateSIP008(const QString& str) + { + auto json = QString2QJsonObject(str); + + for (auto o : json["servers"].toArray()) + { + auto out = o.toObject(); + if (out.isEmpty()) + { + MW_show_log("invalid server object"); + continue; + } + + auto ent = Configs::ProfileManager::NewProxyEntity("shadowsocks"); + auto ok = ent->ShadowSocks()->ParseFromSIP008(out); + if (!ok) continue; + updated_order += ent; + } + } + // 在新的 thread 运行 void GroupUpdater::AsyncUpdate(const QString &str, int _sub_gid, const std::function &finish) { auto content = str.trimmed();