优化: 架构债收尾(ScriptNode 注释更新 + 双监听器核查)
- ScriptNode 白/黑名单注释清理(移除误导性'待后续',标注实际读取方式) - 双监听器核查结论:df-data-changed 多监听器是正常 pub-sub(project store + FileExplorer + TaskDetail),非 bug - God 文件拆分(MessageList/ChatInput)标记为独立技术债,需完整测试覆盖后推进
This commit is contained in:
@@ -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("命令不在白名单中");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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', ''))
|
||||||
|
|||||||
Reference in New Issue
Block a user