diff --git a/vnt-web/src/service_http.rs b/vnt-web/src/service_http.rs index e898815..f4dc523 100644 --- a/vnt-web/src/service_http.rs +++ b/vnt-web/src/service_http.rs @@ -671,6 +671,16 @@ fn is_valid_file_name(file_name: &str) -> bool { && !file_name.contains('\\') } +/// 规范化配置文件名:无扩展名时补 .toml;扩展名不是 .toml 则拒绝。 +/// list_configs 只列出 *.toml,不强制后缀会保存出列表中不可见的文件 +fn normalize_config_file_name(file_name: String) -> Result { + match Path::new(&file_name).extension() { + None => Ok(format!("{file_name}.toml")), + Some(ext) if ext == "toml" => Ok(file_name), + Some(_) => Err("Config file name must end with .toml"), + } +} + async fn start_vnt_handler( State(state): State, Json(req): Json, @@ -864,6 +874,11 @@ async fn save_config(Json(req): Json) -> Json> { return Json(ApiResponse::error("Invalid file name")); } + let file_name = match normalize_config_file_name(file_name) { + Ok(name) => name, + Err(msg) => return Json(ApiResponse::error(msg)), + }; + let target_path = Path::new(CONFIG_DIR).join(&file_name); match fs::write(&target_path, &req.config).await { @@ -1160,6 +1175,23 @@ async fn get_routes(State(state): State) -> Json