Commit Graph

505 Commits

Author SHA1 Message Date
Neo Vern
78c64989f9 Merge pull request #97 from Silentely/dependabot/npm_and_yarn/fast-uri-3.1.4
build(deps-dev): bump fast-uri from 3.1.2 to 3.1.4
2026-07-22 18:02:02 +08:00
Neo Vern
bf81262434 Merge pull request #96 from Silentely/dependabot/npm_and_yarn/body-parser-1.20.6
build(deps): bump body-parser from 1.20.5 to 1.20.6
2026-07-22 18:01:56 +08:00
Neo Vern
0ab8e1b643 Merge pull request #95 from Silentely/dependabot/npm_and_yarn/sharp-0.35.0
build(deps-dev): bump sharp from 0.34.5 to 0.35.0
2026-07-22 18:01:40 +08:00
Abner
0ef5ea82e2 🐛 fix(simyo): 升级 iOS 客户端版本至 4.28.0 修复 HTTP 426
Simyo API 拒绝过旧的 X-Client-Version/User-Agent(4.23.5),
导致登录失败 HTTP 426。同步更新前端配置、本地代理与测试页。

Closes #94
2026-07-22 17:49:11 +08:00
dependabot[bot]
cac7733946 build(deps-dev): bump fast-uri from 3.1.2 to 3.1.4
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.2 to 3.1.4.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.4)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-22 09:46:06 +00:00
dependabot[bot]
7b7b1aedf6 build(deps): bump body-parser from 1.20.5 to 1.20.6
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.5 to 1.20.6.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.5...1.20.6)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-version: 1.20.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-22 09:46:05 +00:00
dependabot[bot]
cfd4413a5e build(deps-dev): bump sharp from 0.34.5 to 0.35.0
Bumps [sharp](https://github.com/lovell/sharp) from 0.34.5 to 0.35.0.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.5...v0.35.0)

---
updated-dependencies:
- dependency-name: sharp
  dependency-version: 0.35.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-22 09:45:57 +00:00
Neo Vern
b884cbd659 Merge pull request #93 from Silentely/dependabot/npm_and_yarn/brace-expansion-5.0.7
build(deps): bump brace-expansion from 5.0.6 to 5.0.7
2026-07-22 17:44:58 +08:00
Neo Vern
71e216514c Merge pull request #92 from Silentely/dependabot/npm_and_yarn/axios-1.18.0
build(deps): bump axios from 1.16.0 to 1.18.0
2026-07-22 17:44:53 +08:00
dependabot[bot]
0d13254438 build(deps): bump brace-expansion from 5.0.6 to 5.0.7
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.6 to 5.0.7.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.6...v5.0.7)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-21 14:23:58 +00:00
dependabot[bot]
9b122e0e7c build(deps): bump axios from 1.16.0 to 1.18.0
Bumps [axios](https://github.com/axios/axios) from 1.16.0 to 1.18.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.16.0...v1.18.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-20 18:20:47 +00:00
Abner
81b86c7ec3 test: 补充 Logger Release 与 env 输出用例 2026-07-17 21:02:07 +08:00
Abner
9e4411ffa0 feat: [ENV] 运行环境日志输出 Release 版本
与 Sentry 注入的 window.SENTRY_RELEASE 对齐,便于控制台对照构建版本。
2026-07-17 21:01:55 +08:00
Abner
ce8c1dbd77 🐛 fix: 本地 Sentry tracing 包不再启用 replay/feedback
本地 vendor 仅含 tracing 实现,占位 API 会触发控制台警告;仅 CDN 完整包装配 replay 与 feedback。
2026-07-17 21:01:13 +08:00
Abner
53e56a2594 🐛 fix: 修复 Sentry 广告拦截降级与 Bootstrap source map CSP
优先加载同源 Sentry vendor,CDN 仅作回退;生产 connect-src 补充 cdn.jsdelivr.net,消除 .map 连接被拦。
2026-07-17 20:57:49 +08:00
Abner
2eda195a89 test: 补充诊断导出与帮助弹窗防护用例
同步更新 AuthHandler 断言与模块文档说明。
2026-07-17 20:53:32 +08:00
Abner
76cba05ef1 🔧 chore: 脱链检查覆盖 dist 构建产物 HTML
在已构建时同步校验 dist 入口资源,未构建时跳过 dist 避免误报。
2026-07-17 20:53:32 +08:00
Abner
fef5fc9e63 feat: 增加脱敏诊断导出便于复制到 Issue
业务页初始化后可在控制台执行 copyEsimDiagnostics(),复制非敏感环境与状态摘要。
2026-07-17 20:53:24 +08:00
Abner
700f7dbaf8 🔒 security: 移除 Simyo 密码状态字段并加固帮助弹窗
状态机不再持有 password;帮助弹窗改用 DOM 与 textContent 渲染文案。
2026-07-17 20:53:18 +08:00
Abner
613b5a9a2d 📝 docs: 对齐构建描述并标注未挂载前端模块
将构建说明改为静态拷贝与 esbuild;在模块文档中标明 api-service、performance-monitor 等未挂生产状态。
2026-07-17 20:49:36 +08:00
Abner
890e05f27f test: 补充 OAuth、登录、剪贴板与反馈相关单测
修复 sentry-feedback 与 qrcode 断言,新增 clipboard/PKCE/OAuth 回调/AuthHandler/showToast 覆盖。
2026-07-17 20:49:10 +08:00
Abner
0e4d378448 ♻️ refactor: 统一业务 Logger、抽取剪贴板并加固 Simyo 会话
业务模块改用 Logger 控制生产日志噪音;抽取公共 clipboard 并保持原导出路径;Simyo 登录不落密码、Toast 改为安全文本渲染。UI 控制器保留 console 便于用户复制排查信息。
2026-07-17 20:48:31 +08:00
Abner
5f78b2e45b 🔧 chore: 增加生产资源脱链检查并完善质量门禁
新增 check-asset-links,接入 quality-check 与 pre-push;修正 resource-hints 中已失效的 Webpack 产物路径。
2026-07-17 20:48:11 +08:00
Abner
9340bcc132 🎨 style: 步骤指示器背景改为暖橘黄,与页面卡片一致
替换冷灰白渐变,采用奶油/琥珀色与品牌边框,暗色模式同步暖调。
2026-07-11 13:21:37 +08:00
Abner
f0c75ef308 🐛 fix: Cookie 失效时改引导 OAuth,避免打开已禁用入口
Cookie 登录暂不可用时,过期回调不再切换到 Cookie 区。
2026-07-11 13:16:01 +08:00
Abner
de9db76f56 🐛 fix: 恢复卡片上浮与步骤脉冲,并锁定 Cookie 登录禁用
- 卡片 hover 恢复 translateY(-5px),禁用态不响应
- 步骤脉冲恢复 scale+外扩环,使用高对比色避免黄底不可见
- updateLoginCardsState 不再随服务时间启用 Cookie 入口
2026-07-11 13:14:58 +08:00
Abner
41ec3a91b7 🔒 security: 通过 overrides 升级 ws 至 8.21.0
修复 GHSA-96hv-2xvq-fx4p:小分片导致内存耗尽 DoS(jsdom 传递依赖)。
2026-07-11 13:11:52 +08:00
Abner
5e55f0a569 🔒 security: 升级 morgan 至 1.11.0 修复 Dependabot 告警
修复 GHSA-4vj7-5mj6-jm8m::remote-user 日志伪造(控制字符未中和)。
2026-07-11 13:09:06 +08:00
Abner
e2e35fd66d style: 恢复装饰动画原有效果并优化动效节奏
恢复推广横幅、服务时间呼吸/脉冲等原有效果与幅度;用统一
时长 token 与更顺缓动微调节奏,悬停与后台标签暂停循环动画。
2026-07-11 13:05:43 +08:00
Abner
37998d8c82 🐛 fix: 加固步骤选择器并修正通知样式选择器冲突
步骤节点限定为 .step-indicator .step,避免误匹配;
更新提示的 .notification-content 改为作用域选择器,防止覆盖通用通知布局。
2026-07-11 12:54:16 +08:00
Abner
aaacbddfa4 style: 优化前端 UI 流畅度、视觉层次与暗色模式
统一 motion token,拆分步骤 completed/active 与进度轨,弱化表单卡上浮
与无限呼吸动画;首页改中性 mesh 背景,补齐三页暗色与通知 safe-area。
2026-07-11 12:46:13 +08:00
Abner
653e06a29a 🐛 fix: 添加 Sentry 过滤规则屏蔽 Mobile Safari 和浏览器扩展噪音 (ESIM-TOOLS-1G, 1H) 2026-07-06 11:38:56 +08:00
Abner
5a5c3d9722 🐛 fix: 添加 Sentry 错误过滤规则屏蔽第三方扩展 i18n 噪音
- 在 Sentry 的 denyUrls 过滤列表中添加 `/getInitLang/` 正则,拦截第三方脚本/扩展注入的 i18n 相关错误
- 减少因浏览器扩展注入的 `getInitLang` 未定义错误导致的误报,提升错误上报的有效性
- 同步更新依赖锁定文件 package-lock.json,确保依赖版本一致性
2026-07-05 16:15:01 +08:00
Abner
32987f7ace 📝 docs: 更新开发命令与文档链接,修复安全文档列表格式
- 将开发启动命令从 `npm start` 改为 `npm run dev`,使命令与实际脚本一致
- 替换技术参考文档链接:移除架构说明、Giffgaff/Simyo技术参考及CORS解决方案,新增通知系统指南和安全指南
- 更新开发者文档引用,引导用户查看新的通知系统和安全指南
- 修复 SECURITY.md 中已知漏洞修复项的列表格式,将 emoji 改为 `[x]` 复选框表示已完成
- 为 SECURITY.md 中 Helmet 示例补充 CommonJS 模块系统的注释说明
2026-06-26 21:48:03 +08:00
Abner
68e931b901 ♻️ refactor: 将日志输出格式从 JSON 重构为人类可读的字符串
- 修改 `server-logger.js` 核心逻辑,将日志输出从 `JSON.stringify` 改为模板字符串拼接,格式变更为 `[LEVEL] [function] [requestId] message | key=value`
- 同步更新 `bff-proxy.js` 和 `markdown-negotiation.js` 中的 Deno 环境内联日志函数,保持 Edge Function 与 Node.js 环境日志格式一致
- 调整 context 序列化方式,使用 `key=value` 空格分隔,无 context 时不输出分隔符 `|`,并移除 `timestamp` 字段
- 更新 `server-logger.test.js` 测试用例,断言日志输出为字符串匹配而非 JSON 解析,并增加单行输出及无 context 时不包含分隔符的验证
2026-06-26 21:48:03 +08:00
Abner
574506bcbf feat: 添加结构化日志支持并优化错误处理
- 在 netlify/functions/_shared/server-logger.js 中重构日志函数,统一日志输出格式,支持 context 字段覆盖基础字段(如 message)
- 在 netlify/functions/_shared/middleware.js 中增强 withAuth 中间件,注入结构化 logger 到上下文,增加 request_start / request_end / request_error 日志追踪,并记录请求耗时
- 为所有 Netlify Function(giffgaff-sms-activate、giffgaff-graphql、auto-activate-esim、verify-cookie、giffgaff-token-exchange、giffgaff-mfa-challenge、giffgaff-mfa-validation、health)添加结构化日志,替换原有 console 输出,包含请求入参、状态和耗时
- 在 netlify/edge-functions/bff-proxy.js 和 markdown-negotiation.js 中实现 Deno 内联结构化日志,生成 requestId 并统一日志输出格式,支持 INFO/WARN/ERROR/DEBUG 级别控制
- 更新测试用例 tests/modules/server-logger.test.js 和 tests/functions/middleware-logging.test.js,新增日志级别过滤、context 覆盖、多实例隔离、OPTIONS 预检处理等测试场景
2026-06-26 21:28:21 +08:00
Abner
89bacd46ed feat: 新增服务端结构化日志模块并完善日志相关测试
- 新增 `server-logger` 工具,输出单行 JSON 日志,统一包含 level、message、function、requestId、timestamp 等字段并支持 context 扩展
- 实现日志级别控制(`LOG_LEVEL` 环境变量),通过 `createLogger` 工厂按需抑制 DEBUG 日志并提供 `parseLogLevel/LOG_LEVELS` 供测试验证
- 新增中间件集成测试 `middleware-logging.test.js`,验证请求开始/结束/异常日志、耗时统计、logger 注入以及每次请求生成唯一 requestId
- 新增模块单元测试 `server-logger.test.js`,覆盖 JSON 结构、context 合并、warn/error 路由到对应 console 方法、以及 DEBUG 级别在不同环境下的输出行为
2026-06-26 21:22:26 +08:00
Abner
d297fa9f55 perf: 提高二维码生成图像清晰度的放大倍率
- 本地生成二维码时将 `createDataURL` 的第二个参数从 `cellSize * 2` 调整为 `cellSize * 4`,提升生成图片清晰度
- 边缘函数生成二维码时同步将 `createDataURL` 的第二个参数从 `cellSize * 2` 调整为 `cellSize * 4`,保证本地与线上效果一致
- 维持原有 `cellSize` 计算逻辑不变,确保二维码模块数与边距的适配策略一致
2026-06-25 22:25:41 +08:00
Neo Vern
7298ae4a0d feat: QR 码本地打包 + Edge Function 直接生成 (#86)
*  feat: 打包 qrcode-generator@1.4.4 到本地 ES 模块

* ♻️ refactor(qrcode): 移除 CDN 加载逻辑,改用本地 import 引入 qrcode-generator

* 🔧 chore: 移除 CDN preconnect 提示,QR 码库已内联

* 🔧 chore: 清理 CSP 配置,移除不再需要的 CDN 域名

*  feat: 将 QR 码生成迁移到 Edge Function,消除后端冷启动延迟

- 在 Edge Function 中内联 qrcode-generator 库(~20KB),直接生成 QR 码
- 删除废弃的 Netlify Function (qrcode-generate.js)
- 更新 server.js 移除对已删除函数的引用
- 更新测试文件适配新的 Edge 内联架构

* ♻️ refactor: 代码质量修复 — 移除死代码、消除变量遮蔽、添加交叉引用注释

* 🔧 chore: 修复非阻塞风险 — 补充 strict 模式、移除废弃 qrcode 依赖

- Edge Function qrcode-lib.js 补充 'use strict' 声明,与浏览器版保持一致
- 移除已废弃的 qrcode npm 依赖(原用于已删除的 Netlify Function)

* ♻️ refactor: 消除魔法数字、补充脆耦合和 async 技术债注释

- Edge Function 中 QR margin 魔法数字 8 替换为 QR_MARGIN_MODULES 常量
- generateQRCodeLocal 补充 async 无 await 的技术债说明
- error.message.startsWith 条件补充校验函数耦合关系注释

* 🐛 fix: 修复边界条件 — null JSON body、vendor 字符串异常、CDN preconnect 残留

- Edge Function: null JSON body 解构移到 try/catch 内,添加 null/非对象检查
- qrcode-generator: 库 throw 字符串时统一转换为 Error 对象,避免 .startsWith 崩溃
- index.html: 移除不再需要的 CDN preconnect 提示(jsdelivr/cdnjs)

* ♻️ refactor: 修复 CSP 恢复、异常归一化、自定义 Error 类、负面路径测试

- netlify.toml: 恢复 script-src 中 cdn.jsdelivr.net(Bootstrap JS 仍依赖)
- Edge Function catch: 归一化非 Error 异常(库可能 throw 字符串)
- Edge Function QR margin: createDataURL(cellSize, 2) → createDataURL(cellSize, cellSize * 2) 对齐模块边距
- Edge Function: 补充认证模型和 QR 格式变更注释
- qrcode-generator.js: 引入 QRCodeValidationError 替代 error.message.startsWith 脆耦合
- tests/bff-proxy: 添加 6 个 Edge QR 负面路径测试(无效 JSON、空/超长/非字符串 data、超范围 size)
- tests/qrcode-generator: 添加库 throw 字符串异常的测试
- scripts/sync-qrcode-lib.js: 新增库代码同步验证脚本

* 🐛 fix: 修复 server.js CSP 缺少 jsdelivr、同步脚本 CRLF 归一化、fallback 拦截校验错误

- server.js: 恢复 script-src 中 cdn.jsdelivr.net(本地开发 Bootstrap JS 依赖)
- sync-qrcode-lib.js: 归一化 CRLF 换行符避免跨平台误报
- qrcode-generator.js: generateQRCodeWithFallback 入口处拦截 QRCodeValidationError,避免无效输入触发无意义的后端降级
2026-06-25 22:15:17 +08:00
Abner
0dee45b71b 🐛 fix: 重构健康检查功能以支持分层认证与环境变量监控
- 将健康检查从单一响应优化为公开/私有分层架构,通过 `detail=true` 参数控制是否返回详细环境变量检查状态
- 引入 `CRITICAL_ENV_VARS` 和 `OPTIONAL_ENV_VARS` 配置列表,统一环境变量健康检查逻辑,增强可维护性与可扩展性
- 移除 `notifications-internal.js` 废弃文件,保持函数目录结构清晰,避免路由冗余
- 在 BFF Edge Function 中将 `health` 路由加入 `ALLOWED_ORIGIN` 免验证白名单,支持前端直接调用健康检查接口
2026-06-24 23:57:45 +08:00
Abner
7221eb2e49 🐛 fix(qrcode): 添加 loadQRCodeLibrary 返回值防御性验证
解决 ESIM-TOOLS-15:浏览器扩展污染或缓存竞态导致 qrCodeLib 不是函数的极端情况。
新增重试机制:清除缓存后重新加载 CDN,避免用户看到 QR 码生成失败。
2026-06-24 23:03:30 +08:00
Abner
8bdc983959 🐛 fix(sentry): 修复 CSP connect-src 缺少 sentry.io 基础域名
- 所有 CSP 的 connect-src 添加 https://sentry.io
- *.sentry.io 通配符不匹配基础域名 sentry.io
- showReportDialog 提交反馈时 XHR 被阻止,已修复
2026-06-24 19:24:39 +08:00
Abner
2fc303d4ff feat: 暴露 Sentry 健康状态并补全 CSP 域名
- 在 src/js/sentry-loader.js 新增 getSentryHealth 方法,返回 sdkLoaded、initialized、isDev、dsnConfigured、environment、release 等健康信息
- 将 getSentryHealth 挂载到 window.getSentryHealth,便于运行时诊断 Sentry 是否加载与初始化成功
- 更新 server.js 的 CSP script-src,补充允许 https://sentry.io 域名以匹配 Sentry 脚本加载需求
- 更新 netlify.toml 以及 index.html、giffgaff_modular.html、simyo_modular.html 中的生产/页面 CSP 策略,在 script-src 中加入 https://sentry.io,并相应调整元信息中的域名白名单
2026-06-24 19:20:00 +08:00
Abner
0e1e21651a 🐛 fix(sentry): 修复 CSP 和截图安全问题
- server.js scriptSrc 补充 browser.sentry-cdn.com
- 禁用 feedbackIntegration 截图功能,避免泄露 eSIM 凭据
2026-06-24 19:07:38 +08:00
Neo Vern
bb80d3dc0a feat(sentry): 添加用户反馈功能 (#83)
*  feat(sentry): 添加用户反馈功能

- 升级 CDN bundle 以支持 feedback 模块
- 添加 feedbackIntegration 内置 Widget(主动反馈)
- 实现错误后自动弹窗(Crash-Report Modal)
- 添加冷却机制防止频繁弹窗(60秒冷却 + 同一错误不重复)

* ♻️ refactor(sentry): 修复审查发现的问题

- 消除指纹计算重复(DRY 违反)
- 统一使用 const/let 替代 var
- 复用已有 showReportDialog 函数
- 添加 beforeSend UI 副作用设计说明注释

* 🐛 fix(sentry): 修复 SentryMock 缺失方法

- 添加 feedbackIntegration 和 replayIntegration 到 SentryMock
- 修复 CDN 加载失败时 TypeError
- 删除多余空行

* 🐛 fix(sentry): 修复代码质量问题

- sentry-loader.js 添加 replayIntegration 和 feedbackIntegration 配置
- sentry-loader.js 添加错误后自动弹窗逻辑(冷却机制 + try-catch)
- sentry-init.js 添加 showReportDialog try-catch 保护
- 弹窗延迟从 100ms 改为 500ms(弱网兼容)

*  feat(sentry): 修复所有代码质量问题

- H1: CSP 添加 *.sentry.io 到 script-src(4 个文件)
- M1: Feedback Widget 和自动弹窗添加中文文案
- M2: 同步两套初始化路径配置(tracing、脱敏、ignoreErrors)
- M3: sentry-entry.js 添加 feedbackIntegration 导出
- M4: 新增专项测试(13 个测试用例)
- L1: SentryMock 补齐 showReportDialog/lastEventId
- L2: 空事件对象防御

*  feat(sentry): 修复 PR 审查发现的全部问题

功能正确性:
- query_string 添加类型检查(字符串/对象兼容)
- 指纹计算移到脱敏前(避免不同错误被误判为重复)
- 冷却状态更新移到 setTimeout 内部(避免空转)
- subtitleLine2 改为 subtitle2(修正字段名)

CSP 修复:
- script-src 移除 *.sentry.io(减少攻击面)
- frame-src 添加 *.sentry.io(支持弹窗 iframe)
- 添加 worker-src/child-src blob:(支持 Session Replay)
- server.js helmet CSP 同步更新
- netlify.toml 注释与实际策略对齐

配置/架构:
- sentry-entry.js 添加 lastEventId 导出
- tracePropagationTargets 添加 CORS 风险注释
- CDN 架构添加说明注释

代码质量:
- URL 参数脱敏支持大小写不敏感
- 移除过宽的 ignoreErrors 规则
- 测试文件添加 use strict
- 添加 i18n 和漂移风险注释

* fix: apply CodeRabbit auto-fixes (#85)

Fixed 3 file(s) based on 5 unresolved review comments.

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

*  feat(sentry): 修复新一轮审查意见

CSP 修复:
- script-src 恢复 *.sentry.io(showReportDialog 需要)
- netlify.toml Header CSP 同步 Cloudflare/Google
- server.js helmet CSP 同步

冷却竞态修复:
- 状态预留移到 setTimeout 之前(防止 500ms 内重复弹窗)
- 弹窗失败时回滚冷却状态

脱敏修复:
- query_string 对象分支改为大小写不敏感
- sanitizeQueryString 迭代改为安全模式(先收集键再遍历)

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
2026-06-24 19:04:38 +08:00
Abner
782f36e0ed 🐛 fix: 增强 QRCode 库加载时的全局变量类型检查
- 修改 `loadQRCodeLibrary` 函数中全局变量检测逻辑,从 `if (window.qrcode)` 改为 `typeof window.qrcode === 'function'`,防止非函数值污染导致逻辑错误
- 同步更新对 `window.QRCode` 的严格类型检查,确保大写字母变体的加载路径同样具备防护机制
- 优化错误提示信息,当库加载完成但全局变量不是函数时,明确抛出 `'global variable is not a function'` 错误便于排查
- 更新代码注释,说明引入严格类型检查的原因是为了兼容浏览器扩展或其他脚本可能覆盖全局变量的场景
2026-06-23 23:23:42 +08:00
Abner
6379bbef90 ♻️ refactor: 移除外部二维码服务依赖,改用本地生成方案
- 将前端二维码生成从 `qrcode.show` 远程服务切换为 `qrcode-generator` 本地库(UMD 格式),消除对外部 CDN 渲染服务的依赖,降低隐私风险和第三方服务不可用时的故障点
- 重写 `generateQRCodeLocal` 函数适配 `qrcode-generator` API,使用 `qrcode(typeNumber, errorCorrectionLevel).addData().make().createDataURL()` 模式,并基于 QR 码模块数动态计算 `cellSize`,新增大尺寸预览图支持(400px)
- 移除所有页面中的 `qrcode.show` 域名引用,包括 CSP `connectSrc` 策略、preconnect 标签、resource-hints DNS 预解析配置及 Simyo/Giffgaff API 配置中的 `qrcode` 端点
- 完善二维码生成的日志与监控:在 CDN 加载成功后输出 `console.log`,本地/后端生成成功及失败时分别输出对应级别日志,并在 `trackQRCodeEvent` 中增加 `isBrowser` 守卫避免非浏览器环境报错
- 增加生成耗时和 QR 码长度(不含内容)到后端 BFF 日志,同时统一使用 `Date.now()` 计算请求耗时,避免 LPA 激活码等敏感信息进入日志
- 全面更新所有相关测试用例,适配新的 `window.qrcode` 工厂函数 mock,新增日志输出和 Sentry 上报断言,验证本地成功、本地失败降级、后端成功、后端失败四种场景的可观测性
2026-06-23 21:22:16 +08:00
Abner
1f001e36f1 🐛 fix: 修复 QR 码生成库 CDN 加载失败及全局变量检测问题
- 将 jsdelivr 源从 `qrcode@1.5.4/lib/browser.js`(CommonJS 格式,浏览器不可用)替换为 `qrcode-generator@1.4.4/qrcode.min.js`(UMD 格式,设置 `window.qrcode` 全局变量)
- 在 `loadQRCodeLibrary` 和 `loadSingleCDN` 中新增对 `window.qrcode`(小写)全局变量的检测,兼容 qrcode-generator 包的 UMD 导出方式
- 将 `payload?.success` 和 `payload?.error` 的可选链操作符替换为兼容写法 `payload && payload.success`,避免低版本环境语法不支持问题
- 更新注释说明,明确标注 jsdelivr 的 qrcode 包为 CommonJS 模块不适用于浏览器环境
2026-06-23 17:39:16 +08:00
Abner
511cfc793c 🐛 fix(qrcode): 修复 CDN 源 URL 全部 404,替换为已验证可用源
- jsdelivr 主源 build/qrcode.min.js 返回 404,改用 lib/browser.js
- 移除无效的 unpkg.zhimg.com 源
- 添加 bootcdn.net 中国镜像源(已验证 HTTP 200)
- 所有 3 个 CDN 源均已验证可用
2026-06-23 16:43:01 +08:00
Abner
9c2a5bb18d 🐛 fix: 兼容 Chrome 77 等旧浏览器,移除 ES2020 语法(可选链/空值合并)
- ESIM-TOOLS-G: 替换所有 ?. 和 ?? 为 ES5 兼容写法
- ESIM-TOOLS-15: 添加中国 CDN 源(unpkg.zhimg.com/bootcdn.net)
- 涉及 8 个文件,覆盖 giffgaff/simyo 全部业务模块
2026-06-23 16:35:05 +08:00