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:
Tindy X
2019-11-25 18:28:50 +08:00
parent fefce5ba61
commit 81dfeac556
5 changed files with 40 additions and 10 deletions

View File

@@ -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/*

View File

@@ -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";

View File

@@ -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

View File

@@ -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

View File

@@ -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);