Enhancements

Add loading external custom configuration from URL.
Optimize codes.
This commit is contained in:
Tindy X
2020-01-01 14:30:41 +08:00
parent 09c14e0222
commit 9196387fe6
2 changed files with 79 additions and 30 deletions

View File

@@ -253,6 +253,38 @@ void readConf()
std::cerr<<"Read preference settings completed."<<std::endl; std::cerr<<"Read preference settings completed."<<std::endl;
} }
int loadExternalConfig(std::string &path, string_array &custom_proxy_group, string_array &surge_ruleset, std::string proxy)
{
std::string base_content;
if(fileExist(path))
base_content = fileGet(path, false);
else
base_content = webGet(path, proxy);
INIReader ini;
ini.store_isolated_line = true;
ini.SetIsolatedItemsSection("custom");
if(ini.Parse(base_content) != INIREADER_EXCEPTION_NONE)
{
std::cerr<<"Load external configuration failed. Reason: "<<ini.GetLastError()<<"\n";
return -1;
}
ini.EnterSection("custom");
if(ini.ItemPrefixExist("custom_proxy_group"))
{
eraseElements(custom_proxy_group);
ini.GetAll("custom_proxy_group", custom_proxy_group);
}
if(ini.ItemPrefixExist("surge_ruleset"))
{
eraseElements(surge_ruleset);
ini.GetAll("surge_ruleset", surge_ruleset);
}
return 0;
}
void generateBase() void generateBase()
{ {
std::string base_content; std::string base_content;
@@ -291,7 +323,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
std::string include = UrlDecode(getUrlArg(argument, "include")), exclude = UrlDecode(getUrlArg(argument, "exclude")), sort_flag = getUrlArg(argument, "sort"); std::string include = UrlDecode(getUrlArg(argument, "include")), exclude = UrlDecode(getUrlArg(argument, "exclude")), sort_flag = getUrlArg(argument, "sort");
std::string base_content, output_content; std::string base_content, output_content;
string_array extra_group, extra_ruleset, include_remarks, exclude_remarks; string_array extra_group, extra_ruleset, include_remarks, exclude_remarks;
std::string groups = urlsafe_base64_decode(getUrlArg(argument, "groups")), ruleset = urlsafe_base64_decode(getUrlArg(argument, "ruleset")); std::string groups = urlsafe_base64_decode(getUrlArg(argument, "groups")), ruleset = urlsafe_base64_decode(getUrlArg(argument, "ruleset")), config = UrlDecode(getUrlArg(argument, "config"));
std::vector<ruleset_content> rca; std::vector<ruleset_content> rca;
if(!url.size()) if(!url.size())
@@ -301,34 +333,53 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
if(!api_mode || cfw_child_process) if(!api_mode || cfw_child_process)
readConf(); readConf();
if(groups.size()) std::string proxy;
if(proxy_subscription == "SYSTEM")
proxy = getSystemProxy();
else if(proxy_subscription == "NONE")
proxy = "";
else
proxy = proxy_subscription;
if(config.size())
{ {
extra_group = split(groups, "@"); std::cerr<<"External configuration file provided. Loading...\n";
if(!extra_group.size()) extra_group = clash_extra_group;
extra_group = clash_extra_group; extra_ruleset = rulesets;
loadExternalConfig(config, extra_group, extra_ruleset, proxy);
refreshRulesets(extra_ruleset, rca);
} }
else else
extra_group = clash_extra_group;
if(ruleset.size())
{ {
extra_ruleset = split(ruleset, "@"); if(groups.size())
if(!extra_ruleset.size()) {
extra_group = split(groups, "@");
if(!extra_group.size())
extra_group = clash_extra_group;
}
else
extra_group = clash_extra_group;
if(ruleset.size())
{
extra_ruleset = split(ruleset, "@");
if(!extra_ruleset.size())
{
if(update_ruleset_on_request || cfw_child_process)
refreshRulesets(rulesets, ruleset_content_array);
rca = ruleset_content_array;
}
else
{
refreshRulesets(extra_ruleset, rca);
}
}
else
{ {
if(update_ruleset_on_request || cfw_child_process) if(update_ruleset_on_request || cfw_child_process)
refreshRulesets(rulesets, ruleset_content_array); refreshRulesets(rulesets, ruleset_content_array);
rca = ruleset_content_array; rca = ruleset_content_array;
} }
else
{
refreshRulesets(extra_ruleset, rca);
}
}
else
{
if(update_ruleset_on_request || cfw_child_process)
refreshRulesets(rulesets, ruleset_content_array);
rca = ruleset_content_array;
} }
extra_settings ext; extra_settings ext;
@@ -346,14 +397,6 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
else else
ext.append_proxy_type = append_proxy_type; ext.append_proxy_type = append_proxy_type;
std::string proxy;
if(proxy_subscription == "SYSTEM")
proxy = getSystemProxy();
else if(proxy_subscription == "NONE")
proxy = "";
else
proxy = proxy_subscription;
ext.tfo = tfo.size() ? tfo == "true" : tfo_flag; ext.tfo = tfo.size() ? tfo == "true" : tfo_flag;
ext.udp = udp.size() ? udp == "true" : udp_flag; ext.udp = udp.size() ? udp == "true" : udp_flag;
ext.sort_flag = sort_flag.size() ? sort_flag == "true" : do_sort; ext.sort_flag = sort_flag.size() ? sort_flag == "true" : do_sort;
@@ -390,7 +433,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
if(target == "clash" || target == "clashr") if(target == "clash" || target == "clashr")
{ {
std::cerr<<"Clash"<<((target == "clashr") ? "R" : "")<<std::endl; std::cerr<<"Clash"<<((target == "clashr") ? "R" : "")<<std::endl;
if(ruleset.size() || groups.size() || update_ruleset_on_request) if(rca.size() || extra_group.size() || update_ruleset_on_request)
{ {
if(fileExist(clash_rule_base)) if(fileExist(clash_rule_base))
base_content = fileGet(clash_rule_base, false); base_content = fileGet(clash_rule_base, false);
@@ -443,7 +486,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS)
else if(target == "mellow") else if(target == "mellow")
{ {
std::cerr<<"Mellow"<<std::endl; std::cerr<<"Mellow"<<std::endl;
if(ruleset.size() || groups.size() || update_ruleset_on_request) if(rca.size() || extra_group.size() || update_ruleset_on_request)
{ {
if(fileExist(mellow_rule_base)) if(fileExist(mellow_rule_base))
base_content = fileGet(mellow_rule_base, false); base_content = fileGet(mellow_rule_base, false);

View File

@@ -67,6 +67,12 @@ static inline bool strFind(std::string str, std::string target)
return str.find(target) != str.npos; return str.find(target) != str.npos;
} }
template <typename T> static inline void eraseElements(std::vector<T> &target)
{
target.clear();
target.shrink_to_fit();
}
template <typename T> static inline void eraseElements(T &target) template <typename T> static inline void eraseElements(T &target)
{ {
T().swap(target); T().swap(target);