Url-decode file name before adding as Clash rule provider (#815)

This commit is contained in:
Tindy X 2025-01-16 17:11:45 +08:00
parent 3f5ed82672
commit 05959b09b4
No known key found for this signature in database
GPG Key ID: 7FA1E66774759718

View File

@ -386,10 +386,10 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
if(fileExist(rule_path, true) || isLink(rule_path)) if(fileExist(rule_path, true) || isLink(rule_path))
{ {
//rule_name = std::to_string(hash_(rule_group + rule_path)); //rule_name = std::to_string(hash_(rule_group + rule_path));
rule_name = old_rule_name = findFileName(rule_path); rule_name = old_rule_name = urlDecode(findFileName(rule_path));
int idx = 2; int idx = 2;
while(std::find(groups.begin(), groups.end(), rule_name) != groups.end()) while(std::find(groups.begin(), groups.end(), rule_name) != groups.end())
rule_name = old_rule_name + "_" + std::to_string(idx++); rule_name = old_rule_name + " " + std::to_string(idx++);
names[rule_name] = rule_group; names[rule_name] = rule_group;
urls[rule_name] = rule_path_typed; urls[rule_name] = rule_path_typed;
rule_type[rule_name] = x.rule_type; rule_type[rule_name] = x.rule_type;
@ -436,9 +436,9 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
if(vArray.size() < 2) if(vArray.size() < 2)
continue; continue;
if(keywords.find(rule_name) == keywords.end()) if(keywords.find(rule_name) == keywords.end())
keywords[rule_name] = "\"" + vArray[1] + "\""; keywords[rule_name] = "\"" + trim(vArray[1]) + "\"";
else else
keywords[rule_name] += ",\"" + vArray[1] + "\""; keywords[rule_name] += ",\"" + trim(vArray[1]) + "\"";
} }
else else
{ {
@ -449,7 +449,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
} }
else else
{ {
strLine = vArray[0] + "," + vArray[1] + "," + rule_group; strLine = vArray[0] + "," + trim(vArray[1]) + "," + rule_group;
if(vArray.size() > 2) if(vArray.size() > 2)
strLine += "," + vArray[2]; strLine += "," + vArray[2];
} }
@ -466,13 +466,13 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
} }
} }
if(has_domain[rule_name] && !script) if(has_domain[rule_name] && !script)
rules.emplace_back("RULE-SET," + rule_name + "_domain," + rule_group); rules.emplace_back("RULE-SET," + rule_name + " (Domain)," + rule_group);
if(has_ipcidr[rule_name] && !script) if(has_ipcidr[rule_name] && !script)
{ {
if(has_no_resolve) if(has_no_resolve)
rules.emplace_back("RULE-SET," + rule_name + "_ipcidr," + rule_group + ",no-resolve"); rules.emplace_back("RULE-SET," + rule_name + " (IP-CIDR)," + rule_group + ",no-resolve");
else else
rules.emplace_back("RULE-SET," + rule_name + "_ipcidr," + rule_group); rules.emplace_back("RULE-SET," + rule_name + " (IP-CIDR)," + rule_group);
} }
if(!has_domain[rule_name] && !has_ipcidr[rule_name] && !script) if(!has_domain[rule_name] && !has_ipcidr[rule_name] && !script)
rules.emplace_back("RULE-SET," + rule_name + "," + rule_group); rules.emplace_back("RULE-SET," + rule_name + "," + rule_group);
@ -490,14 +490,14 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
{ {
std::string yaml_key = x; std::string yaml_key = x;
if(rule_type[x] != RULESET_CLASH_DOMAIN) if(rule_type[x] != RULESET_CLASH_DOMAIN)
yaml_key += "_domain"; yaml_key += " (Domain)";
base_rule["rule-providers"][yaml_key]["type"] = "http"; base_rule["rule-providers"][yaml_key]["type"] = "http";
base_rule["rule-providers"][yaml_key]["behavior"] = "domain"; base_rule["rule-providers"][yaml_key]["behavior"] = "domain";
if(url[0] == '*') if(url[0] == '*')
base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); base_rule["rule-providers"][yaml_key]["url"] = url.substr(1);
else else
base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=3&url=" + urlSafeBase64Encode(url); base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=3&url=" + urlSafeBase64Encode(url);
base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + yaml_key + ".yaml"; base_rule["rule-providers"][yaml_key]["path"] = "./providers/" + std::to_string(hash_(url)) + "_domain.yaml";
if(interval) if(interval)
base_rule["rule-providers"][yaml_key]["interval"] = interval; base_rule["rule-providers"][yaml_key]["interval"] = interval;
} }
@ -505,14 +505,14 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
{ {
std::string yaml_key = x; std::string yaml_key = x;
if(rule_type[x] != RULESET_CLASH_IPCIDR) if(rule_type[x] != RULESET_CLASH_IPCIDR)
yaml_key += "_ipcidr"; yaml_key += " (IP-CIDR)";
base_rule["rule-providers"][yaml_key]["type"] = "http"; base_rule["rule-providers"][yaml_key]["type"] = "http";
base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr"; base_rule["rule-providers"][yaml_key]["behavior"] = "ipcidr";
if(url[0] == '*') if(url[0] == '*')
base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); base_rule["rule-providers"][yaml_key]["url"] = url.substr(1);
else else
base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=4&url=" + urlSafeBase64Encode(url); base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=4&url=" + urlSafeBase64Encode(url);
base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + yaml_key + ".yaml"; base_rule["rule-providers"][yaml_key]["path"] = "./providers/" + std::to_string(hash_(url)) + "_ipcidr.yaml";
if(interval) if(interval)
base_rule["rule-providers"][yaml_key]["interval"] = interval; base_rule["rule-providers"][yaml_key]["interval"] = interval;
} }
@ -525,7 +525,7 @@ int renderClashScript(YAML::Node &base_rule, std::vector<RulesetContent> &rulese
base_rule["rule-providers"][yaml_key]["url"] = url.substr(1); base_rule["rule-providers"][yaml_key]["url"] = url.substr(1);
else else
base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=6&url=" + urlSafeBase64Encode(url); base_rule["rule-providers"][yaml_key]["url"] = remote_path_prefix + "/getruleset?type=6&url=" + urlSafeBase64Encode(url);
base_rule["rule-providers"][yaml_key]["path"] = "./providers/rule-provider_" + yaml_key + ".yaml"; base_rule["rule-providers"][yaml_key]["path"] = "./providers/" + std::to_string(hash_(url)) + ".yaml";
if(interval) if(interval)
base_rule["rule-providers"][yaml_key]["interval"] = interval; base_rule["rule-providers"][yaml_key]["interval"] = interval;
} }