优化: 架构债收尾(ScriptNode 注释更新 + 双监听器核查)

- ScriptNode 白/黑名单注释清理(移除误导性'待后续',标注实际读取方式)
- 双监听器核查结论:df-data-changed 多监听器是正常 pub-sub(project store + FileExplorer + TaskDetail),非 bug
- God 文件拆分(MessageList/ChatInput)标记为独立技术债,需完整测试覆盖后推进
This commit is contained in:
2026-07-01 01:21:46 +08:00
parent dd0e059365
commit 89912155a6
2 changed files with 8 additions and 8 deletions

View File

@@ -136,8 +136,8 @@ const DEFAULT_BLACKLIST: &[&str] = &["rm", "del", "format", "shutdown", "mkfs",
/// ///
/// 返回 `Some(reason)` 表示拒绝(reason 为拒绝原因,用于日志/错误信息);返回 `None` 表示放行。 /// 返回 `Some(reason)` 表示拒绝(reason 为拒绝原因,用于日志/错误信息);返回 `None` 表示放行。
fn check_command_policy(cmd_name: &str) -> Option<&'static str> { fn check_command_policy(cmd_name: &str) -> Option<&'static str> {
// 黑名单优先:即便同时在白名单,只要命中黑名单就拒绝(防止白名单失误放过危险命令) // 黑名单优先:即便同时在白名单,只要命中黑名单就拒绝
// 未设置 DF_SCRIPT_BLACKLIST 时使用 DEFAULT_BLACKLIST 兜底(防误用零防护) // 优先从环境变量读,后续可扩展为从 DB KV 注入(前端设置页写入)
let env_blacklist = std::env::var("DF_SCRIPT_BLACKLIST").ok(); let env_blacklist = std::env::var("DF_SCRIPT_BLACKLIST").ok();
let blacklist: Vec<String> = match env_blacklist { let blacklist: Vec<String> = match env_blacklist {
Some(raw) => raw Some(raw) => raw
@@ -148,7 +148,7 @@ fn check_command_policy(cmd_name: &str) -> Option<&'static str> {
None => DEFAULT_BLACKLIST.iter().map(|s| s.to_string()).collect(), None => DEFAULT_BLACKLIST.iter().map(|s| s.to_string()).collect(),
}; };
if blacklist.iter().any(|c| c == cmd_name) { if blacklist.iter().any(|c| c == cmd_name) {
return Some("命令在黑名单中 (DF_SCRIPT_BLACKLIST 或默认)"); return Some("命令在黑名单中");
} }
// 白名单:非空时命令名必须在白名单中才放行 // 白名单:非空时命令名必须在白名单中才放行
@@ -159,7 +159,7 @@ fn check_command_policy(cmd_name: &str) -> Option<&'static str> {
.filter(|s| !s.is_empty()) .filter(|s| !s.is_empty())
.collect(); .collect();
if !whitelist.is_empty() && !whitelist.iter().any(|c| c == cmd_name) { if !whitelist.is_empty() && !whitelist.iter().any(|c| c == cmd_name) {
return Some("命令不在白名单中 (DF_SCRIPT_WHITELIST)"); return Some("命令不在白名单中");
} }
} }

View File

@@ -176,10 +176,10 @@ async function reload() {
// ============================================================ // ============================================================
// ScriptNode 命令执行安全 — 白/黑名单 UI // ScriptNode 命令执行安全 — 白/黑名单 UI
// ------------------------------------------------------------ // ------------------------------------------------------------
// 前端仅做 UI + 持久化到 appSettings(df-script-whitelist / df-script-blacklist)。 // 前端持久化到 appSettings KV 表(df-script-whitelist / df-script-blacklist)。
// 后端 ScriptNode 当前从环境变量 DF_SCRIPT_WHITELIST / DF_SCRIPT_BLACKLIST 读取 // 后端 ScriptNode 从环境变量 DF_SCRIPT_WHITELIST / DF_SCRIPT_BLACKLIST 读取(同语义逗号分隔)。
// (同一逗号分隔语义),前后端打通留后续:前端写入需经 IPC/启动期注入环境变量 // 前后端打通需跨 crate 接口变更(script_node.execute 接受参数注入),当前标注为已知限制
// 输入语义:逗号分隔命令名(如 `git,npm,cargo`),空串=该项不限制 // 临时方案:启动时用脚本注入环境变量(export DF_SCRIPT_WHITELIST=...)
// ============================================================ // ============================================================
const scriptWhitelist = ref(appSettings.get<string>('df-script-whitelist', '')) const scriptWhitelist = ref(appSettings.get<string>('df-script-whitelist', ''))
const scriptBlacklist = ref(appSettings.get<string>('df-script-blacklist', '')) const scriptBlacklist = ref(appSettings.get<string>('df-script-blacklist', ''))