11 Commits
Author SHA1 Message Date
TanXinandTanXin 1ce345d61b release: 发布 v2.0.0 Gem-Alpha 架构解耦与交互体验升级版本 (#123)
## 本次版本更新内容(v2.0.0 — Gem-Alpha 重大里程碑版本)

本次发布为 CloudSSH **v2.0.0** 重大版本更新(代号
**Gem-Alpha**),包含后端与前端大文件深层次架构解耦瘦身、核心交互体验升级、SFTP
路径面包屑与三向排列表头、命令片段动态占位符与模糊搜索、多标签页内联重命名与上下文操作、以及 AI Agent 助手响应式窗口与移动端深度适配。

---

### 一、核心更新要点

#### 1. 架构深度解耦瘦身与代码健康治理
- **分享审计持久化管道解耦(`src/worker/share-audit-writer.ts`)**:抽离
`ShareAuditWriter`,统一封装审计记录排空、防抖刷新与排他写入锁;
- **RFC 4256 交互式键盘认证状态机解耦(`src/worker/ssh-interactive-auth.ts`)**:抽离
`KeyboardInteractiveAuthHandler`,独立管理多轮挑战 ID、超时看门狗及响应组包;
- **弱网断线保持与重连缓冲解耦(`src/worker/ssh-detached-buffer.ts`)**:抽离
`DetachedSessionBuffer`,独立负责 128KB 有界环形缓冲队列与重连补偿逻辑;
- **远端操作系统探测执行器解耦(`src/worker/os-detect.ts`)**:抽离
`detectAndPersistRemoteOS`,封装探测执行、解析与 UserDB 持久化;
- **SFTP 前端大文件解耦**:
- 抽离
`SFTPEditorCoordinator`(`frontend/src/sftp-editor-session.ts`):独立管理编辑器挂载、编码探测、冲突检测与覆盖保存;
  - 抽离 `sftp-dialogs.ts`:管理文件/目录创建、重命名与删除交互对话框及路径合法性校验;
  - 抽离 `sftp-helpers.ts` 与 `sftp-transfer.ts`:封装面包屑解析、多维排序算法与异步传输状态模型;
- **代码健康规范治理**:全局显式补充 `parseInt` 10 进制基数,清理冗余构造函数与导入,收敛严格类型断言与类型告警。

#### 2. SFTP 与核心交互体验优化
- **SFTP
路径面包屑与可排列表头**:支持可点击直达的面包屑导航,保留文本框快速跳转与失焦自动恢复;表头支持文件名、大小、修改时间三向排序,目录智能置顶;
- **SFTP 工具栏新建文件**:点击工具栏「新建文件」按钮弹出命名弹窗,通过 0 字节探测上传后无缝调起在线编辑器;
- **命令片段模糊搜索与一键复制**:片段库新增实时搜索过滤,支持名称与命令模糊匹配;列表项增加一键复制到剪贴板按钮;
- **终端快捷键增强**:macOS 新增 `Cmd+F` 调出搜索栏,`Cmd+K` / `Ctrl+Shift+K`
清除终端屏幕缓冲区(`terminal.clear()`),并完好保留 Linux/Bash 默认的 `Ctrl+K` 剪切行尾逻辑。

#### 3. 易用性增强与多标签/Agent 体验
- **服务器卡片一键克隆**:提供一键克隆操作,完整复用主机、端口、用户名、跳板机关系与标签,安全清空敏感凭据,自动附加 `(Copy)`
后缀;
- **片段动态参数占位符**:支持 `{{variable}}` 语法,插入或执行前自动解析变量并弹出输入弹窗,支持默认值与输入记忆;
- **多标签页双击内联重命名与上下文菜单**:双击标签页标题直接进行内联编辑(`Enter` 保存,`Esc`
取消,空值/纯空白自动恢复原名);右键标签弹出操作菜单(重命名、克隆会话、关闭其他、关闭当前);
- **AI Agent 助手体验全面升级**:
- **动态 Clamp 响应式窗口**:参考 SFTP 采用 `min(clamp(420px, 40vw, 600px), 100%)`
弹性自适应宽度,顶栏对齐 `h-12` 规范并内联 `smart_toy` 助手图标;
- **桌面端严格限制在终端区域**:分栏高度严格限制在 `#terminal-area`
内部,绝不遮挡顶部状态栏右上方的双端延迟展示(`#term-info`)与连接状态;
- **移动端全屏覆盖与软键盘联动**:移动端保持全屏覆盖(`position: fixed; top:
48px;`)保证小屏下充裕的对话阅读空间;打开 Agent
时联动隐藏底部软键盘终端快捷工具栏,彻底解决输入框和发送按钮被遮挡问题;退出返回终端后自动恢复工具栏;
- **诊断 Prompt 预设与触控热区强化**:提供 4 组一键场景诊断 Prompt 胶囊(分析报错、系统负载、端口网络、Docker
状态),移动端全面优化 Prompt
胶囊(`32px`)、发送按钮(`40px`)、代码块操作(`30px`)和高危命令确认弹窗按钮触控热区;支持按 `Esc` 快速退出
Agent 返回终端。

---

### 二、提交列表

- `70042c2` feat: 提交 Gem-Alpha 版本(SFTP增强/片段占位符/标签菜单/大文件解耦瘦身) (#120)
- `78dca39` feat: Gem-Alpha 增量迭代(AI Agent 窗口响应式与移动端优化 / 标签重命名缺陷修复 /
文档同步) (#122)
- `0b04480` fix: 恢复移动端 AI Agent 全屏覆盖布局以保障小屏交互空间
- `0c19ac2` fix: 移动端打开 AI Agent 时自动隐藏底部终端快捷键工具栏
- `50171c7` release: 发布 v2.0.0 Gem-Alpha 架构解耦与交互体验升级版本

---

### 三、关联 Issue / PR

- 关联 PR:#120, #122

---

### 四、验证结果

- ✅ `pnpm run typecheck`:通过(Worker + Frontend 0 错误)
- ✅ `pnpm test`:通过(66 个测试文件,755 项测试全数通过)
- ✅ `pnpm run build:frontend`:通过(单 bundle 确定性构建并内联至
`src/worker/html.ts`)
- ✅ `pnpm run test:e2e`:通过(75 项 Playwright 端到端及 axe 无障碍测试全部通过,1
项按平台条件跳过)
- ✅ `pnpm run verify`:完整本地质量门禁验证全绿通过

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-09-04 14:14:08 +08:00
b61f16524d release: 发布 v1.13.1 跳板连接修复与私钥格式支持版本 (#110)
## 发布说明

**v1.13.1 跳板连接修复与私钥格式支持版本**

### 版本要点

- 修复 v1.11.0 起跳板机连接必现失败的问题:恢复跳板循环中的 `await
hopSession.waitUntilAuthenticated()`,跳板会话需完成认证进入 `tunnel-ready` 后才可开
direct-tcpip 通道;补充跳板会话就绪时序回归测试,锁定 SSHSession 与 DO 跳板循环时序契约,防止同类回归漏过 CI
- 支持直接粘贴 PKCS#1/PKCS#8/SEC1 封装的 PEM 私钥(RSA/EC/Ed25519):新增最小 DER/ASN.1
读取器(`src/ssh/der.ts`)与 PKCS 解析器(`src/ssh/pkcs.ts`),兼容 macOS `ssh-keygen
-m PEM` 显式曲线参数与 Ed25519 PKCS#8 嵌套 OCTET STRING(RFC 8410),误贴公钥/证书/PPK
给出指向性提示
- 更新贡献者名单

### 提交列表

| 提交 | 说明 |
| ---- | ---- |
| 66480c5 | feat: 支持直接粘贴 PKCS#1/PKCS#8/SEC1 格式私钥 |
| 77e87e2 | fix: 修复 v1.11.0 起跳板机连接必现失败的问题(恢复等待跳板认证完成) |
| bb16371 | test: 补充跳板会话就绪时序回归测试 |
| f7a0554 | docs: 更新贡献者名单(补充 @xuthuslei 跳板认证时序修复贡献) |
| c207aa8 | release: 发布 v1.13.1(版本号 + CHANGELOG) |

### 关联 Issue / PR

- Fixes #108(跳板机连接必现失败)
- Refs PR #109(作者 @xuthuslei,保留原始署名)

### 验证结果

- typecheck(worker + frontend + tests 三工程)通过
- vitest 56 文件 / 668 用例通过(含新增跳板就绪时序与私钥格式回归测试)

---------

Co-authored-by: TanXin <tanxin@example.com>
Co-authored-by: Leon Xu <learxu@gmail.com>
2026-08-28 22:19:13 +08:00
TanXinandTanXin 4eeb050576 release: 发布 v1.10.0 自定义命令片段库版本 (#93)
合并 `test` 的 v1.10.0 提交到 `main`。

**包含提交**
- `28c9433` feat: 添加自定义命令片段库
- `9aa2e80` release: 发布 v1.10.0 自定义命令片段库版本

**关联**
- Related to #90

> 本 PR 仅关联 #90,不自动关闭该 Issue。

**验证**
- `pnpm run typecheck` 0 错
- `pnpm test` 47/47 603/603 通过
- `pnpm run build:frontend` 成功

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-08-20 11:42:28 +08:00
TanXinandTanXin 6ae1922b5c release: 发布 v1.8.0 SSH 跳板连接版本 (#80)
## 发布说明

发布 CloudSSH v1.8.0,将 `test` 分支中已经完成线上测试的功能合并到 `main`。

关联 issue:#72。本 PR 不使用自动关闭关键字,待用户后续反馈确认后再决定 issue 状态。

## 主要更新

### 多级 SSH 跳板连接

- 登录用户可以为已保存服务器选择跳板服务器,通过标准 RFC 4254 `direct-tcpip` 通道逐层建立嵌套 SSH。
- 支持最多 3 台跳板服务器;中间节点仅执行 SSH 认证和 TCP 转发,最终目标统一承载终端、SFTP、AI Agent exec
和操作系统识别。
- 后端解析不可变的外层入口到最终目标连接链,拒绝匿名注入、跨用户引用、自引用、循环和超深链路。
- 每一跳独立认证和验证路径级主机指纹,避免不同内网中相同地址的 known-host 记录冲突。
- Durable Object 区域调度和公网地址检查以 Cloudflare 直接连接的最外层入口为准。
- 前端支持配置跳板服务器、过滤非法候选项并展示多级连接路径。

### 移动端连接恢复优化

- 手机和平板从后台返回后继续执行带随机 ID 的有界 WebSocket 心跳,失活连接沿用既有安全重连流程。
- 后台恢复监听仅在设备具备触点且主指针为粗粒度时启用。
- 修复普通 PC 切换浏览器标签页时误输出恢复提示并发送不必要探测的问题。

### 版本与文档

- `package.json` 版本更新为 `1.8.0`。
- `CHANGELOG.md` 按 Keep a Changelog 补充 v1.8.0 发布记录。
- 中英文 README 已补充 SSH 跳板机的配置方式、安全边界和使用限制。

## 包含的变更

- #78:支持多级 SSH 跳板连接
- #79:限制移动端后台恢复检查
- `2d336d0`:发布 v1.8.0 SSH 跳板连接版本

## 验证结果

已完成 test 环境实际 SSH 跳板连接测试,并执行完整质量门禁:

```bash
pnpm run verify
```

结果:

- Worker 与前端 TypeScript 类型检查通过。
- 39 个测试文件、559 项单元及集成测试通过。
- 前端生产构建和资源内联通过。
- 47 项 Chromium/WebKit E2E 测试通过,1 项跨项目预期跳过。
- `git diff --check` 通过。

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-08-13 11:25:50 +08:00
TanXinandTanXin 4884b4b0a5 release: 发布 v1.7.2 Serv00 认证兼容版本 (#76)
## 发布概述

发布 CloudSSH v1.7.2,完善 Serv00 等仅通过 `keyboard-interactive` 暴露密码验证的 SSH
服务兼容性,并补强浏览器挑战确认、认证超时和跨浏览器回归覆盖。

## 主要变化

- 用户认证前发送 RFC 4252 `none` 探测,根据服务端实际声明的方法选择普通密码、公钥或
`keyboard-interactive`。
- 对认证失败响应未携带方法列表的非标准服务端保留有界兼容回退。
- 交互式挑战增加浏览器展示确认:先等待弹窗显示确认,再开始计算用户响应时间。
- 区分浏览器未展示挑战与用户已看到但未响应两类超时,认证超时使用正常关闭,避免旧版前端反复重连并触发服务商侧限制。
- 修复认证控制消息处理异常被误当作终端文本,以及无效挑战未可靠取消的问题。
- 新增 Chromium 与移动 WebKit 认证回归测试,并将 WebKit 纳入部署质量门禁。

## 版本与文档

- `package.json` 版本更新为 `1.7.2`。
- `CHANGELOG.md` 新增 `1.7.2` 发布记录(2026-08-12)。
- README 中英文更新日志入口保持有效。

## 验证

- Worker 与前端 TypeScript 类型检查通过
- 36 个测试文件、552 项单元与集成测试通过
- 38 项 Chromium/WebKit E2E 与无障碍测试通过
- 生产前端构建与 Worker 内嵌生成通过
- `git diff --check` 通过
- test 分支发布提交 `1708f18` 的 GitHub Actions 检查通过

## Issue 关联

关联 #67。本版本包含针对现有反馈的兼容性完善,但该 Issue 保持开放,等待用户在真实 Serv00
环境中升级验证并反馈后,再决定是否关闭。

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-08-12 11:32:45 +08:00
TanXinandTanXin 617b06353b release: v1.6.3 — 支持交互式认证并修复回退兼容性 (#69)
## 发布概述

发布 CloudSSH v1.6.3,新增 RFC 4256 keyboard-interactive
交互式认证,并修复普通认证被错误回退到交互式认证的问题。

## 主要变化

- 支持单轮、多轮、零提示和多提示的 keyboard-interactive 挑战。
- 支持基于 partial_success 的有界多因素认证流程。
- 新增独立认证弹窗,challenge ID 与来源 WebSocket 绑定。
- 支持超时、取消及用户明确选择后使用已保存密码。
- 仅当主认证方式不再可用或上一因子部分成功时进入交互式认证。
- 普通服务端凭据拒绝不再以 WebSocket 1011 表示内部错误。
- 修复 Alpine 等服务器上普通认证失败被误判为交互式认证失败的问题。

## 兼容性与影响

- 普通密码和密钥认证仍保持优先。
- 不增加额外重试机制。
- 协议格式错误、状态异常、超时和超限保护保持不变。

## 验证

- pnpm run verify
- Worker 与前端类型检查通过
- 36 个测试文件、527 项单元与集成测试通过
- 生产前端构建通过
- 31 项 Chromium E2E 与无障碍回归测试通过

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-08-09 12:38:21 +08:00
86a415a4c6 release: v1.3.3 — 完善终端复制兼容性与贡献者说明 (#49)
## 版本概览

发布 CloudSSH v1.3.3,重点完善 Windows/Linux 浏览器环境下的终端文本复制体验,并补充项目贡献者说明。

## 主要变更

- 鼠标正常结束终端文本选区时自动复制到系统剪贴板,并提供中英文反馈
- Clipboard API 不可用或被拒绝时回退到 `document.execCommand('copy')`
- 终端选区与 Agent 代码块复制统一复用公共剪贴板模块
- 修复回退复制后终端焦点丢失、复制失败误报成功、`pointercancel` 意外触发复制的问题
- 新增剪贴板单元测试及 Chromium 自动复制、回退和焦点恢复回归
- 中英文 README 新增贡献者名单和完整贡献记录入口
- 更新版本号和 CHANGELOG 至 v1.3.3

## 验证

- Worker 与前端 TypeScript 类型检查通过
- Vitest:27 个测试文件、424 项测试通过
- 生产前端构建与内联产物生成通过
- Playwright:6 项 Chromium E2E/无障碍测试通过

---------

Co-authored-by: vonl1 <911959129@qq.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: TanXin <tanxin@example.com>
2026-07-29 11:47:14 +08:00
TanXinandTanXin 224f69a29f release: v1.0.9 — 安全审计漏洞修复与 SSRF 防护加固 (#37)
## Summary
安全审计漏洞批量修复,新增 DNS rebinding 防护层,修复 9 个安全问题。
## 修复详情
### SSRF 防护加固(VULN-01/02)
- 新增 `dns-check.ts` 模块,通过 Cloudflare DoH 解析域名后校验真实 IP
- 防止域名解析到内网地址绕过 `isBlockedHost`/`validateBaseUrl` 字符串校验
- SSH 连接和 AI API 调用入口均增加 DNS 解析二次校验
### SSH 协议修复
- 修复 RSA/ECDSA 公钥认证协议不合规问题
### Agent 工具安全加固(VULN-05/06)
- `service_manage`/`docker_manage` 添加 action 白名单校验,非标准操作需用户确认
- `isBlockedCommand` 增加 shell 替换检测,拦截 `rm -rf` 中的 `$()`/`${}`/`` ` `` 模式
### 输入校验与信息泄露修复(LOW-04/05)
- UserDB DO 异常不再返回原始错误消息,改为通用错误响应
- 创建/更新服务器时校验端口范围 1-65535
### 移除未使用功能(LOW-01)
- 移除 `?config=` URL 参数预填功能(未被使用,存在凭据泄露风险)
### DNS 缓存优化
- 添加缓存最大条目限制(1000)防止内存泄漏
- 修正 IPv6 link-local/unique-local 正则表达式精确度
- 添加 DoH 响应 Status 字段校验
## 修改文件(12 个)
| 文件 | 改动 |
|------|------|
| `src/worker/dns-check.ts` | +216(新增 DNS 解析模块) |
| `tests/worker/dns-check.test.ts` | +263(新增 25 个测试) |
| `src/worker/agent/tool-executor.ts` | +22(action 白名单) |
| `src/worker/agent/ssrf.ts` | +31(DNS 校验集成) |
| `src/worker/agent/safety.ts` | +4(shell 替换检测) |
| `src/worker/user-db.ts` | +14(端口校验、错误消息) |
| `src/worker/durable-object.ts` | -23(移除 ?config=、集成 DNS 校验) |
| `src/worker/index.ts` | +8(AI base_url DNS 校验) |
| `src/worker/agent/core.ts` | -15(移除冗余 SSRF 校验) |
| `tests/worker/security.test.ts` | +29(更新测试) |
| `package.json` | 版本 1.0.8 → 1.0.9 |
| `CHANGELOG.md` | 新增 v1.0.9 更新日志 |
## 测试
全部 354 个测试通过,新增 25 个 DNS rebinding 防护测试。

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-07-17 14:26:36 +08:00
TanXinandTanXin 7d78f8fe25 release: v1.0.8 — AI Agent 安全策略重构、SSH 协议加固与身份信任边界收紧 (#36)
## Summary
本次发布覆盖 v1.0.8,包含 11 次提交,围绕 AI Agent 安全策略方向转变、SSH 协议与限流加固、AI
配置链路连通性修复、匿名身份信任边界收紧四条主线展开。版本号同步到 1.0.8,更新日志按 Keep a Changelog 规范整理。
- 方向性调整:废弃 AI Agent 严格白名单策略,改为黑名单兜底,由 AI 大脑作为主决策者自主评估风险并主动调用
`ask_user_confirmation`,显著降低无谓打断
- 安全加固:修复 `rm -fr /` 漏拦、补齐黑名单高危模式兜底、统一 SSH 序列号 uint32 回绕、区分头注入与匿名配置的
userId 剥离逻辑、SSRF 防护兼容 Workers 运行时
- 连通性修复:AI 配置读取路由错位、已登录用户无法使用 Agent、base_url 携带 `/chat/completions`
时模型列表获取失败等多处 bug 一次性修复
- 可维护性:全面重构精简 -588 行冗余,测试从测实现细节转向测行为边界,新增 178 行回归测试覆盖限流与身份信任边界
## Commits
| # | Hash | 描述 |
|---|------|------|
| 1 | 12397c7 | refactor: 根据精简修复清单进行全面重构与修复 |
| 2 | a269cda | fix: 自动剥离 base_url 中的 /chat/completions 以适配自动获取模型列表 |
| 3 | c8d5387 | feat: 前端透传模型列表获取失败的具体原因,便于排查网络拦截或重定向 |
| 4 | 4ee4123 | fix: 兼容 Cloudflare Workers fetch,redirect: 'error' 改为
'manual' 以防御 SSRF |
| 5 | f06f5b5 | fix: 修复已登录用户无法使用 AI 助手(头注入与匿名连接 userId 剥离逻辑混淆) |
| 6 | ab7c6fe | fix: 修复 AI Agent 配置读取内部路由查询失败导致的未配置提示 |
| 7 | a4a8b91 | refactor: 废弃严格白名单策略,改用黑名单策略(由 AI 大脑优先判断是否需确认) |
| 8 | d811099 | refactor: 优化内存限流、统一 SSH 序列号回绕、收紧匿名身份信任边界并补齐回归测试 |
| 9 | 843ccfe | fix: 修复 rm -fr / 漏拦并补齐 AI Agent 黑名单高危模式兜底 |
| 10 | 562f1d5 | docs: 发布 v1.0.8 版本与更新日志 |
## 改动分类
### Changed(策略与架构)
- AI Agent 安全策略转向:白名单(22 个只读命令免确认、其余一律确认)改为黑名单兜底 + AI
大脑自主判断。`isBlockedCommand` 直接拒绝灾难性命令(fork bomb / `rm -rf /` / `mkfs` /
`dd of=/dev/sd*`),`needsConfirmation` 在 AI 漏判时兜底强制确认
- 内存限流优化:Worker 实例级 `Map<ip,{count,resetAt}>` 增加惰性清理(每 256 次检查)与 10000 条
FIFO 淘汰,定位为削峰而非鉴权,真正的连接鉴权仍由 Turnstile 与一次性 token 负责
- SSH 序列号回绕统一:提取纯函数 `nextSequenceNumber(value)` 使用 `(value + 1) >>> 0`
无符号 32 位回绕,符合 RFC 4253 §6.4 / RFC 4344
- 匿名身份信任边界收紧:区分 Worker 内部可信 `x-ssh-config` HTTP 头(保留 userId)与匿名 URL
query param(强制剥离 userId),并在 `/api/ssh` 入口
`headers.delete('x-ssh-config')` 防止头注入伪造配置
- 全面重构精简:统一 SFTP 句柄生命周期与 2000 条目截断保护、简化 `user-db.ts` 查询路径、精简
`sftp-handler` 下载队列、前端 `tab-manager` 多会话协调增强,整体 -588 行冗余代码
### Fixed
- `rm -fr /` 漏拦:旧正则 `-[a-zA-Z]*r[a-zA-Z]*f[a-zA-Z]*` 要求 r 必须在 f 之前,flag
反序匹配失败、仅触发确认而非直接拒绝。改为解析短选项字段集合判断「含 r 且含 f」,顺序无关,覆盖 `rm -fr /`、`rm -r -f
/`、`rm -rfv /` 全部变体直接拦截
- 黑名单高危模式补漏:新增 6 条高破坏低误报模式(`iptables -X`、`kill -9
-1/0/1`、`curl|sh`、`wget|bash`、`find -delete`、`find -exec rm`);`apt-get
install`、`pkill`、`sudo 写操作` 等运维常用路径仍交由 AI 自主判断
- AI base_url 容错:自动剥离末尾 `/chat/completions` 后缀,兼容 Array / data / models
三种模型列表响应形态
- SSRF 防护兼容 Workers:`redirect: 'error'` 在 Cloudflare Workers 上会 throw,改为
`'manual'` 并显式拦截 3xx 保持 SSRF 防护语义
- 已登录用户无法使用 Agent:严格区分头注入路径与匿名 URL 路径的 userId 剥离逻辑
- Agent 配置路由错位:`fetchAgentAIConfig` 改为按 `githubId` 路由到对应 `UserDBDO`
实例,新增 `SSHConnectionConfig.githubId` 字段贯穿 DO 构造链路
- 前端错误透传:模型列表获取失败时显示明确错误而非笼统失败
### Added
- `safety.test.ts` 新增 3 个用例覆盖 `rm -fr` 漏拦修复与黑名单补漏,附相近安全形态(普通
`curl`/`wget`/`find`、`kill -9 <PID>`、`pkill`)的误伤防护回归
- `security.test.ts` 新增 178 行回归测试覆盖限流机制、匿名身份剥离、可信头注入防御
## 设计原则
AI 大脑仍是主决策者,底层 `isBlockedCommand` / `needsConfirmation` 仅在 AI
漏判时兜底。system prompt 中风险判断引导与 `ask_user_confirmation` 工具未变动,AI
主动判断空间完整保留。黑名单越准、AI 偶尔激进时用户越有保障;同时 `execute_command` 对非 blocked / 非
confirm 命令继续放行,让 AI 真正干活。
## 测试状态
- 本地全部测试通过:11 test files,300 tests passed
- safety 测试从测实现细节转向测行为边界,属合理精简
- v1.0.7 的回归测试(178 行 security 用例)在 test 环境已验证
## 部署影响
- 合并后触发 `main` 分支 GitHub Actions,自动部署到生产环境 `cloudssh`
- 涉及 `UserDBDO` schema 新增 `githubId` 字段(消费侧非强制、向后兼容)
- 无破坏性 Durable Object 迁移:现有会话与数据天然兼容
- 匿名连接用户需注意:URL `config` 参数中携带 `userId` 的旧用法将被剥离(这正是安全修复的目的)

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-07-15 22:01:23 +08:00
TanXinandTanXin c9a71f9fa3 test: 完成 v1.0.5 测试覆盖阶段 1+2,修复 3 处安全缺陷并加固 worker 接缝 (#32)
## Summary
- **修复 3 个真实生产缺陷**:ssrf.ts IPv6 `[::1]` 方括号未剥离导致 SSRF 绕过、safety.ts `apk
add/del` 子命令漏覆盖、crypto.ts catch 块 `ciphertext.length` 在 null 输入时二次崩溃
- **完成 SSH 协议层阶段 1+2 测试覆盖**:新增 7 个测试文件、347 用例,覆盖 safety / ssrf /
algorithms / kex / crypto / packet / utils 核心模块,crypto.ts 与 utils.ts 达到
100% 覆盖率
- **新增 worker 接缝安全测试**:12 用例覆盖 OAuth CSRF、IDOR 越权、SSRF 接缝、cf_verified
签名伪造、跨站 WebSocket 劫持(CSWSH)五类高危边界
- **发布 v1.0.5**,更新 CHANGELOG 与 package.json 版本号
## 变更明细
| 类别 | 文件 | 用例数 | 覆盖率 |
|------|------|--------|--------|
| 安全模块 | `tests/worker/agent/safety.test.ts` | 86 | 双路径全覆盖 |
| 安全模块 | `tests/worker/agent/ssrf.test.ts` | 28 | 私有地址段全覆盖 |
| 协议层 | `tests/ssh/algorithms.test.ts` | 33 | — |
| 协议层 | `tests/ssh/kex.test.ts` | 26 | — |
| 协议层 | `tests/ssh/crypto.test.ts` | 56 | **100%** |
| 协议层 | `tests/ssh/packet.test.ts` | 49 | **96%** |
| 协议层 | `tests/ssh/utils.test.ts` | 55 | **100%** |
| 接缝安全 | `tests/worker/security.test.ts` | 12 | 5 类高危边界 |
**累计**:11 个测试文件,371 用例全部通过,耗时 <1 秒。
## 修复的 3 个缺陷详情
1. **ssrf.ts — IPv6 `[::1]` 绕过(高危)**:`validateBaseUrl` 未剥离方括号,用户可将 AI
base_url 设为 `[::1]:8080` 指向本机,绕过本机/内网拦截,可能导致 Agent 走私到内网或泄露云元数据凭据
2. **safety.ts — `apk` 子命令漏覆盖(中危)**:`needsConfirmation` 正则仅覆盖
apt/apt-get,未覆盖 Alpine 系 `apk add/del`,可静默安装/卸载系统包而无需确认
3. **crypto.ts — 异常路径二次崩溃(高危)**:catch 块读取 `ciphertext.length` 在 null
输入时自身 throw,导致 graceful degradation 失效,错误处理路径反而制造错误
## Test Plan
- [x] `pnpm test` — 11 文件 / 371 用例 / 全绿 / 919ms
- [x] 验证 ssrf.ts `[::1]` 不再绕过
- [x] 验证 safety.ts `apk add` 触发确认
- [x] 验证 crypto.ts null 输入进入 catch 返回 null 而非 throw
## Scope Note
阶段 3/4(Agent 控制循环、SSH 会话、Durable Objects、前端)计划不纳入单元测试,有状态组件 + 外部 IO
的单测维护成本接偏高,回报率低,改由人工测试 + 用户反馈循环兜底。本 PR 仅守住纯函数与关键接缝的安全边界。

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-07-12 14:11:15 +08:00
TanXinandTanXin 99e4ad59e0 feat: v1.0.4 - RSA/ECDSA 私钥认证支持、文件上传功能及测试套件 (#31)
## Summary
- 新增 RSA 和 ECDSA 私钥认证支持,扩展 SSH 密钥兼容性
- 前端新增密钥文件上传功能,提升用户体验
- 建立完整的单元测试套件,提高代码质量保障
- 发布 v1.0.4 正式版本
## Changes
### Added
- **RSA 私钥认证**:支持 `rsa-sha2-256` 签名算法,兼容 2048/4096 位密钥
- **ECDSA 私钥认证**:支持 P-256、P-384、P-521 三种曲线
- **密钥文件上传**:支持 `.pem`、`.key`、`.txt`、`.pub` 格式文件直接上传
- **单元测试套件**:基于 Vitest 框架,包含 36 个测试用例
### Fixed
- 修复 RSA PKCS#8 结构中 CRT 参数使用占位符的问题
- 修复 ECDSA PKCS#8 结构符合 RFC 5915/5208 标准
### Changed
- 移除 `--passWithNoTests` 测试配置选项
- 更新版本号到 1.0.4
## Technical Details
- RSA 使用 Web Crypto API 的 `RSASSA-PKCS1-v1_5` 算法
- ECDSA 签名自动转换 DER 格式为 SSH 格式
- 实现大整数运算(减法、取模)用于 CRT 参数计算
- 前端使用 `FileReader API` 读取密钥文件

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-07-11 18:36:23 +08:00