修复: 安全 8 项 + create_project 自动建目录

- ① relay token 必设环境变量 DF_RELAY_TOKEN,移除硬编码默认
- ② AiProviderRecord Debug 脱敏 api_key/model_configs/config
- ③ ScriptNode 危险命令告警(rm -rf/DROP TABLE/Format 等)
- ④ bind_directory 路径规范化,拒绝含 .. 的原始路径
- ⑤ StateMachine 文档警告不得在 await 期间持锁
- ⑥ EventBus send 错误改 tracing::warn 不再静默吞噬
- ⑦ probe_pwsh OnceLock 全局缓存,异步探测不阻塞 tokio
- ⑧ retry jitter 改 rand crate,范围扩大到 ±50%
- create_project 目录不存在时自动创建,消除死锁链
This commit is contained in:
2026-06-28 13:36:18 +08:00
parent f776336eb1
commit db46e74d3e
11 changed files with 110 additions and 34 deletions

View File

@@ -32,13 +32,12 @@ use crate::broadcast::{BroadcastMessage, ClientKind, MessageKind};
use crate::conn::{next_conn_id, ConnHandle, ConnId, RelayState};
use crate::error::{RelayError, Result};
/// MVP 默认 token(env `DF_RELAY_TOKEN` 缺省时回退)。
/// 读取期望 token(必需:env `DF_RELAY_TOKEN` 必须设置,未设置时 panic)。
/// 生产级鉴权(每 device 独立 token + 过期刷新)留 Phase3。
const DEFAULT_TOKEN: &str = "devflow-relay-default-token";
/// 读取期望 token(env 优先,fallback 硬编码)
fn expected_token() -> String {
std::env::var("DF_RELAY_TOKEN").unwrap_or_else(|_| DEFAULT_TOKEN.to_string())
std::env::var("DF_RELAY_TOKEN").unwrap_or_else(|_| {
panic!("必须设置环境变量 DF_RELAY_TOKEN")
})
}
/// 客户端首消息:身份宣告(简单协议)