From 185e3893bf8d9a49b6335366f1c13e04348bbdca Mon Sep 17 00:00:00 2001 From: asdlokj1qpi23 Date: Mon, 29 Jan 2024 19:20:59 +0800 Subject: [PATCH] To add custom certificate configuration for HY2 protocol.(#7) --- src/generator/config/subexport.cpp | 10 +++- src/parser/subparser.cpp | 11 +++- src/parser/subparser.h | 91 ++++++++++++++++++++++++++---- src/version.h | 2 +- 4 files changed, 97 insertions(+), 17 deletions(-) diff --git a/src/generator/config/subexport.cpp b/src/generator/config/subexport.cpp index f2a2cbb..e58fa8d 100644 --- a/src/generator/config/subexport.cpp +++ b/src/generator/config/subexport.cpp @@ -466,8 +466,12 @@ proxyToClash(std::vector &nodes, YAML::Node &yamlnode, const ProxyGroupCo singleproxy["type"] = "hysteria2"; singleproxy["password"] = x.Password; singleproxy["auth"] = x.Password; - if (!x.ServerName.empty()) + if (!x.PublicKey.empty()) { + singleproxy["ca-str"] = x.PublicKey; + } + if (!x.ServerName.empty()) { singleproxy["sni"] = x.ServerName; + } if (!x.UpMbps.empty()) singleproxy["up"] = x.UpMbps; if (!x.DownMbps.empty()) @@ -2368,6 +2372,7 @@ proxyToSingBox(std::vector &nodes, rapidjson::Document &json, std::vector addSingBoxCommonMembers(proxy, x, "hysteria2", allocator); proxy.AddMember("password", rapidjson::StringRef(x.Password.c_str()), allocator); if (!x.TLSSecure) { + rapidjson::Value tls(rapidjson::kObjectType); tls.AddMember("enabled", true, allocator); if (!x.ServerName.empty()) @@ -2376,6 +2381,9 @@ proxyToSingBox(std::vector &nodes, rapidjson::Document &json, std::vector auto alpns = stringArrayToJsonArray(x.Alpn, ",", allocator); tls.AddMember("alpn", alpns, allocator); } + if (!x.PublicKey.empty()) { + tls.AddMember("certificate", rapidjson::StringRef(x.PublicKey.c_str()), allocator); + } tls.AddMember("insecure", buildBooleanValue(scv), allocator); proxy.AddMember("tls", tls, allocator); } diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index e01803d..031567a 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -223,6 +223,7 @@ void hysteria2Construct(Proxy &node, const std::string &group, const std::string const std::string &port, const std::string &password, const std::string &host, const std::string &up, const std::string &down, const std::string &alpn, const std::string &obfsParam, const std::string &obfsPassword, const std::string &sni, + const std::string &publicKey, tribool udp, tribool tfo, tribool scv) { commonConstruct(node, ProxyType::Hysteria2, group, remarks, add, port, udp, tfo, scv, tribool()); @@ -234,6 +235,7 @@ void hysteria2Construct(Proxy &node, const std::string &group, const std::string node.OBFSParam = obfsParam; node.OBFSPassword = obfsPassword; node.ServerName = sni; + node.PublicKey = publicKey; } void explodeVmess(std::string vmess, Proxy &node) { @@ -1355,7 +1357,7 @@ void explodeClash(Node yamlnode, std::vector &nodes) { singleproxy["alpn"][0] >>= alpn; sni = host; hysteria2Construct(node, group, ps, server, port, password, host, up, down, alpn, obfsParam, - obfsPassword, sni, udp, tfo, scv); + obfsPassword, sni, public_key, udp, tfo, scv); break; default: continue; @@ -1488,7 +1490,7 @@ void explodeStdHysteria2(std::string hysteria2, Proxy &node) { remarks = add + ":" + port; hysteria2Construct(node, HYSTERIA2_DEFAULT_GROUP, remarks, add, port, password, host, up, down, alpn, obfsParam, - obfsPassword, host, tribool(), tribool(), scv); + obfsPassword, host, "", tribool(), tribool(), scv); return; } @@ -2545,6 +2547,9 @@ void explodeSingbox(rapidjson::Value &outbounds, std::vector &nodes) { if (tlsObj.HasMember("insecure") && tlsObj["insecure"].IsBool()) { scv = tlsObj["insecure"].GetBool(); } + if (tlsObj.HasMember("certificate") && tlsObj["certificate"].IsString()) { + public_key = tlsObj["certificate"].GetString(); + } if (tlsObj.HasMember("reality") && tlsObj["reality"].IsObject()) { tls = "reality"; rapidjson::Value reality = tlsObj["reality"].GetObject(); @@ -2685,7 +2690,7 @@ void explodeSingbox(rapidjson::Value &outbounds, std::vector &nodes) { obfsPassword = GetMember(obfsOpt, "password"); } hysteria2Construct(node, group, ps, server, port, password, host, up, down, alpn, obfsParam, - obfsPassword, sni, udp, tfo, scv); + obfsPassword, sni,public_key, udp, tfo, scv); break; default: continue; diff --git a/src/parser/subparser.h b/src/parser/subparser.h index 2e6a328..fb06723 100644 --- a/src/parser/subparser.h +++ b/src/parser/subparser.h @@ -5,8 +5,7 @@ #include "config/proxy.h" -enum class ConfType -{ +enum class ConfType { Unknow, SS, SSR, @@ -19,36 +18,104 @@ enum class ConfType SUB, Local }; -void hysteriaConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &auth, const std::string &auth_str, const std::string &host, const std::string &up, const std::string &down, const std::string &alpn, const std::string &obfsParam, const std::string &insecure,const std::string &ports,const std::string &sni,tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void hysteria2Construct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &password, const std::string &host, const std::string &up, const std::string &down, const std::string &alpn, const std::string &obfsParam, const std::string &obfsPassword, const std::string &sni, const std::string &insecure ,tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls,const std::string &pkd, const std::string &sid, const std::string &fp,const std::string &sni, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void vmessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, const std::string &port, const std::string &type, const std::string &id, const std::string &aid, const std::string &net, const std::string &cipher, const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, const std::string &sni, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void ssrConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &protocol, const std::string &method, const std::string &obfs, const std::string &password, const std::string &obfsparam, const std::string &protoparam, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool()); -void ssConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &password, const std::string &method, const std::string &plugin, const std::string &pluginopts, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void socksConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &username, const std::string &password, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool()); -void httpConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &username, const std::string &password, bool tls, tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void trojanConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &password, const std::string &network, const std::string &host, const std::string &path,const std::string &fp,const std::string &sni, bool tlssecure, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); -void snellConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, const std::string &port, const std::string &password, const std::string &obfs, const std::string &host, uint16_t version = 0, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool()); + +void hysteriaConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, + const std::string &port, const std::string &type, const std::string &auth, + const std::string &auth_str, const std::string &host, const std::string &up, + const std::string &down, const std::string &alpn, const std::string &obfsParam, + const std::string &insecure, const std::string &ports, const std::string &sni, + tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), + tribool tls13 = tribool()); + +void hysteria2Construct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, + const std::string &port, const std::string &password, const std::string &host, + const std::string &up, const std::string &down, const std::string &alpn, + const std::string &obfsParam, const std::string &obfsPassword, const std::string &sni, + const std::string &publicKey, + tribool udp, tribool tfo, + tribool scv); + +void vlessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, + const std::string &port, const std::string &type, const std::string &id, const std::string &aid, + const std::string &net, const std::string &cipher, const std::string &flow, const std::string &mode, + const std::string &path, const std::string &host, const std::string &edge, const std::string &tls, + const std::string &pkd, const std::string &sid, const std::string &fp, const std::string &sni, + tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), + tribool tls13 = tribool()); + +void vmessConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &add, + const std::string &port, const std::string &type, const std::string &id, const std::string &aid, + const std::string &net, const std::string &cipher, const std::string &path, const std::string &host, + const std::string &edge, const std::string &tls, const std::string &sni, tribool udp = tribool(), + tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); + +void ssrConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &protocol, const std::string &method, + const std::string &obfs, const std::string &password, const std::string &obfsparam, + const std::string &protoparam, tribool udp = tribool(), tribool tfo = tribool(), + tribool scv = tribool()); + +void ssConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &password, const std::string &method, + const std::string &plugin, const std::string &pluginopts, tribool udp = tribool(), + tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); + +void socksConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &username, const std::string &password, + tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool()); + +void httpConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &username, const std::string &password, bool tls, + tribool tfo = tribool(), tribool scv = tribool(), tribool tls13 = tribool()); + +void trojanConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &password, const std::string &network, + const std::string &host, const std::string &path, const std::string &fp, const std::string &sni, + bool tlssecure, tribool udp = tribool(), tribool tfo = tribool(), tribool scv = tribool(), + tribool tls13 = tribool()); + +void snellConstruct(Proxy &node, const std::string &group, const std::string &remarks, const std::string &server, + const std::string &port, const std::string &password, const std::string &obfs, + const std::string &host, uint16_t version = 0, tribool udp = tribool(), tribool tfo = tribool(), + tribool scv = tribool()); + void explodeVmess(std::string vmess, Proxy &node); + void explodeSSR(std::string ssr, Proxy &node); + void explodeSS(std::string ss, Proxy &node); + void explodeTrojan(std::string trojan, Proxy &node); + void explodeQuan(const std::string &quan, Proxy &node); + void explodeStdVMess(std::string vmess, Proxy &node); + void explodeStdVless(std::string vless, Proxy &node); + void explodeStdHysteria(std::string hysteria, Proxy &node); + void explodeStdHysteria2(std::string hysteria2, Proxy &node); + void explodeShadowrocket(std::string kit, Proxy &node); + void explodeKitsunebi(std::string kit, Proxy &node); + void explodeVless(std::string vless, Proxy &node); + void explodeHysteria(std::string hysteria, Proxy &node); + void explodeHysteria2(std::string hysteria2, Proxy &node); /// Parse a link void explode(const std::string &link, Proxy &node); + void explodeSSD(std::string link, std::vector &nodes); + void explodeSub(std::string sub, std::vector &nodes); + int explodeConf(const std::string &filepath, std::vector &nodes); + int explodeConfContent(const std::string &content, std::vector &nodes); #endif // SUBPARSER_H_INCLUDED diff --git a/src/version.h b/src/version.h index e4b2969..8fc6e24 100644 --- a/src/version.h +++ b/src/version.h @@ -1,6 +1,6 @@ #ifndef VERSION_H_INCLUDED #define VERSION_H_INCLUDED -#define VERSION "v0.9.2" +#define VERSION "v0.9.3" #endif // VERSION_H_INCLUDED