跳转至

登录二次认证页与登录前语言切换

现场和原因边界

Windows 0.11 的现场日志确认:OAuth 登录页 HTTP 200、17524 字符;SM2 凭据 POST 已提交,HTTP 200 返回 1661 字符,随后为 unexpected-page / credential-entry。这不是“请求未发出”,该摘要也不能证明密码错误或代理异常。

源码存在可复现的回归:学校 React 二次认证页面可能只有 <title>二次认证</title>,正文仅有挂载节点。新增的 isFinishedIdEntry 只读正文,漏掉标题,直接阻断后续 2FA。旧自有认证代码已记录这种学校页面形状。离线构造同形页面在修改前复现同一错误及一次凭据 POST。现场日志没有响应正文,不能声称那 1661 字符已被直接确认就是此页面;需 Windows 新包复测。

修改

  • 登录和 ID 漫游统一识别可见标题与正文中的二次认证标记,支持 HTML 字符实体。不扫描脚本中的字串;密码表单、公钥表单或明确学校错误不能被标题误判成验证页。不重放密码,不增加自动重试。
  • 登录、2FA 方式选择、验证码输入三处增加 OneGUI 语言选择,入口双语显示,选项来自现有语言注册表。位于表单上方正常文档流中,不采用遮挡内容的固定浮层。
  • 复用全局语言偏好与持久化;切换保留账号、密码、方式、信任选项与验证码,不触发认证请求。
  • 应用状态保留错误原因,在渲染时使用纯格式化函数本地化;错误诊断在捕获时记录。学校返回的外部错误详情保持原样。
  • Android 对外仍 0.11.0,内部 versionCode 11003,沿用正式发布证书。

验证

  • 登录行为回归 30 项通过,包括标题空壳、字符实体、脚本/隐藏文字反例、错误密码、HTTP 429、一次凭据提交和完整 TOTP 流程。
  • 生产构建浏览器验收 103 项通过:桌面/手机、微信与 TOTP、语言即时切换、错误重译、保留输入、刷新持久化、320 像素窄屏无横向溢出;无浏览器运行时错误。
  • info-lib 构建、desktop 类型检查、CSS、发布身份、Windows WebView 线程护栏、网络日志隐私 20 项通过;i18n 7552/7552、errors 0,无新增待翻译词条。
  • 浏览器使用 macOS Chromium、模拟 Tauri IPC 与学校响应;不使用真实密码、不发送学校认证请求。这不等于 Windows WebView2 实机验收或真实会话长期稳定性验收。这轮早期验收没有覆盖进入主界面后的数据错误,后文记录了用户随后发现的问题和补充验收。
  • 初次 dev 预览夹具遇到 React 双实例;改用生产构建完成上列验收。旧 GitLab 源码文字断言失败于未修改的 GitLabPage.tsx 中已被 i18n 提取的中文原文,HEAD 同样不含该原文;不将这项旧静态断言计为通过。
  • 产物与浏览器记录:/Volumes/OneTHUBuild/artifacts/windows-auth-title/。

发布

用户授权构建并替换原 Release/云盘渠道。语言入口完成后继续执行:桌面包与本地正式签名 APK 来自同一提交,更新双源清单、SHA256 与官网核验结果。Windows 用户可本地优先复测;正式渠道仍核对产物架构和源码来源。

后续:首次登录被退出与残留冷却

用户随后在 Windows 实测:首次进入后被送回登录页,20 秒后重试才成功。诊断显示学习页为 id-login-link;后续现场记录已经取回 79 条作业、27 条通知、61 个文件,说明不能将单个学习会话恢复问题作为整个主会话失效的结论。原浏览器验收仅断言瞬间离开登录界面,未覆盖随后的数据错误,这是验收缺口。

  • 主认证链真正完成时,当前 attempt 的成功钩子清除该轮冷却;错误密码、未知认证页和受限请求仍保留节流。旧链晚完成不得清理新链的门禁。
  • 校园数据、学习数据和学期列表恢复失败时显示服务自身错误,保留主界面;禁止在这些数据 hook 中直接 backToLogin()。
  • 并发恢复先加入已有 Promise,再判断下一轮节流;避免第二个 hook 在第一个还在恢复时立即被判失败。
  • 受信直登与新 2FA 共用学习会话准备逻辑,先完成同样的恢复再进入主界面。某学校服务不可用不被当成密码失败。
  • 已安装宿主认证 hook 的 LearnClient 不得再绕到独立旧账密路径,避免越过统一门禁并打断已有 2FA;无宿主的独立客户端保留原路径。
  • 现场日志暴露出 URL 矩阵参数仍可能带 Java 会话标识。JS 与 Rust 日志现在同时去掉普通及编码后的矩阵参数,不改实际请求地址。

新增验证:生产浏览器 117 项通过,覆盖受信直登、微信/TOTP、故意不提供学习会话、等待实际数据 hook 报错后仍保留主界面、成功冷却清空、不重放密码;恢复行为 7 项、门禁/指纹 28 项、认证行为 30 项、JS 隐私 23 项、Rust native_security 11 项通过。类型与生产构建通过。依然不能替代受影响 Windows 的真实校园账户验收。

此前 6a5803ff 的 Mac/APK 与 Windows Actions 39597291885 已构建,但用户新反馈到达时尚未上传。该批已标记 DO-NOT-PUBLISH,必须以本次进一步修复后的同一提交重新构建三端。正式渠道此时仍保持上一批已发布安装包,未混发新旧补包。

三端重发结果

  • 安装包源码固定为 fc626cfd187ecd9ede05b801caee48b8e75cf974;Windows Actions 39600985096 成功,macOS 与 Android 本地构建。
  • 三端内置同一前端 index-Dq3utnxa.js,SHA-256 为 9554a3ac6de4dae352d70319b6eeea6f891df8c696b34ba008a113c680d4e492。Windows 从 PE 资源目录核对 app/NSIS 的 0.11.0.0 版本与 x64 app 架构;NSIS 的 VS_FIXEDFILEINFO.dwStrucVersion 为 0,与应用的 0x10000 不同,验证脚本按实际资源格式读取。
  • macOS DMG 挂载后严格验签通过,app 与 Harness 均为 arm64。Android 为 0.11.0 / versionCode 11003,正式证书 SHA-256 保持 cc14d735667bb8b5d3134e7dfdccf6a4d9353e1a2fce54503f4a29705423aa97,APK ZIP、ARM64 ELF、无开发者面板检查通过。
  • 已替换 Release v0.11.0 与清华云盘固定分享 内的 /macOS、/Windows、/Android 原文件,同时更新双源 latest.json、SHA256SUMS 和双语发行说明;保留旧版本目录内容。
  • 公开匿名下载三个云盘安装包,大小与 SHA-256 均和 GitHub Release API digest、本地文件及两个版本清单一致。官网使用这一轮重新生成的核验快照。
  • 同版本安装包替换需要用户下载安装;不把同版本重发描述为已安装客户端自动升级。受影响 Windows 的真实账号登录仍待用户复测。
安装包 SHA-256
OneTHU_0.11.0_aarch64.dmg 9b5cddf8b9946a83e9044bbbb4490e55de985d03840c050f732640efa0222f44
OneTHU_0.11.0_x64-setup.exe 97b359e635c57483272fa74bb50be78f963ad1fc2c72021be5e5a7db5fd70caf
OneTHU_0.11.0_arm64.apk f614ddd725067d3b8d7331eccfbfdf10d22d5ba871a408c719be99c3201fa59e

完整产物与校验记录保存在 /Volumes/OneTHUBuild/artifacts/release-0.11/login-session/,不提交原始校园认证日志或签名私钥。

后续:Android 默认图标漏检

用户发现 11003 包带 Tauri 默认图标。检查实际 APK 资源表、抽取图片以及本地生成工程,确认是新生成 Android 工程中的模板资源;正式脚本以前未同步图标,发布时也未验收这一项。这是本轮发布遗漏。

修复提交 828d4d447f50af17a3e98e22b637d74b290f860d:正式和开发者脚本共用 tools/android-icons.py,从原版 icons/icon.png 同步普通、圆形、前景与自适应图标;保留原版上下 Logo。正式包签名后使用 AAPT 资源表找到最终混淆路径,解码检查 15 张 PNG 像素,并核对 Manifest 和自适应引用。旧坏包被该检查拒绝,新包通过,提取后的实际图标已查看。

Android 单独重打为 0.11.0 / versionCode 11004,原正式证书,SHA-256 5cc60440fc4318def0b591fc0d38845460522f1931b508062d98cce619173a83。macOS / Windows 保留前述 fc626cfd 安装包,清单分别记录每个平台的源码。三端同一提交的描述仅适用于上一次登录修复批次。

恢复文档索引中开发者构建链接,开发者构建守卫 82 项通过。构建脚本语法、文档规范检查通过。修正版替换 Release / 云盘 Android 原路径、双源清单和总校验文件;官网重新校验下载,不依赖本地源目录截图。

本次产物与记录:/Volumes/OneTHUBuild/artifacts/release-0.11/android-logo/。未在实体 Android 设备上安装,不将 APK 资源验收描述为手机实机验收。