Skip to content

feat: support bare JSON array credential import - #854

Merged
chenyme merged 5 commits into
chenyme:mainfrom
Huan-zhaojun:pr/import-bare-array
Aug 5, 2026
Merged

feat: support bare JSON array credential import#854
chenyme merged 5 commits into
chenyme:mainfrom
Huan-zhaojun:pr/import-bare-array

Conversation

@Huan-zhaojun

Copy link
Copy Markdown
Collaborator

概述

有些 Grok build 凭证文件是顶层 JSON 数组形态([{...}, {...}]),此前在管理后台导入会报「第 1 行必须是 JSON 对象」,用户需改成 {"accounts": [...]} 包装或逐行 JSONL。本次让三种 Provider(Build / Web / Console)直接支持裸数组导入。

改动内容

  1. 解码器新增数组分支infra/provider/import_json.go,三端共用)

    • 数组先做限额拦截(优先于元素解析,混有非法元素时同样先报超限)
    • 逐元素结构预检:仅对象与 null 放行,错误精确到「数组起始行 + 第 N 个元素」序号
    • 错误文案全部静态,不携带原始文件内容(防凭据泄露)
  2. web/console 导入入口「[」保留前缀web/import.goconsole/import.go

    • 修复现存 bug:裸数组此前会被纯文本路径静默导入成垃圾账号
    • 纯文本 SSO 导入行为不变
  3. Web→Console 内部同步加固application/account/service.go

    • 内部同步改为 {"sso_token": ...} 固定 JSON 形态调用解析器,与 token 内容形态解耦
    • 增加 UTF-8 合法性校验,拒绝被 json.Marshal 静默改写为 U+FFFD 的非法输入

兼容性

  • 原有三种输入形态(单对象 / accounts 包装 / JSONL 连续对象)行为不变
  • 纯文本 SSO token 导入行为不变
  • 空数组 []、无逗号松散数组(明确报错)均按预期处理
  • provider 字段语义沿用各 Provider 现有 normalize 规则,无新增校验面

测试

新增约 30 个测试,覆盖:

  • 解码器:裸数组 / 空数组 / 数组+JSONL 合并 / 连续数组 / 多行数组 / BOM+CRLF / 非对象元素带序号报错 / 错误不泄露内容(哨兵验证)/ null 透传 / 恰好限额 / 超限优先 / 限额预检零解析
  • 三端 Provider:裸数组走 JSON 路径(断言不落纯文本)、BOM、错误矩阵
  • Service 层:跨文件聚合限额(恰好 10000 通过 / 超限零写入)、去重计数语义、内部同步真实适配器往返 + 非法 UTF-8 拒绝

go test ./...go vet ./... 全绿。

Huan-zhaojun and others added 5 commits August 5, 2026 11:47
Accept top-level JSON arrays in credential import files, the common
export shape of batch registration tools.
- decoder: per-element validation with indexed errors, limit pre-check
- web/console: reserve '[' as JSON prefix, fix silent plain-text import
- sync: deterministic {"sso_token": ...} payload and UTF-8 guard

(cherry picked from commit 03ece5a)
@chenyme
chenyme merged commit 55934f0 into chenyme:main Aug 5, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants