# 审计 — 3389 独立 RDP 主机（rdp_hosts）

**Changelog**: `docs/changelog/2026-06-10-rdp-hosts-standalone.md`

## 变更文件

| 文件 | 说明 |
|------|------|
| `server/domain/models/__init__.py` | `RdpHost` 模型 |
| `server/infrastructure/database/migrations.py` | `rdp_hosts` 表 |
| `server/infrastructure/database/rdp_host_repo.py` | 仓储 |
| `server/api/rdp_hosts.py` | CRUD + connect REST |
| `server/api/rdp.py` | WS `/ws/rdp/hosts/{host_id}` |
| `server/main.py` | 注册 `rdp_hosts_router` |
| `frontend/src/pages/RdpPage.vue` | 列表/添加/连接 |
| `frontend/src/components/rdp/RdpHostFormDialog.vue` | 添加/编辑对话框 |
| `frontend/src/composables/rdp/useRdpHostList.ts` | 列表与 CUD |
| `frontend/src/composables/rdp/useRdpServerList.ts` | 删除（改由 useRdpHostList） |
| `frontend/src/composables/rdp/useRdpSession.ts` | 改连 `rdp_hosts` |
| `web/app/index.html` | Vite 构建入口 hash 更新 |
| `frontend/src/components/servers/ServerFormDialog.vue` | 移除 RDP 区块 |
| `frontend/src/composables/servers/useServerFormDialog.ts` | 移除 rdp 字段 |
| `frontend/src/pages/ServersPage.vue` | 移除 RDP 跳转 |
| `tests/test_rdp_hosts.py` | 模型/端口单测 |

## 入口表

| 方法 | 路径 | 鉴权 | 说明 |
|------|------|------|------|
| GET | `/api/rdp/hosts/` | admin JWT | 列表（无密码） |
| POST | `/api/rdp/hosts/` | admin JWT + 审计 | 创建，密码 Fernet |
| PUT | `/api/rdp/hosts/{id}` | admin JWT + 审计 | 更新 |
| DELETE | `/api/rdp/hosts/{id}` | admin JWT + 审计 | 删除 |
| GET | `/api/rdp/hosts/{id}/connect` | admin JWT | 返回明文密码供 Guacamole |
| WS | `/ws/rdp/hosts/{id}?token=` | access JWT | guacd 透明桥 |

## Step 3（规则扫描）

| 规则 | 结论 | 说明 |
|------|------|------|
| 鉴权 | PASS | 全部 REST/WS 需管理员 JWT |
| IDOR | PASS（平台模型） | 与终端一致：管理员可连任意 RDP 主机 |
| 密钥落库 | PASS | `password` 列 Fernet；列表仅 `password_set` |
| 明文 connect | RISK 接受 | Guacamole 客户端必需；HTTPS |
| CUD 审计 | PASS | create/update/delete_rdp_host |
| guacd | PASS | 仍仅内网侧车 |
| 静默吞错 | PASS | API HTTPException；WS close code |

## Closure（走读）

| 文件 | 结论 |
|------|------|
| `rdp_hosts.py` | SAFE — 名称唯一 IntegrityError→409；connect 校验 guacd |
| `rdp_host_repo.py` | SAFE — 标准 CRUD |
| `rdp.py` | SAFE — host 存在性校验后桥接 |
| `RdpPage.vue` | SAFE — 无 v-html；添加后 `host_id` 连接 |
| `useRdpHostList.ts` | SAFE — formatApiError |

## DoD

- [x] changelog + 本审计
- [x] `local_verify` + type-check
- [ ] 生产部署与浏览器验收
