mirror of
https://github.com/asdlokj1qpi233/subconverter.git
synced 2025-10-27 20:03:01 +00:00
Enhancements
Fix program crash when broken JSON data (VMess links or configuration files) was passed. Fix a potential subscription parsing error. Add "-cfw" argument. Update build scripts. INIReader: Tweak output indentation.
This commit is contained in:
@@ -33,7 +33,7 @@ c++ -Wall -std=c++17 -fexceptions -DCURL_STATICLIB -D_MACOS -I/usr/local/include
|
||||
c++ -Wall -std=c++17 -fexceptions -DCURL_STATICLIB -D_MACOS -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/curl/include -c subexport.cpp -o obj/subexport.o
|
||||
c++ -Wall -std=c++17 -fexceptions -DCURL_STATICLIB -D_MACOS -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/curl/include -c webget.cpp -o obj/webget.o
|
||||
c++ -Wall -std=c++17 -fexceptions -DCURL_STATICLIB -D_MACOS -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/curl/include -c webserver_libevent.cpp -o obj/webserver_libevent.o
|
||||
c++ -Xlinker -unexported_symbol -Xlinker "*" -o subconverter obj/logger.o obj/main.o obj/misc.o obj/multithread.o obj/nodemanip.o obj/rapidjson_extra.o obj/speedtestutil.o obj/subexport.o obj/webget.o obj/webserver_libevent.o libevent.a curl/lib/.libs/libcurl.a libz.a libssl.a libcrypto.a libyaml-cpp.a bzip2-1.0.6/libbz2.a -ldl -lpthread -O3 -s
|
||||
c++ -Xlinker -unexported_symbol -Xlinker "*" -o subconverter obj/logger.o obj/main.o obj/misc.o obj/multithread.o obj/nodemanip.o obj/rapidjson_extra.o obj/speedtestutil.o obj/subexport.o obj/webget.o obj/webserver_libevent.o libevent.a curl/lib/.libs/libcurl.a libz.a libssl.a libcrypto.a libyaml-cpp.a bzip2-1.0.6/libbz2.a -ldl -lpthread -O3
|
||||
|
||||
chmod +rx subconverter
|
||||
chmod +r pref.ini *.yml *.conf README* rules/*
|
||||
|
||||
@@ -712,7 +712,7 @@ public:
|
||||
for(auto &y : x.second)
|
||||
{
|
||||
if(y.first != "{NONAME}")
|
||||
content += y.first + " = ";
|
||||
content += y.first + "=";
|
||||
content += y.second + "\n";
|
||||
}
|
||||
content += "\n";
|
||||
|
||||
18
main.cpp
18
main.cpp
@@ -22,7 +22,7 @@ std::vector<ruleset_content> ruleset_content_array;
|
||||
std::string listen_address = "127.0.0.1", default_url, managed_config_prefix;
|
||||
int listen_port = 25500, max_pending_connections = 10, max_concurrent_threads = 4;
|
||||
bool api_mode = true, write_managed_config = false, update_ruleset_on_request = false, overwrite_original_rules = true;
|
||||
bool print_debug_info = false;
|
||||
bool print_debug_info = false, cfw_child_process = false;
|
||||
extern std::string custom_group;
|
||||
|
||||
//multi-thread lock
|
||||
@@ -219,6 +219,9 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
std::string group = UrlDecode(getUrlArg(argument, "group")), upload = getUrlArg(argument, "upload"), upload_path = getUrlArg(argument, "upload_path"), version = getUrlArg(argument, "ver");
|
||||
std::string append_type = getUrlArg(argument, "append_type");
|
||||
std::string base_content, output_content;
|
||||
string_array extra_group;
|
||||
std::string groups = urlsafe_base64_decode(getUrlArg(argument, "groups"));
|
||||
extra_group = split(groups, "`");
|
||||
|
||||
extra_settings ext;
|
||||
if(emoji == "true")
|
||||
@@ -247,7 +250,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
url = default_url;
|
||||
if(!url.size() || !target.size())
|
||||
return "Invalid request!";
|
||||
if(!api_mode)
|
||||
if(!api_mode || cfw_child_process)
|
||||
readConf();
|
||||
|
||||
string_array urls = split(url, "|");
|
||||
@@ -269,7 +272,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
if(!nodes.size())
|
||||
return "No nodes were found!";
|
||||
if(update_ruleset_on_request)
|
||||
if(update_ruleset_on_request || cfw_child_process)
|
||||
refreshRulesets();
|
||||
|
||||
std::cerr<<"Generate target: ";
|
||||
@@ -388,6 +391,15 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
|
||||
}
|
||||
}
|
||||
|
||||
void chkArg(int argc, char *argv[])
|
||||
{
|
||||
for(int i = 1; i < argc; i++)
|
||||
{
|
||||
if(strcmp(argv[i], "-cfw") == 0)
|
||||
cfw_child_process = true;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifdef _WIN32
|
||||
|
||||
8
pref.ini
8
pref.ini
@@ -165,7 +165,7 @@ update_ruleset_on_request=false
|
||||
surge_ruleset=🎯 全球直连,rules/ConnersHua/Surge/Ruleset/Unbreak.list
|
||||
surge_ruleset=🛑 全球拦截,rules/NobyDa/Surge/AdRule.list
|
||||
surge_ruleset=🛑 全球拦截,rules/ConnersHua/Surge/Ruleset/Hijacking.list
|
||||
surge_ruleset=🎥 NETFLIX,rules/ConnersHua/Surge/Ruleset/Media/Netflix.list
|
||||
;surge_ruleset=🎥 NETFLIX,rules/ConnersHua/Surge/Ruleset/Media/Netflix.list
|
||||
surge_ruleset=🌍 国外媒体,rules/ConnersHua/Surge/Ruleset/GlobalMedia.list
|
||||
surge_ruleset=🌏 国内媒体,rules/lhie1/Surge3/Domestic.list
|
||||
surge_ruleset=📲 电报信息,rules/ConnersHua/Surge/Ruleset/Telegram.list
|
||||
@@ -209,12 +209,12 @@ surge_ruleset=🐟 漏网之鱼,[]FINAL
|
||||
;for Surge rulesets
|
||||
custom_proxy_group=🔰 节点选择`select`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=♻️ 自动选择`url-test`.*`http://www.gstatic.com/generate_204`300
|
||||
custom_proxy_group=🎥 NETFLIX`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
;custom_proxy_group=🎥 NETFLIX`select`[]🔰 节点选择`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
;custom_proxy_group=⛔️ 广告拦截`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择
|
||||
;custom_proxy_group=🚫 运营劫持`select`[]🛑 全球拦截`[]🎯 全球直连`[]🔰 节点选择
|
||||
custom_proxy_group=🌍 国外媒体`select`[]♻️ 自动选择`[]🎯 全球直连`.*
|
||||
custom_proxy_group=🌏 国内媒体`select`[]🎯 全球直连`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|hk|香港|tw)`[]🔰 节点选择
|
||||
custom_proxy_group=📲 电报信息`select`[]🔰 节点选择`.*
|
||||
custom_proxy_group=🌏 国内媒体`select`[]🎯 全球直连`(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|hk|港|tw)`[]🔰 节点选择
|
||||
custom_proxy_group=📲 电报信息`select`[]🔰 节点选择`.*`[]🎯 全球直连
|
||||
custom_proxy_group=🍎 苹果服务`select`[]🔰 节点选择`[]🎯 全球直连`[]♻️ 自动选择`.*
|
||||
custom_proxy_group=🎯 全球直连`select`[]DIRECT
|
||||
custom_proxy_group=🛑 全球拦截`select`[]REJECT`[]DIRECT
|
||||
|
||||
@@ -168,6 +168,8 @@ void explodeVmess(std::string vmess, std::string custom_port, int local_port, no
|
||||
return;
|
||||
}
|
||||
jsondata.Parse(vmess.data());
|
||||
if(jsondata.HasParseError())
|
||||
return;
|
||||
|
||||
version = "1"; //link without version will treat as version 1
|
||||
GetMember(jsondata, "v", version); //try to get version
|
||||
@@ -220,6 +222,8 @@ void explodeVmessConf(std::string content, std::string custom_port, int local_po
|
||||
std::map<std::string, std::string>::iterator iter;
|
||||
|
||||
json.Parse(content.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
if(json.HasMember("outbounds")) //single config
|
||||
{
|
||||
if(json["outbounds"].Size() > 0 && json["outbounds"][0].HasMember("settings") && json["outbounds"][0]["settings"].HasMember("vnext") && json["outbounds"][0]["settings"]["vnext"].Size() > 0)
|
||||
@@ -389,6 +393,8 @@ void explodeSSD(std::string link, bool libev, std::string custom_port, int local
|
||||
std::string plugin, pluginopts;
|
||||
link = urlsafe_base64_decode(link.substr(6));
|
||||
jsondata.Parse(link.c_str());
|
||||
if(jsondata.HasParseError())
|
||||
return;
|
||||
if(!jsondata.HasMember("servers"))
|
||||
return;
|
||||
GetMember(jsondata, "airport", group);
|
||||
@@ -444,6 +450,8 @@ void explodeSSAndroid(std::string ss, bool libev, std::string custom_port, int l
|
||||
//first add some extra data before parsing
|
||||
ss = "{\"nodes\":" + ss + "}";
|
||||
json.Parse(ss.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
|
||||
for(unsigned int i = 0; i < json["nodes"].Size(); i++)
|
||||
{
|
||||
@@ -487,6 +495,8 @@ void explodeSSConf(std::string content, std::string custom_port, int local_port,
|
||||
int index = nodes.size();
|
||||
|
||||
json.Parse(content.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
if(json.HasMember("local_port") && json.HasMember("local_address")) //single libev config
|
||||
{
|
||||
server = GetMember(json, "server");
|
||||
@@ -605,6 +615,8 @@ void explodeSSRConf(std::string content, std::string custom_port, int local_port
|
||||
int index = nodes.size();
|
||||
|
||||
json.Parse(content.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
if(json.HasMember("local_port") && json.HasMember("local_address")) //single libev config
|
||||
{
|
||||
method = GetMember(json, "method");
|
||||
@@ -775,6 +787,8 @@ void explodeNetch(std::string netch, bool ss_libev, bool ssr_libev, std::string
|
||||
netch = urlsafe_base64_decode(netch.substr(8));
|
||||
|
||||
json.Parse(netch.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
json["Type"] >> type;
|
||||
json["Remark"] >> remark;
|
||||
json["Hostname"] >> address;
|
||||
@@ -1307,6 +1321,8 @@ void explodeSSTap(std::string sstap, std::string custom_port, int local_port, st
|
||||
std::string protocol, protoparam, obfs, obfsparam;
|
||||
unsigned int index = nodes.size();
|
||||
json.Parse(sstap.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
|
||||
for(unsigned int i = 0; i < json["configs"].Size(); i++)
|
||||
{
|
||||
@@ -1372,6 +1388,8 @@ void explodeNetchConf(std::string netch, bool ss_libev, bool ssr_libev, std::str
|
||||
unsigned int index = nodes.size();
|
||||
|
||||
json.Parse(netch.data());
|
||||
if(json.HasParseError())
|
||||
return;
|
||||
|
||||
if(!json.HasMember("Server"))
|
||||
return;
|
||||
@@ -1559,7 +1577,7 @@ void explodeSub(std::string sub, bool sslibev, bool ssrlibev, std::string custom
|
||||
sub = urlsafe_base64_decode(sub);
|
||||
strstream << sub;
|
||||
unsigned int index = nodes.size();
|
||||
char delimiter = split(sub, "\n").size() < 1 ? split(sub, "\r").size() < 1 ? ' ' : '\r' : '\n';
|
||||
char delimiter = count(sub.begin(), sub.end(), '\n') < 1 ? count(sub.begin(), sub.end(), '\r') < 1 ? ' ' : '\r' : '\n';
|
||||
while(getline(strstream, strLink, delimiter))
|
||||
{
|
||||
explode(strLink, sslibev, ssrlibev, custom_port, local_port, node);
|
||||
|
||||
Reference in New Issue
Block a user