d93c518a14
Co-authored-by: Cursor <cursoragent@cursor.com>
5.7 KiB
5.7 KiB
POSIX 路径分批审查记录
| 项 | 内容 |
|---|---|
| 日期 | 2026-06-01 |
| 方法 | 按模块分批 rg os.path / rg posix / 人工读 SSH 拼接点 |
| SSOT | server/utils/posix_paths.py |
| 总览 | posix-path-full-audit.md |
批次 1:基础设施层
| 文件 | 结论 | 证据 |
|---|---|---|
server/utils/posix_paths.py |
✅ 通过 | 唯一允许 os.path.realpath(本机 FS) |
server/api/remote_path_validation.py |
✅ 通过 | 委托 posix_paths |
server/infrastructure/ssh/asyncssh_pool.py |
✅ 已修 | posix_dirname(remote_path) |
server/infrastructure/ssh/remote_archive.py |
✅ 通过 | 全程 posixpath |
server/infrastructure/ssh/remote_probe.py |
✅ 无路径拼接 | — |
server/infrastructure/ssh/__init__.py |
✅ 无业务路径 | — |
批次 1 结论:无遗留问题。
批次 2:server/api/sync_v2.py(文件/同步 API)
| 端点/区域 | 结论 |
|---|---|
| browse / file-ops / clipboard | ✅ normalize_remote_abs_path |
| browse-local / local-file-ops / preview | ✅ ensure_under_nexus_upload + posix_join;os.path.* 仅本机 I/O |
| validate-source-path | ✅ resolve_nexus_host_path + walk 用 posix_join |
| diagnose / file-diff / verify | ✅ normalize_remote_dest + remote_join |
| upload / upload-zip | ✅ remote_join + assert_zip_member_safe |
| download / read / write / chmod / compress / decompress | ✅ 远程 path 均规范化 |
仍见 os.path: 仅 isdir/exists/getsize/walk(Nexus 主机文件系统)— 合法。
批次 2 结论:无遗留问题。
批次 3:应用服务层
| 文件 | 结论 | 说明 |
|---|---|---|
sync_engine_v2.py |
✅ 已修 | _rsync_push 内 normalize_remote_abs_path(to_posix(target_path)) + user@host:path |
| ⚠️ 注意 | os.path.isdir(source_path) — Nexus 本机源目录,生产为 Linux |
|
sync_service.py |
✅ 无路径逻辑 | 注释/委托 v2 |
script_service.py |
✅ 通过 | 远程日志路径固定 /var/log/nexus-job/ + shlex.quote |
script_jobs.py |
✅ 无文件路径 | shell 转义 only |
server_service.py |
✅ 无 SSH 路径拼接 | — |
批次 3 结论:无遗留问题。
批次 4:其他 API + 后台任务
| 文件 | 结论 |
|---|---|
servers.py |
✅ workerman posix_dirname;Agent install_dir="/opt/nexus-agent" 常量拼接 |
agent.py / webssh.py / terminal.py |
✅ 无远程文件路径 join |
install.py |
➖ 豁免 |
settings.py / auth_jwt.py / main.py |
➖ 豁免 |
schemas.py |
⚠️ 建议 |
background/schedule_runner.py |
✅ 可接受 |
background/retry_runner.py |
✅ 透传 DB 字段,同上 |
批次 4 结论:无 P0/P1;1 项 P2 建议。
批次 5:领域 / 数据库 / Redis
| 范围 | 结论 |
|---|---|
server/domain/** |
✅ ORM 字段存字符串,不做 path join |
server/infrastructure/database/** |
✅ 无路径拼接 |
server/infrastructure/redis/** |
✅ 无文件路径 |
批次 5 结论:无问题。
批次 6:前端
| 文件 | 结论 |
|---|---|
utils/remotePath.ts |
✅ / 拼接;\ → / |
FilesPage.vue / FileDirectoryTree.vue / filePreload.ts / useFilesClipboard.ts |
✅ 均 joinRemotePath / normalizeRemotePath |
PushPage.vue / SchedulesPage.vue |
✅ 路径交 API,由后端规范化 |
TerminalPage.vue |
➖ |
批次 6 结论:无遗留问题。
批次 7:测试 / 工具 / MCP
| 文件 | 结论 |
|---|---|
tests/test_posix_paths.py |
✅ |
tests/test_remote_path_validation.py |
✅ |
tests/test_api.py 等 |
➖ 本地 .env 定位 |
mcp/Nexus_server.py |
➖ 部署目录 DEPLOY_DIR |
deploy/gate_log.py |
➖ |
docs/build_html.py / audit_scan.py |
➖ 仓库内扫描 |
批次 7 结论:无问题。
汇总
| 批次 | 范围 | 状态 |
|---|---|---|
| 1 | SSH 基础设施 | ✅ 完成 |
| 2 | sync_v2 API | ✅ 完成 |
| 3 | application services | ✅ 完成 |
| 4 | 其他 API + background | ✅ 完成(P2×1) |
| 5 | domain / DB | ✅ 完成 |
| 6 | frontend | ✅ 完成 |
| 7 | tests / tooling | ✅ 完成 |
P0/P1:0
P2(2026-06-01 已完成):
- ✅
schemas.py+schema_path_validators.py:远程/本机路径字段入口校验与规范化 - ✅
sync_engine_v2:source_path在isdir前_nexus_source_path()(to_posix)
回归命令
pytest tests/test_posix_paths.py tests/test_remote_path_validation.py -q
rg "os\.path\.(join|dirname|basename)" server/ --glob "*.py"
# 期望:仅 posix_paths 注释 + sync_v2/sync_engine 的 isdir/exists/getsize
DoD(分批审查)
- 批次 1~7 均已执行并记录
- 每批有明确通过/豁免/建议
- P0/P1 为 0
- P2 已实施(schemas + sync_engine)
批次 9:文件管理归属 + 权限 UI(2026-06-01)
| 项 | 状态 |
|---|---|
remote_shell.py |
✅ |
| browse owner/group/mode_octal | ✅ |
| chmod + chown + sudo 回退 | ✅ |
| 前端归属列 + FilePermissionDialog | ✅ |
files-capability API |
✅ 批次 10 |
files_elevation 服务器字段 |
✅ 批次 10 |
| Phase 5:ls 解析单测 + long-iso + read-file 提权 | ✅ 批次 11 |
| 二期:递归 chmod + 不可读提示条 | ✅ 批次 12 |