feat/platform-admin-overhaul #1

Merged
xiaoman1221 merged 2 commits from feat/platform-admin-overhaul into master 2026-09-19 19:26:16 -04:00
Owner
No description provided.
管理端
- 七个平铺入口合并为三页(用户与用户组 / 域名与服务商 / 系统设置),
  组内用下划线式选项卡切换,当前选项卡记在 URL 的 ?tab= 上
- 旧地址 /admin/{groups,providers,words,logins} 全部重定向到合并后的页面
- 操作按钮从页面标题移到各自列表头部;宽度约束从 Tabs 移到表单本身

第三方登录
- OAuthGo 的 REST 与 OIDC 两个适配器合并为一个,协议模式改为下拉选择;
  启动时把历史数据(oauthgo_rest / oauthgo_oidc)迁到 oauthgo + mode
- 聚合账号开放的渠道从"备注里手写 channels:qq"改为勾选器,存独立的
  channels 列;旧备注里的白名单启动时自动迁移
- 彩虹与 OAuthGo 排在平台列表最前(displayOrder)

新增
- OAuth 回调的 state 支持由 Cookie 承载 —— 聚合服务商协议里没有 state
  字段、回调也不带回,此前这两个平台的登录必然失败在"回调缺少 state"
- 凭据字段支持下拉选项(oauth.Field.Options -> CredentialFieldSpec -> 前端)
- Dockerfile / docker-compose.yml / docker-entrypoint.sh / .dockerignore /
  .gitattributes(LF 固定,避免 Windows 检出后容器起不来)

修复(每条都可复现)
- 启动迁移的短路求值:同时具备旧备注与旧 driver 的账号只迁一半,
  driver 停在已注销的名字上,连凭据都读不出来
- 百度云 BCE 签名把百分号编码小写化,导致所有调用 403
- Route 53 把查询串并进 canonical URI,导入域名永远签名失败
- 用户资料与用户管理整行写回,会撤销并发的封禁与降级
- 违禁词删除缺少内置词守卫;列表的注释与播种意图相反
- OAuth 回调采信查询串里的 type,绕过发起时的渠道白名单
- 前端协议模式下拉的默认值只显示不提交,OAuthGo 账号建不出来
- 登录方式计数按适配器渠道数累加,与登录页实际按钮数不符
- formatRemaining 对不足一天前过期的记录显示"今天到期"
- 连接测试吞掉账号查询失败;换 driver 不校验凭据;解密失败静默清空
- 导入主域名把驱动原始报错写进 200 响应
- 服务商账号计数未按 kind 过滤;viewOf 漏传 ctx

冗余清理
- 删除无引用的 SHA256Hex、ErrUnsupported、SMSConfig.SignName、死分支
- 合并 accountCounts / accountCountsByKind、service 与 model 重复的状态常量
- 收紧只在本包使用的导出;修正多处与实现不符的注释

测试
- 新增用例覆盖上述修复,其中三组带对照(迁移短路、OAuth state Cookie、
  BCE 编码),并验证过"改回旧实现即失败"
- smoke.sh 157 项断言(原 141)
积分系统
- 签到/兑换码/管理员充值三种获取渠道,PointLog 全程审计
- 规则:「1 积分维持 N 条记录 × M 天」,周期结算,余额不足暂停解析
  (远端记录真实删除、参数留底,补足后按原参数重建并恢复)
- 结算由 settleMu 串行,扣分为事务内相对减法并重验余额;
  余额变动后立即尝试恢复,不等下一轮
- 管理端独立页 /admin/points(用户积分 / 兑换码 / 规则设置),
  仅管理员可访问;个人中心提供签到与兑换入口

记录类型
- NS 重新开放:值按域名校验,委派范围限申请者自己的叶子前缀,
  删除与积分暂停/恢复路径与普通记录一致
- 主机名规则收紧:末段标签必须以字母开头,"1.1.1.1" 不再被当作域名放行
- 前端 lib/validate.ts 与后端同一套规则,长度按 UTF-8 字节计,
  提交值与校验值统一 trim

缺陷修复(全库审查)
- DNS 数据丢失:Gandi 创建记录改 POST(原 PUT 会清空同 rrset 既有值);
  Route 53 创建改为读回合并再整体提交;腾讯云短信模板参数按数值序排列
- 适配器健壮性:Linode 及 8 家适配器补全 ListDomains 翻页;
  10 家适配器删除时对"远端已不存在"容错;百度云不再用过期错误冒充回查失败
- 并发与事务:Checkin/Redeem/AdminSetUserPoints 弃用整行 Save,
  改目标列更新,不再撤销并发的封禁/降级
- 安全:OAuth 回调校验查询串 state 与 Cookie state 一致性,堵 login CSRF;
  邮件 From 头经解析后写入,消除 CRLF 注入面;DATA 完成后不再把
  Quit 的成败当作投递结果
- 行为修正:用户组 slug 更新从静默丢弃改为明确报错;未知设置分区
  返回 404(与其他路径寻址资源一致);积分流水 ?user_id= 非法值显式 400;
  违禁词页对内置词不再渲染必然 409 的删除按钮

冗余清理
- 删除零引用的 oauth.Names / dns.ErrNotImplemented / newTestServer /
  Service.SendSMS、SendEmail 及 allow_subdomain_pick 端到端死字段
- 合并:四份删除确认框收敛为 ui/confirm,三份 rune 截断收敛为
  internal/textutil,MASKED 占位符统一到 lib/constants,
  分页拼参统一走 search() 助手
- 前端登录态过期在路由守卫立即登出,不再等下一次 401

验证:go build/vet/test 全绿,前端 tsc+vite 构建通过,
scripts/smoke.sh 178 项断言全部通过,浏览器 GUI 全流程抽检正常。
xiaoman1221 deleted branch feat/platform-admin-overhaul 2026-09-19 19:26:19 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
xiaoman1221/SDSGo!1
No description provided.