From f3ce5d9ca4ad0846c2650d910c6c1280ce71fb7b Mon Sep 17 00:00:00 2001 From: imbytecat Date: Thu, 5 May 2022 00:32:22 +0800 Subject: [PATCH 1/2] Add 'Cookie' in Clash ws-opts --- .gitignore | 2 ++ src/generator/config/subexport.cpp | 4 ++++ src/parser/config/proxy.h | 1 + src/parser/subparser.cpp | 29 ++++++++++++++++------------- src/parser/subparser.h | 2 +- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 300105aeb..1a592aa74 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ subconverter.exe .vscode +.idea/ +cmake-build-debug/ diff --git a/src/generator/config/subexport.cpp b/src/generator/config/subexport.cpp index 27576f16f..fc3e20cdb 100644 --- a/src/generator/config/subexport.cpp +++ b/src/generator/config/subexport.cpp @@ -305,6 +305,8 @@ void proxyToClash(std::vector &nodes, YAML::Node &yamlnode, const ProxyGr singleproxy["ws-opts"]["headers"]["Host"] = x.Host; if(!x.Edge.empty()) singleproxy["ws-opts"]["headers"]["Edge"] = x.Edge; + if(!x.Cookie.empty()) + singleproxy["ws-opts"]["headers"]["Cookie"] = x.Cookie; } else { @@ -313,6 +315,8 @@ void proxyToClash(std::vector &nodes, YAML::Node &yamlnode, const ProxyGr singleproxy["ws-headers"]["Host"] = x.Host; if(!x.Edge.empty()) singleproxy["ws-headers"]["Edge"] = x.Edge; + if(!x.Cookie.empty()) + singleproxy["ws-headers"]["Cookie"] = x.Cookie; } break; case "http"_hash: diff --git a/src/parser/config/proxy.h b/src/parser/config/proxy.h index 5edc1ded9..a96d6232b 100644 --- a/src/parser/config/proxy.h +++ b/src/parser/config/proxy.h @@ -73,6 +73,7 @@ struct Proxy String Host; String Path; String Edge; + String Cookie; String QUICSecure; String QUICSecret; diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index 4a2cf4baa..ee6a5c62c 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -37,7 +37,7 @@ void commonConstruct(Proxy &node, ProxyType type, const std::string &group, cons node.TLS13 = tls13; } -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 tfo, tribool scv, tribool tls13) +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 &cookie, const std::string &tls, const std::string &sni, tribool udp, tribool tfo, tribool scv, tribool tls13) { commonConstruct(node, ProxyType::VMess, group, remarks, add, port, udp, tfo, scv, tls13); node.UserId = id.empty() ? "00000000-0000-0000-0000-000000000000" : id; @@ -45,6 +45,7 @@ void vmessConstruct(Proxy &node, const std::string &group, const std::string &re node.EncryptMethod = cipher; node.TransferProtocol = net.empty() ? "tcp" : net; node.Edge = edge; + node.Cookie = cookie; node.ServerName = sni; if(net == "quic") @@ -182,7 +183,7 @@ void explodeVmess(std::string vmess, Proxy &node) add = trim(add); - vmessConstruct(node, V2RAY_DEFAULT_GROUP, ps, add, port, type, id, aid, net, "auto", path, host, "", tls, sni); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, ps, add, port, type, id, aid, net, "auto", path, host, "", "", tls, sni); } void explodeVmessConf(std::string content, std::vector &nodes) @@ -260,7 +261,7 @@ void explodeVmessConf(std::string content, std::vector &nodes) } } } - vmessConstruct(node, V2RAY_DEFAULT_GROUP, add + ":" + port, add, port, type, id, aid, net, cipher, path, host, edge, tls, "", udp, tfo, scv); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, add + ":" + port, add, port, type, id, aid, net, cipher, path, host, edge, "", tls, "", udp, tfo, scv); nodes.emplace_back(std::move(node)); } return; @@ -314,7 +315,7 @@ void explodeVmessConf(std::string content, std::vector &nodes) json["vmess"][i]["streamSecurity"] >> tls; json["vmess"][i]["security"] >> cipher; json["vmess"][i]["sni"] >> sni; - vmessConstruct(node, V2RAY_DEFAULT_GROUP, ps, add, port, type, id, aid, net, cipher, path, host, "", tls, sni, udp, tfo, scv); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, ps, add, port, type, id, aid, net, cipher, path, host, "", "", tls, sni, udp, tfo, scv); break; case 3: //ss config json["vmess"][i]["id"] >> id; @@ -831,7 +832,7 @@ void explodeQuan(const std::string &quan, Proxy &node) if(path.empty()) path = "/"; - vmessConstruct(node, group, ps, add, port, type, id, aid, net, cipher, path, host, edge, tls, ""); + vmessConstruct(node, group, ps, add, port, type, id, aid, net, cipher, path, host, edge, "", tls, ""); } } @@ -901,7 +902,7 @@ void explodeNetch(std::string netch, Proxy &node) sni = GetMember(json, "ServerName"); if(group.empty()) group = V2RAY_DEFAULT_GROUP; - vmessConstruct(node, group, remark, address, port, faketype, id, aid, transprot, method, path, host, edge, tls, sni, udp, tfo, scv); + vmessConstruct(node, group, remark, address, port, faketype, id, aid, transprot, method, path, host, edge, "", tls, sni, udp, tfo, scv); break; case "Socks5"_hash: username = GetMember(json, "Username"); @@ -940,7 +941,7 @@ void explodeNetch(std::string netch, Proxy &node) void explodeClash(Node yamlnode, std::vector &nodes) { std::string proxytype, ps, server, port, cipher, group, password; //common - std::string type = "none", id, aid = "0", net = "tcp", path, host, edge, tls, sni; //vmess + std::string type = "none", id, aid = "0", net = "tcp", path, host, edge, cookie, tls, sni; //vmess std::string plugin, pluginopts, pluginopts_mode, pluginopts_host, pluginopts_mux; //ss std::string protocol, protoparam, obfs, obfsparam; //ssr std::string user; //socks @@ -983,12 +984,14 @@ void explodeClash(Node yamlnode, std::vector &nodes) path = singleproxy["ws-opts"]["path"].IsDefined() ? safe_as(singleproxy["ws-opts"]["path"]) : "/"; singleproxy["ws-opts"]["headers"]["Host"] >>= host; singleproxy["ws-opts"]["headers"]["Edge"] >>= edge; + singleproxy["ws-opts"]["headers"]["Cookie"] >>= cookie; } else { path = singleproxy["ws-path"].IsDefined() ? safe_as(singleproxy["ws-path"]) : "/"; singleproxy["ws-headers"]["Host"] >>= host; singleproxy["ws-headers"]["Edge"] >>= edge; + singleproxy["ws-headers"]["Cookie"] >>= cookie; } break; case "h2"_hash: @@ -1004,7 +1007,7 @@ void explodeClash(Node yamlnode, std::vector &nodes) } tls = safe_as(singleproxy["tls"]) == "true" ? "tls" : ""; - vmessConstruct(node, group, ps, server, port, "", id, aid, net, cipher, path, host, edge, tls, sni, udp, tfo, scv); + vmessConstruct(node, group, ps, server, port, "", id, aid, net, cipher, path, host, edge, cookie, tls, sni, udp, tfo, scv); break; case "ss"_hash: group = SS_DEFAULT_GROUP; @@ -1193,7 +1196,7 @@ void explodeStdVMess(std::string vmess, Proxy &node) if(remarks.empty()) remarks = add + ":" + port; - vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, "auto", path, host, "", tls, ""); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, "auto", path, host, "", "", tls, ""); return; } @@ -1238,7 +1241,7 @@ void explodeShadowrocket(std::string rocket, Proxy &node) if(remarks.empty()) remarks = add + ":" + port; - vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, cipher, path, host, "", tls, ""); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, cipher, path, host, "", "", tls, ""); } void explodeKitsunebi(std::string kit, Proxy &node) @@ -1276,7 +1279,7 @@ void explodeKitsunebi(std::string kit, Proxy &node) if(remarks.empty()) remarks = add + ":" + port; - vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, cipher, path, host, "", tls, ""); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, add, port, type, id, aid, net, cipher, path, host, "", "", tls, ""); } bool explodeSurge(std::string surge, std::vector &nodes) @@ -1540,7 +1543,7 @@ bool explodeSurge(std::string surge, std::vector &nodes) } } - vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, server, port, "", id, aead, net, method, path, host, edge, tls, "", udp, tfo, scv, tls13); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, server, port, "", id, aead, net, method, path, host, edge, "", tls, "", udp, tfo, scv, tls13); break; case "http"_hash: //http proxy server = trim(configs[1]); @@ -1821,7 +1824,7 @@ bool explodeSurge(std::string surge, std::vector &nodes) if(remarks.empty()) remarks = server + ":" + port; - vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, server, port, "", id, aead, net, method, path, host, "", tls, "", udp, tfo, scv, tls13); + vmessConstruct(node, V2RAY_DEFAULT_GROUP, remarks, server, port, "", id, aead, net, method, path, host, "", "", tls, "", udp, tfo, scv, tls13); break; case "trojan"_hash: //quantumult x style trojan link server = trim(configs[0].substr(0, configs[0].rfind(":"))); diff --git a/src/parser/subparser.h b/src/parser/subparser.h index 5d236a901..52be8c116 100644 --- a/src/parser/subparser.h +++ b/src/parser/subparser.h @@ -20,7 +20,7 @@ enum class ConfType Local }; -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 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 &cookie, 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()); From 86f75e47a0d4c8f2422b0ac302a8636361b5acff Mon Sep 17 00:00:00 2001 From: imbytecat Date: Thu, 5 May 2022 00:54:01 +0800 Subject: [PATCH 2/2] Run GitHub Actions --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2a3e38a4a..1724a24ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,7 @@ name: GitHub CI -on: [push] +on: + push: + workflow_dispatch: concurrency: group: ${{ github.ref }}-${{ github.workflow }}