feat: support to disable clash fields filter

This commit is contained in:
GyDi 2023-02-16 23:52:55 +08:00
parent c9b7eccbc1
commit 027295d995
No known key found for this signature in database
GPG Key ID: 9C3AD40F1F99880A
4 changed files with 22 additions and 13 deletions

View File

@ -66,6 +66,9 @@ pub struct IVerge {
/// 默认的延迟测试连接
pub default_latency_test: Option<String>,
/// 支持关闭字段过滤避免meta的新字段都被过滤掉默认为真
pub enable_clash_fields: Option<bool>,
/// 是否使用内部的脚本支持,默认为真
pub enable_builtin_enhanced: Option<bool>,
@ -120,6 +123,7 @@ impl IVerge {
proxy_guard_duration: Some(30),
auto_close_connection: Some(true),
enable_builtin_enhanced: Some(true),
enable_clash_fields: Some(true),
..Self::default()
}
}
@ -163,6 +167,7 @@ impl IVerge {
patch!(default_latency_test);
patch!(enable_builtin_enhanced);
patch!(proxy_layout_column);
patch!(enable_clash_fields);
}
/// 在初始化前尝试拿到单例端口的值

View File

@ -68,7 +68,11 @@ pub fn use_valid_fields(mut valid: Vec<String>) -> Vec<String> {
.collect()
}
pub fn use_filter(config: Mapping, filter: &Vec<String>) -> Mapping {
pub fn use_filter(config: Mapping, filter: &Vec<String>, enable: bool) -> Mapping {
if !enable {
return config;
}
let mut ret = Mapping::new();
for (key, value) in config.into_iter() {

View File

@ -1,7 +1,6 @@
use super::{use_filter, use_lowercase};
use serde_yaml::{self, Mapping, Sequence, Value};
#[allow(unused)]
const MERGE_FIELDS: [&str; 6] = [
"prepend-rules",
"append-rules",
@ -20,7 +19,7 @@ pub fn use_merge(merge: Mapping, mut config: Mapping) -> Mapping {
});
let merge_list = MERGE_FIELDS.iter().map(|s| s.to_string());
let merge = use_filter(merge, &merge_list.collect());
let merge = use_filter(merge, &merge_list.collect(), true);
["rules", "proxies", "proxy-groups"]
.iter()

View File

@ -23,13 +23,14 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
// config.yaml 的配置
let clash_config = { Config::clash().latest().0.clone() };
let (clash_core, tun_mode, enable_builtin) = {
let (clash_core, enable_tun, enable_builtin, enable_filter) = {
let verge = Config::verge();
let verge = verge.latest();
(
verge.clash_core.clone(),
verge.enable_tun_mode.clone(),
verge.enable_builtin_enhanced.clone(),
verge.enable_tun_mode.clone().unwrap_or(false),
verge.enable_builtin_enhanced.clone().unwrap_or(true),
verge.enable_clash_fields.clone().unwrap_or(true),
)
};
@ -58,14 +59,14 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
let mut exists_keys = use_keys(&config); // 保存出现过的keys
let valid = use_valid_fields(valid);
config = use_filter(config, &valid);
config = use_filter(config, &valid, enable_filter);
// 处理用户的profile
chain.into_iter().for_each(|item| match item.data {
ChainType::Merge(merge) => {
exists_keys.extend(use_keys(&merge));
config = use_merge(merge, config.to_owned());
config = use_filter(config.to_owned(), &valid);
config = use_filter(config.to_owned(), &valid, enable_filter);
}
ChainType::Script(script) => {
let mut logs = vec![];
@ -73,7 +74,7 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
match use_script(script, config.to_owned()) {
Ok((res_config, res_logs)) => {
exists_keys.extend(use_keys(&res_config));
config = use_filter(res_config, &valid);
config = use_filter(res_config, &valid, enable_filter);
logs.extend(res_logs);
}
Err(err) => logs.push(("exception".into(), err.to_string())),
@ -91,7 +92,7 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
let clash_fields = use_clash_fields();
// 内建脚本最后跑
if enable_builtin.unwrap_or(true) {
if enable_builtin {
ChainItem::builtin()
.into_iter()
.filter(|(s, _)| s.is_support(clash_core.as_ref()))
@ -102,7 +103,7 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
match item.data {
ChainType::Script(script) => match use_script(script, config.to_owned()) {
Ok((res_config, _)) => {
config = use_filter(res_config, &clash_fields);
config = use_filter(res_config, &clash_fields, enable_filter);
}
Err(err) => {
log::error!(target: "app", "builtin script error `{err}`");
@ -113,8 +114,8 @@ pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
});
}
config = use_filter(config, &clash_fields);
config = use_tun(config, tun_mode.unwrap_or(false));
config = use_filter(config, &clash_fields, enable_filter);
config = use_tun(config, enable_tun);
config = use_sort(config);
let mut exists_set = HashSet::new();