# 全仓库 POSIX 路径审计（Windows 误用排查）

| 项 | 内容 |
|----|------|
| 日期 | 2026-06-01 |
| 范围 | 远程 SSH/SFTP/rsync 路径；Nexus 主机 Unix 路径字符串 |
| SSOT 实现 | `server/utils/posix_paths.py` |

## 问题定义

在 **Windows 开发机** 上运行 Nexus API 时，`os.path.join("/www", "foo")` 可能得到 `\www\foo`，导致远程命令、SFTP、压缩失败。  
**规则**：凡表示 Linux 远程路径或 Nexus 生产机 Unix 路径的 **字符串拼接**，必须用 `posixpath` / `posix_paths`，禁止 `os.path` 做 join/dirname/basename。

---

## 审计结果总表

| 模块 | 文件 | 状态 | 说明 |
|------|------|------|------|
| **工具** | `server/utils/posix_paths.py` | ✅ 已建 | 规范化、join、zip-slip、upload 前缀 |
| **校验** | `server/api/remote_path_validation.py` | ✅ | 复用 posix_paths |
| **SSH 写** | `server/infrastructure/ssh/asyncssh_pool.py` | ✅ | `posix_dirname` |
| **SSH 压缩** | `server/infrastructure/ssh/remote_archive.py` | ✅ 原本正确 | 已用 `posixpath` |
| **同步 API** | `server/api/sync_v2.py` | ✅ 已修 | browse/ops/读写/chmod/压缩/上传/诊断/校验 |
| **rsync 引擎** | `server/application/services/sync_engine_v2.py` | ✅ 已修 | 远程 `target_path` 规范化 |
| **服务器** | `server/api/servers.py` | ✅ 已修 | workerman `target_dir` |
| **脚本远程日志** | `server/application/services/script_service.py` | ✅ 无问题 | 仅 `shlex.quote` + 固定 `/var/log/...` |
| **前端文件** | `frontend/src/utils/remotePath.ts` | ✅ | `/` 拼接 + `\`→`/` |
| **前端页面** | `FilesPage.vue`, `FileDirectoryTree.vue`, `filePreload.ts` | ✅ | 均用 `joinRemotePath` |
| **安装** | `server/api/install.py` | ➖ 不适用 | `Path("/www/...")` 在 Linux 安装目标机执行 |
| **本机仓库** | `main.py`, `auth_jwt.py`, `settings.py` | ➖ 不适用 | `Path(__file__)` 为 Nexus 代码目录 |
| **MCP/部署** | `mcp/Nexus_server.py`, `deploy/gate_log.py` | ➖ 不适用 | 部署机本地路径 |
| **文档/审计** | `docs/build_html.py`, `audit_scan.py` | ➖ 不适用 | 仓库内 Windows/Linux 本地扫描 |
| **测试** | `tests/test_api.py` 等 | ➖ 不适用 | 测试文件定位 `.env` |

---

## 已修复端点清单（sync_v2）

| 端点 | 修复内容 |
|------|----------|
| `POST /browse` | `normalize_remote_abs_path` |
| `POST /file-ops` | path / new_path 规范化 |
| `POST /file-clipboard` | 已有 `assert_clipboard_transfer_safe` |
| `POST /browse-local` 等 | `ensure_under_nexus_upload` + `posix_join` |
| `POST /validate-source-path` | `resolve_nexus_host_path` + `posix_join` walk |
| `POST /diagnose` | `normalize_remote_dest` + `remote_join` 测试文件 |
| `POST /file-diff` | upload 前缀 + `remote_join` 远程路径 |
| `POST /upload` | `remote_join` |
| `POST /upload-zip` | `assert_zip_member_safe` + `posixpath.relpath` |
| `POST /verify` | 远程 `dest` 规范化 |
| `POST /download` `read-file` `write-file` | 远程 path 规范化 |
| `POST /chmod` `compress` `decompress` | 远程 path 规范化 |

---

## 仍使用 `os.path` 的合法位置

| 位置 | 原因 |
|------|------|
| `posix_paths.resolve_nexus_host_path` | 真实访问 Nexus 主机文件系统 |
| `sync_v2` 中 `os.path.isdir/exists/walk` | 同上（生产为 Linux） |
| `sync_engine_v2` `os.path.isdir(source_path)` | Nexus 本机推送源目录 |
| `mcp/`, `tests/`, `deploy/` | 工具链本地路径，非远程 |

---

## 测试

```bash
pytest tests/test_posix_paths.py tests/test_remote_path_validation.py -q
ruff check server/utils/posix_paths.py server/api/sync_v2.py server/application/services/sync_engine_v2.py
```

---

## DoD

- [x] 全 `server/**/*.py` 检索 `os.path.(join|dirname|basename|normpath|realpath)`
- [x] 远程相关调用点已归类并修复或标注豁免
- [x] 前端远程路径统一 `remotePath.ts`
- [x] 单元测试覆盖反斜杠拒绝与 join
- [ ] 生产部署后文件管理器在 Windows 开发 + Linux 目标机上回归（人工）
