From 46ae7b02a0b58773226c8e14bcc8fa159ad5ed8b Mon Sep 17 00:00:00 2001 From: Denis Kudelin <15978569+denis-kudelin@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:34:43 -0700 Subject: [PATCH] propagate ruleset flags --- src/config/binding.h | 32 +++++++++++++++++++++------- src/generator/config/ruleconvert.cpp | 10 +++++---- src/generator/config/ruleconvert.h | 1 + src/handler/settings.cpp | 15 +++++++++---- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/config/binding.h b/src/config/binding.h index e069869d5..d52af8e36 100644 --- a/src/config/binding.h +++ b/src/config/binding.h @@ -285,21 +285,37 @@ namespace INIBinding if(pos == String::npos) continue; conf.Group = x.substr(0, pos); - if(x.substr(pos + 1, 2) == "[]") + String rest = x.substr(pos + 1); + if(rest.substr(0, 2) == "[]") { - conf.Url = x.substr(pos + 1); - //conf.Type = RulesetType::SurgeRuleset; + conf.Url = rest; confs.emplace_back(std::move(conf)); continue; } - String::size_type epos = x.rfind(","); - if(pos != epos) + String::size_type fpos = rest.rfind(",flags="); + if(fpos != String::npos) { - conf.Interval = to_int(x.substr(epos + 1), 0); - conf.Url = x.substr(pos + 1, epos - pos - 1); + String flags_part = rest.substr(fpos + 7); + String::size_type ipos = flags_part.find(','); + if(ipos != String::npos) + { + conf.Interval = to_int(flags_part.substr(ipos + 1), 0); + conf.Url = rest.substr(0, fpos) + ",flags=" + flags_part.substr(0, ipos); + } + else + conf.Url = rest; } else - conf.Url = x.substr(pos + 1); + { + String::size_type epos = rest.rfind(","); + if(epos != String::npos) + { + conf.Interval = to_int(rest.substr(epos + 1), 0); + conf.Url = rest.substr(0, epos); + } + else + conf.Url = rest; + } confs.emplace_back(std::move(conf)); } return confs; diff --git a/src/generator/config/ruleconvert.cpp b/src/generator/config/ruleconvert.cpp index 84ea41816..7d0c88216 100644 --- a/src/generator/config/ruleconvert.cpp +++ b/src/generator/config/ruleconvert.cpp @@ -393,10 +393,12 @@ void rulesetToSurge(INIReader &base_rule, std::vector &ruleset_c std::string flags_a = extract_flags_from_tail(rule_path); std::string flags_b = extract_flags_from_tail(rule_path_typed); std::string merged_flags; - if(!flags_a.empty() && !flags_b.empty()) - merged_flags = flags_b + "|" + flags_a; - else - merged_flags = !flags_b.empty() ? flags_b : flags_a; + if(!flags_b.empty()) + merged_flags = flags_b; + if(!flags_a.empty()) + merged_flags += (merged_flags.empty() ? "" : "|") + flags_a; + if(!x.flags.empty()) + merged_flags += (merged_flags.empty() ? "" : "|") + x.flags; if(rule_path.empty()) { diff --git a/src/generator/config/ruleconvert.h b/src/generator/config/ruleconvert.h index accccb948..339f40a97 100644 --- a/src/generator/config/ruleconvert.h +++ b/src/generator/config/ruleconvert.h @@ -24,6 +24,7 @@ struct RulesetContent std::string rule_group; std::string rule_path; std::string rule_path_typed; + std::string flags; int rule_type = RULESET_SURGE; std::shared_future rule_content; int update_interval = 0; diff --git a/src/handler/settings.cpp b/src/handler/settings.cpp index 0c2d67c39..6b105f103 100644 --- a/src/handler/settings.cpp +++ b/src/handler/settings.cpp @@ -248,7 +248,7 @@ void readRuleset(YAML::Node node, string_array &dest, bool scope_limit = true) void refreshRulesets(RulesetConfigs &ruleset_list, std::vector &ruleset_content_array) { eraseElements(ruleset_content_array); - std::string rule_group, rule_url, rule_url_typed, interval; + std::string rule_group, rule_url, rule_url_typed, flags; RulesetContent rc; std::string proxy = parseProxy(global.proxyRuleset); @@ -257,11 +257,18 @@ void refreshRulesets(RulesetConfigs &ruleset_list, std::vector & { rule_group = x.Group; rule_url = x.Url; - std::string::size_type pos = x.Url.find("[]"); + flags.clear(); + std::string::size_type fpos = rule_url.rfind(",flags="); + if(fpos != std::string::npos) + { + flags = rule_url.substr(fpos + 7); + rule_url.erase(fpos); + } + std::string::size_type pos = rule_url.find("[]"); if(pos != std::string::npos) { writeLog(0, "Adding rule '" + rule_url.substr(pos + 2) + "," + rule_group + "'.", LOG_LEVEL_INFO); - rc = {rule_group, "", "", RULESET_SURGE, std::async(std::launch::async, [=](){return rule_url.substr(pos);}), 0}; + rc = {rule_group, "", "", flags, RULESET_SURGE, std::async(std::launch::async, [=](){return rule_url.substr(pos);}), 0}; } else { @@ -274,7 +281,7 @@ void refreshRulesets(RulesetConfigs &ruleset_list, std::vector & type = iter->second; } writeLog(0, "Updating ruleset url '" + rule_url + "' with group '" + rule_group + "'.", LOG_LEVEL_INFO); - rc = {rule_group, rule_url, rule_url_typed, type, fetchFileAsync(rule_url, proxy, global.cacheRuleset, true, global.asyncFetchRuleset), x.Interval}; + rc = {rule_group, rule_url, rule_url_typed, flags, type, fetchFileAsync(rule_url, proxy, global.cacheRuleset, true, global.asyncFetchRuleset), x.Interval}; } ruleset_content_array.emplace_back(std::move(rc)); }