已合并
fix(security): remove cwd model config discovery #140
写代码啥时候能换包餐巾纸啊创建于 10 天前
fix(security): remove cwd model config discovery #140
已合并
写代码啥时候能换包餐巾纸啊创建于 10 天前

删除工作目录下隐式 models.json 搜索。
显式配置路径必须是绝对路径、普通文件且不能是符号链接。
internal 84/84、API 35/35 通过。

likedislike
Pull Request已成功合入, 合并人@linhan
(感谢 写代码啥时候能换包餐巾纸啊 的贡献)
linhan
linhan成员
10 天前 评论:

✅ WatchCI · success

  • project: smartserve
  • sha: f87381e4
  • duration: 366s
  • attempts: 1
  • exit: 0
  • updated: 2026-08-18 18:59:33
  • 详情
likedislike
写代码啥时候能换包餐巾纸啊
10 天前 强制推送  1 个提交:998961ff-fix(security): remove cwd model config discovery
写代码啥时候能换包餐巾纸啊
7 天前 强制推送  35 个提交:a7f9c07c-34 commits from branch mainff378c11-fix(security): remove cwd model config discovery
hb
hb4 天前进行代码检视2
sdk/src/smartserve_api.cpp
@@ -362,1 +362,4 @@
362362 std::filesystem::path p(configPath);
363+ if (!p.is_absolute()) {
364+ return GEWU_SMARTSERVE_ERROR_INVALID_ARGUMENT;
365+ }
hb
hb4 天前评论:

smartserve_api.cpp (line 369) 直接以 std::ios::trunc 打开派生出的 models.json,会跟随符号链接。直到 smartserve_api.cpp (line 383) 才调用新增的符号链接检查

这会造成任意可写目标文件被覆盖,以及“API 返回失败但配置已经生效”的状态不一致。

SMART_SERVE_MODEL_DIR 分支的派生路径同样未做符号链接防护,风险不限于 /tmp 默认路径。

likedislike
4 天前 评论:

已修复

hb
hb4 天前进行代码检视3
services/src/server/model/model_config.h
已过期
@@ -485,2 +504,2 @@
485- return candidate;
486- }
504+ const std::filesystem::path bundledPath =
505+ std::filesystem::path(SMART_SERVE_SOURCE_DIR) / "config/model_config/models.json";
hb
hb4 天前评论:

此处将 SMART_SERVE_SOURCE_DIR/config/model_config/models.json 作为唯一默认来源,而该宏由 CMake 固化为构建时源码目录;SDK 安装规则并未安装该配置文件。
后果包括:

  • 安装或移动 SDK 后默认配置通常不存在;
  • 测试在源码树中运行,因此无法发现打包场景故障;

应改为真实安装/应用资源路径,或者非 OpenHarmony 默认返回空路径并明确要求调用方配置绝对路径。相关文档仍声称会自动发现平台路径和相对默认路径:core.h (line 435)、cross_platform_binary_build_guide.md (line 100),需要同步更新。

likedislike
System
系统消息系统
4 天前 评论:

changed this line on 7ec8b623 view diff detail

4 天前 评论:

已修复

hb
hb4 天前进行代码检视2
test/internal/model_downloader_test.cpp
@@ -698,0 +696,4 @@
696+ EXPECT_TRUE(std::filesystem::path(path).is_absolute());
697+}
698+ 
699+TEST_F(ModelConfigTest, GetModelConfigPathDoesNotDiscoverWorkingDirectoryConfig)
hb
hb4 天前评论:

GetModelConfigPathDoesNotDiscoverWorkingDirectoryConfig 修改了进程级当前目录和环境变量。如果中间的文件系统操作抛出异常,恢复代码不会执行,后续同一测试进程中的用例可能级联失败。建议复用 API 测试中的状态守卫模式。

likedislike
4 天前 评论:

已修复

hb
hb4 天前进行代码检视2
sdk/src/smartserve_api.cpp
@@ -267,0 +260,4 @@
260+ if (!OHOS::SmartServe::ResolveExplicitModelConfigPath(path, resolvedPath)) {
261+ return GEWU_SMARTSERVE_ERROR_INVALID_ARGUMENT;
262+ }
263+ if (!SetEnvIfNonEmpty("MODEL_CONFIG_PATH", resolvedPath.c_str())) {
hb
hb4 天前评论:

SetEnvModelDir() (line 294) 没有检查绝对路径,因此:

GewuSmartServeSetModelsDirectory("models")  // 返回 OK

随后 SetModelsConfigJson() (line 353) 使用模型目录的父目录生成配置路径:

path("models").parent_path() / "models.json"

结果是相对的 models.json,并在 smartserve_api.cpp (line 363) 返回 INVALID_ARGUMENT

新增测试甚至明确固化了这一行为:gewu_smartserve_api_test.cpp (line 389)

此外,公共 Gewu API 已声明 modelsDir 应是绝对路径:core.h (line 520)。因此更一致的修复是:

  • SetEnvModelDir() 直接拒绝相对路径;
  • 成功时保存规范化后的绝对路径;
  • 补充“相对模型目录被拒绝”的 API 测试。

这样既符合公开接口约定,也不会出现前一个 API 返回成功、后一个关联 API 才失败的延迟错误。

likedislike
4 天前 评论:

已修复

hb
hb4 天前进行代码检视5
services/src/server/model/model_config.h
已过期
@@ -76,6 +76,7 @@ struct ModelConfig {
7676};
7777 
7878// 前向声明:实现在文件末尾 inline 辅助函数区
79+inline bool ResolveExplicitModelConfigPath(const char* path, std::string& resolvedPath);
7980inline std::string GetModelConfigPath();
8081inline std::string GetModelDir();
8182inline void WarnBadThinkingStyleIfNeeded(const ModelConfig& config);
@@ -463,29 +464,50 @@ inline std::string ToLowerAscii(std::string value)
463464 
464465} // namespace ModelConfigDetail
465466 
467+inline bool ResolveExplicitModelConfigPath(const char* path, std::string& resolvedPath)
hb
hb4 天前评论:

ResolveExplicitModelConfigPath 将以下情况全部压缩成一个 false

  • 相对路径;
  • 文件不存在;
  • 符号链接;
  • 非普通文件;
  • canonical() 失败。

随后 GetModelConfigPath() 统一返回空串,没有保留失败原因, LoadModels() 只能输出 No trusted model config source is available; keeping the previous model state 无法判断是未配置还是显式配置错误。

建议不要简单地在 GetModelConfigPath() 每次调用时打印日志,容易重复刷屏。更合适的是:

返回结构化结果,例如路径、状态和拒绝原因;或

增加带错误原因的解析接口;

在服务初始化/重载入口记录一次明确错误,如“路径不存在”“不允许相对路径”“拒绝符号链接”。

如果担心泄露部署目录,可以只记录环境变量名称和拒绝原因,或者对路径做脱敏。

likedislike
System
系统消息系统
4 天前 评论:

changed this line on f7d69b07 view diff detail

4 天前 评论:

已修复

hb
hb
4 天前 评论:

已修复

@liupeihw

EnsureModelRegisteredLocked() (line 350) 仍调用旧的字符串包装接口,并统一输出:

No trusted model config source is available

因此,如果模型配置是在懒注册路径首次解析,而不是经过 LoadModels(),诊断信息仍然不够具体。建议复用 GetModelConfigPathResolution() 和相同的日志辅助逻辑,避免两条服务入口行为不一致。

4 天前 评论:

已完整修复

hb
hb4 天前进行代码检视2
test/internal/model_downloader_test.cpp
@@ -694,0 +722,4 @@
722+ std::filesystem::remove_all(baseDir);
723+}
724+ 
725+TEST_F(ModelConfigTest, GetModelConfigPathRejectsRelativeEnvironmentPath)
hb
hb4 天前评论:

CachedConfigJsonDoesNotReloadRelativePathFromWorkingDirectory 使用 RAII guard(推荐模式),另两个新增测试用手动恢复 env/cwd,异常路径下可能污染全局状态。建议统一为 RAII。

likedislike
4 天前 评论:

已修复

写代码啥时候能换包餐巾纸啊
4 天前 推送  1 个提交:995da738-fix(config): align trusted model path contract
写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:7ec8b623-fix(config): align trusted model path contract
写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:7ad11aa1-fix(config): align trusted model path contract
写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:d6a46e22-fix(config): align trusted model path contract
写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:f7d69b07-fix(config): align trusted model path contract
写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:d0d717a4-fix(config): align trusted model path contract
hb
hb4 天前进行代码检视2
CMakeLists.txt
@@ -216,3 +216,2 @@
216216target_compile_definitions(smartserve_core PUBLIC
217- "SMART_SERVE_CONFIG_JSON_PATH=\"${SMART_SERVE_CONFIG_JSON_ABS}\""
218- "SMART_SERVE_SOURCE_DIR=\"${CMAKE_SOURCE_DIR}\"")
217+ "SMART_SERVE_CONFIG_JSON_PATH=\"${SMART_SERVE_CONFIG_JSON_ABS}\"")
hb
hb4 天前评论:

PR 描述缺少非 OpenHarmony 平台下的模型配置迁移说明

本次变更移除了非 OpenHarmony 对源码树和当前工作目录中 models.json 的自动发现。升级后,Linux/macOS 等直接构建的 smartserve_chatbox_clismartserve_http_server 必须在运行前显式设置 MODEL_CONFIG_PATH,且路径必须是绝对、普通、非符号链接文件;否则程序无法加载任何模型。
SDK 使用者可以改为调用 GewuSmartServeSetModelsConfigPath()GewuSmartServeSetModelsConfigJson(),但直接运行二进制目前没有对应命令行参数,只能通过环境变量配置。OpenHarmony 系统服务仍保留 /data/local/tmp/models.json 默认路径。

这是用户可见的破坏性部署变更,建议在 PR 描述中明确描述变更。

likedislike
4 天前 评论:

已添加描述

写代码啥时候能换包餐巾纸啊
4 天前 强制推送  1 个提交:06e5e6a2-fix(config): align trusted model path contract
此处折叠了9条事件消息 查看更多
linhanlinhan成员
3 天前 合入了pull request,合并节点 SHA:7290fa9a14c5fcbff94f9b9c1bf38dd05d4abe3e