4.3 KiB
4.3 KiB
工程不变量
修改鉴权、SQLite、账号删除、Codex 进程、秘密、通知、备份或部署边界前核对本页。
API 与认证
backend/CONTRACT.md是路径、状态码、响应字段和兼容文案的契约。匿名入口包括 status、setup、login,以及初始化完成后已标记公开账号的列表和 Dashboard 只读总览;新增或修改配置、账号、同步和凭据接口仍必须要求 session。- 所有受保护端点必须回查 session;非只读请求还必须验证
X-Requested-With。前端路由与按钮不能代替后端门禁。 - session 原 token 只进入 cookie,SQLite 只保存摘要;密码保持 argon2id。错误和日志不得包含密码、cookie、Bot Token、SMTP 密码或 Codex token。
- 初始化是事务性单管理员创建。新增自动初始化能力前必须保留并发与首次公网暴露的安全边界。
数据与账号
internal/store/store.go是 SQLite schema 和兼容迁移的事实来源。启动迁移必须幂等、保留旧数据并启用 foreign keys。- 旧单账号数据及账号 1 历史必须保留;迁移只为旧账号补空
auth_index,不得因切换 CPA 删除旧快照。新数据库不再预建空账号。 - 每个非空 CPA
auth_index最多绑定一个本地账号。添加或修改绑定前必须验证索引唯一指向未禁用的 Codex auth,失败不得留下半创建或半更新记录;CPA 的 transient unavailable/error 可能表示额度耗尽,不能阻止额度读取。修改到不同 authIndex 时必须原子清除该本地账号的旧用量、限额和提醒历史,禁止串身份。 - 删除账号只删除本地 runtime、数据库行及其级联历史,绝不能调用 CPA 删除凭据或误导用户认为 CPA auth 已删除。
daily_usage与limit_snapshots以account_id隔离。任何查询、更新、提醒 key 或清理不得串账号。expectedKind只是校验期望;未知套餐保持 unknown。相同邮箱提示重复不能成为自动合并依据。
CLIProxyAPI 运行时
- Codex Helper 不保存、返回或记录 CPA management key、OAuth access token、refresh token 或原始认证文件。公开账号响应必须清空
authIndex。 - CPA base URL 和 management key 只从服务端环境读取。未配置不得阻止 setup/login,但所有账号同步必须明确失败并保留旧 Dashboard 为 stale。
- 每账号
syncingmutex 继续串行同步和 Dashboard 访问;不得以无锁读写替换。 - auth-files 验证、
api-call包装状态和上游状态必须分别检查。请求必须保留超时和响应体大小限制,错误不得包含原始上游正文。 /wham/usage是额度同步的硬依赖;/wham/profiles/meToken 活动和重置卡详情是可缺失数据。optional、null、多 bucket、未知套餐和畸形附加限额必须安全降级或产生不泄密的同步错误,Profile 失败不得隐藏有效限额。
通知、外部输入与秘密
- SMTP 密码和 Telegram Token 使用
/data/secret.key的 AES-GCM 密文保存;设置响应继续掩去秘密。密钥丢失不能通过返回密文或明文“修复”。 - 提醒 dedupe key 必须包含账号、limit、window、reset 或旧 snapshot 身份及 kind;重试窗口保持计划时间后六小时。
- Telegram/SMTP 用户文本进入 HTML 前必须转义。Telegram HTTP client 和 SMTP 连接/读写必须保留 timeout;SMTP TLS 最低 1.2 并验证 server name。
- Telegram 绑定码十分钟且成功即消费;其他 chat 在绑定后不得查询实例数据。
前端与部署
- Web 界面中的所有可见账号邮箱继续掩码;Telegram
/account当前会向已绑定会话显示完整邮箱。账号切换清空旧 Dashboard;删除账号清除 localStorage 选择。公开账号响应不得暴露 CPA authIndex。 - 非活动设置 panel 保持
inert,tab 键盘和布局稳定性是现有可访问性契约。 - 前端生产资源嵌入 Go 二进制;Docker build stage 的复制顺序变化必须验证实际嵌入的是新产物。
/data是唯一完整恢复单元。数据库快照不含secret.key和 Codex 凭据;任何文档不得暗示其可完整灾难恢复。- 运行数据、数据库、密钥、凭据、
.env、node_modules和构建缓存不得进入 Git 或 Docker 构建上下文。