|
| 1 | +# T3 Plan: 已存密钥明文回填 + 等长掩码 |
| 2 | + |
| 3 | +## 复杂度 |
| 4 | + |
| 5 | +**L**(改安全边界 + IPC + 多表单) |
| 6 | + |
| 7 | +## 方案 |
| 8 | + |
| 9 | +### 1. 新 IPC(推荐按 instance 按需拉取) |
| 10 | + |
| 11 | +```ts |
| 12 | +// config:getSecrets |
| 13 | +// request: { instanceId: string } |
| 14 | +// response: { secrets: Record<string, string> } // 仅该实例 vault 中存在的 secret 参数 |
| 15 | +``` |
| 16 | + |
| 17 | +- 白名单:仅 `secretParamKeys` 允许的 param 名。 |
| 18 | +- 主进程:`secretsStore.get` / vault `get(keyFor(instanceId, name))`。 |
| 19 | +- preload 白名单暴露 `config.getSecrets`。 |
| 20 | +- **不要**在 `config.get` 里默认塞全量明文(减少常驻暴露)。 |
| 21 | + |
| 22 | +可选:`config:getSecret({ instanceId, name })` 单条;批量更省 IPC。 |
| 23 | + |
| 24 | +### 2. 表单回填 |
| 25 | + |
| 26 | +| 组件 | 改动 | |
| 27 | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------- | |
| 28 | +| `SettingsForm` | mount/展开时 `getSecrets(instanceId)`,secret 字段 `defaultValue`/`value` = 明文;删 `SECRET_PLACEHOLDER` 假长度逻辑 | |
| 29 | +| `CpaConnectorSettings` | 打开时拉 `cpa_mgmt_key` 明文,替换 `***` | |
| 30 | +| `SettingsView` 内联密钥 | 同上 | |
| 31 | +| `AddAccountDialog` | 新建无 vault,不变 | |
| 32 | + |
| 33 | +与 T2 `SecretInput`:始终可睁/闭真文;T4 简化为普通 password UX。 |
| 34 | + |
| 35 | +### 3. 保存逻辑 |
| 36 | + |
| 37 | +- 提交时:value 非空则写入(可与旧值比较,相同则 skip)。 |
| 38 | +- 删除「占位符不提交」分支,改为「空串 = 不更新 / 或明确清除」——**默认空串不更新 vault**(避免误清空)。 |
| 39 | + |
| 40 | +### 4. 文档 |
| 41 | + |
| 42 | +实现 commit 内更新 blueprint:secret-vault / domain / ipc / prd / architecture。 |
| 43 | + |
| 44 | +### 5. 测试 |
| 45 | + |
| 46 | +- unit/integration:mock vault → getSecrets 返回明文 |
| 47 | +- SettingsForm:has 配置时 input value 为真密钥 |
| 48 | +- 日志测试:getSecrets 路径不 log 明文 |
| 49 | + |
| 50 | +## 文件清单(预计) |
| 51 | + |
| 52 | +- `src/shared/types/ipc.ts` — channel + API 类型 |
| 53 | +- `src/preload/index.ts` |
| 54 | +- `src/main/ipc/config-ipc.ts` — handler |
| 55 | +- `src/renderer/hooks/use-config.ts` — 可选 `loadSecrets` |
| 56 | +- `SettingsForm.tsx` / `CpaConnectorSettings.tsx` / `SettingsView.tsx` |
| 57 | +- `tests/...` |
| 58 | +- blueprint 若干 md |
| 59 | + |
| 60 | +## Commit(可拆) |
| 61 | + |
| 62 | +``` |
| 63 | +feat(secrets): allow settings UI to load vault plaintext for edit |
| 64 | +fix(ui): show real secret length under password mask |
| 65 | +docs(security): update secret exposure model for settings reveal |
| 66 | +``` |
| 67 | + |
| 68 | +## 依赖 |
| 69 | + |
| 70 | +- T2(SecretInput 眼睛)可并行或先做。 |
| 71 | +- T4 改为轻量确认项(见更新后 T4)。 |
0 commit comments