Commit Graph

391 Commits

Author SHA1 Message Date
Abner
75da15edff 🐛 fix: 修复 PR 评审发现的 11 项问题
- data.data 空值保护:data?.data?.eSims 防止 TypeError
- directFetchMode 移至成功路径设置,失败时重置为 false
- SMS 卡片切换时隐藏 directFetchSection,避免双内联区同时可见
- modeBadge 直取模式下隐藏"设备更换"徽标
- tl() 文案迁移至 LITERAL_TRANSLATIONS,修复英文环境回退中文
- "拉取中"状态类型从 success 改为 info
- SSN radio 查询限定到 picker 容器内
- jest.config 补全 .spec.js 排除规则
- innerHTML 改用 DOM API 构建(pullBtn + renderSsnPicker)
- 测试 fail() 替换为 expect().rejects 惯用写法
2026-05-28 20:12:19 +08:00
Abner
60c3bd1cce feat: 新增「已支付直取 eSIM」功能,支持已购用户直接拉取 eSIM 生成二维码
在第 4 步新增第三张卡片「已支付直取 eSIM」,跳过 reserve/swap 流程,
直接调用 eSims(DOWNLOADABLE) 查询账户已有 eSIM 并生成 QR 码。

- BFF 白名单追加 eSims 查询的 App 头判定
- 新增 getESims GraphQL 查询与 fetchExistingESims/directFetchFlow 方法
- 支持多 eSIM 选择器(radio 列表)与空列表/错误状态处理
- 状态面板新增 directFetchMode 模式显示(运行时,不持久化)
- 补充 zh/en 双语 i18n 文案与 .status.info 样式
- 新增 9 个单元测试,全量测试 118 用例通过

Closes #62
2026-05-28 19:20:48 +08:00
Abner
574fd70025 feat: 新增首页信息区标题与教程/对比/地区限制/术语/FAQ/安全声明的 i18n 映射
- 为兼容性、教程、对比、地区与时间限制、技术术语说明、常见问题与安全声明等新增 DOM 翻译选择器,补齐 `.compat-title-text` 等标题与描述的本地化映射
- 在 `TEXT_REPLACEMENTS` 中补充首页首页信息区完整中文/英文文案(包含 Giffgaff/Simyo 激活流程、对比项、时间窗口与地区限制、安全声明等)
- 更新首页静态标题结构,将各信息区标题改为 `<span>` 包裹文本,以便 i18n 模块按类名进行动态替换
- 扩展国际化数据文件中的翻译键(`home.compat.*`、`home.tutorial.title`、`home.compare.title`、`home.region.title`、`home.glossary.title`、`home.faq.title`、`home.disclaimer.title`)以同步支持中英文渲染
2026-05-27 22:22:38 +08:00
Abner
d5f51e95a3 🐛 fix: 修复 checkServiceTime 空元素导致 TypeError 崩溃
页面可见性切换时 DOM 元素可能未就绪,增加空值守卫防止 null 访问
2026-05-27 14:09:56 +08:00
Abner
defcea2160 🔥 chore: 清理 Legacy 冻结校验工具链及相关残留配置
- 删除 `scripts/verify-legacy-frozen.js` 及 `scripts/legacy-freeze.json`,移除 legacy 文件冻结校验能力
- 删除 `package.json` 中 `verify:legacy` 和 `verify:legacy:update` 两个 npm scripts
- 删除 `build-static.js` 中移除 legacy HTML 文件的构建时清理逻辑
- 移除 `server.js` 中已废弃的 `/simyo-static` 路由及其兼容静态路径
- 更新 CLAUDE.md、scripts/CLAUDE.md 及两个业务模块架构文档,将"Legacy 架构"表述统一改为"原生 ES6 模块"
2026-05-25 20:34:53 +08:00
Abner
5768c0a075 feat: 为 API 端点新增 /bff/* 路由以实现本地模拟 Edge BFF 代理
- 将每个 API 处理器同时挂载到 `/.netlify/functions/*` 和 `/bff/*` 两个路径前缀下
- 使用路由数组和 `forEach` 循环替代逐行注册,消除重复代码,提高可维护性
- 本地环境下 `/bff/*` 路由模拟 Netlify Edge BFF 代理行为,方便本地开发与调试
- 保留原有 `/.netlify/functions/*` 路由不变,确保线上部署向后兼容
2026-05-24 21:39:13 +08:00
Abner
11ba72663a ♻️ refactor: 优化 CORS 处理和 API 响应解析逻辑
- 将 `createHeaders` 默认参数从固定 `ALLOWED_ORIGIN` 改为 `null`,改为由 `resolveCorsOrigin` 函数动态解析来源,统一 CORS 处理入口
- 为 `parseOrigins`、`isAllowedOrigin`、`resolveCorsOrigin` 三个 CORS 工具函数添加 JSDoc 类型注释,提高代码可读性和可维护性
- 代理转发时通过展开运算符条件传递 `X-Session-Token` 请求头,避免转发空字符串导致的鉴权问题
- 修复 URL 代理路径截断问题,保留原始查询字符串拼接,确保后端 API 能正确接收所有参数
- 增加对非 JSON 响应内容的处理分支,直接返回文本内容
2026-05-24 21:18:21 +08:00
Abner
6b7210490e Merge pull request #59 from Silentely/dependabot/npm_and_yarn/multi-f792d6d6d9
build(deps): bump qs and express
2026-05-24 21:11:48 +08:00
Abner
36d5119145 Merge pull request #60 from Silentely/feat/cors-multi-origin-and-simyo-proxy-fix
 feat: CORS 多源支持 + Simyo 代理修复 + API 响应处理重构
2026-05-24 21:11:29 +08:00
Abner
61bf73c0a0 ♻️ refactor(cors): 抽取 CORS 共享模块 + 通配符告警 + 响应解析容错
- 新增 _shared/cors.js 统一管理 CORS 解析与校验,消除 middleware/server 重复
- ALLOWED_ORIGIN 含通配符(*)时启动期输出安全警告
- handleApiResponse JSON 解析加 try/catch,处理空体/坏体场景
2026-05-24 20:44:18 +08:00
Abner
59a7a97c29 feat: CORS 多源支持 + Simyo 代理修复 + API 响应处理重构
- CORS 支持逗号分隔多源列表和通配符,新增 isAllowedOrigin/resolveCorsOrigin
- Simyo 代理路径从 req.path 改为 req.originalUrl,修复查询参数丢失
- Simyo 客户端配置提取为常量,支持环境变量覆盖
- API 端点检测浏览器协议,HTTP 访问时使用相对路径
- handleApiResponse 重构:content-type 检查、HTTP 错误优先、兼容三种响应格式
- 新增 X-Session-Token 头透传
- Logger 简化,移除前端模块依赖
- 同步更新测试 mock 以匹配新接口契约
2026-05-24 20:36:05 +08:00
dependabot[bot]
67aa52db0e build(deps): bump qs and express
Bumps [qs](https://github.com/ljharb/qs) to 6.15.2 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together.


Updates `qs` from 6.14.2 to 6.15.2
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.2...v6.15.2)

Updates `express` from 4.22.1 to 4.22.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.2/History.md)
- [Commits](https://github.com/expressjs/express/compare/v4.22.1...v4.22.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.15.2
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 12:46:21 +00:00
Abner
b5929cab3c 🎨 style: 调整新用户提示的配色与边框样式
- 将新用户提示的背景渐变从金黄色系切换为浅红色系,提升主题一致性
- 收紧边框颜色与透明度,边框从橙黄 rgba 调整为更柔和的红色 rgba
- 将文字颜色从 #92400e 调整为 #7f1d1d,增强对比度与可读性
- 将提示图标颜色从 #f59e0b 调整为 #dc2626,使图标与新配色保持一致
2026-05-23 18:59:42 +08:00
Abner
8ce7735f5d feat: 添加新用户提示警告框,说明工具使用限制
- 在赞助按钮下方新增 alert 警告提示区域,使用 `alert-warning` 样式搭配橙色三角形图标
- 提示中文用户本工具仅支持已有 Giffgaff 号码的用户,新用户无法使用
- 提示英文用户同样说明仅限现有用户使用,并引导新用户点击链接获取 SIM 卡优惠
- 中英文双语提示均使用已有的 `lang-zh` / `lang-en` 语言切换类,与页面现有语言系统保持一致
- 警告框带有 `reveal` 动画效果和圆角样式,与页面整体设计语言统一
2026-05-23 18:55:29 +08:00
Abner
29126683df perf: 优化页面不可见时的性能,减少不必要的CPU消耗
- 添加 visibilitychange 监听器,页面不可见时暂停所有定时器
- 缓存 WebP 检测结果避免重复创建 canvas
- 缓存视差元素 DOM 查询减少高频 querySelectorAll
- requestAnimationFrame 替代 setTimeout 优化触摸反馈
2026-05-23 18:26:57 +08:00
Abner
7822f19277 ♻️ refactor: 扩展 Sentry 噪音过滤规则以减少浏览器注入误报
- 新增 Android WebView "Error invoking post" 和 "Method not found" 过滤
- 同步更新 sentry-loader.js 和 sentry-init.js 的 ignoreErrors 列表
- 同步更新 EXTENSION_ERROR_KEYWORDS 全局拦截关键字
2026-05-23 18:26:24 +08:00
Abner
59ff623359 🐛 fix: 账号无号码时提示更明确并新增对应文案
- 在获取会员信息失败时识别“账号无号码/账户无至少一个账号/错误码4001”等场景,避免直接展示通用失败信息
- 为“钱包为空”场景改用更具体的错误提示,包含支持的功能范围、操作限制说明及跳转 Giffgaff 官网获取号码的链接
- 增补 i18n 文案:新增钱包为空的标题、描述、引导与功能说明(同时覆盖中英文两套翻译)
- 在第三步“获取会员信息”模块前增加操作前必读警示卡片,提示新用户未有号码无法使用,并明确支持的两类操作方向
2026-05-20 23:21:10 +08:00
Abner
7553dc69e1 🐛 fix: 增强 Promise rejection 错误处理逻辑,避免噪音错误上报
- 修复当 `normalize` 返回 null(如 number/boolean/symbol 等原始类型)时不执行 `preventDefault` 的问题
- 新增 `isSentryIgnoredError` 方法,用于检测 Sentry 已忽略的错误模式,避免重复过滤
- 在自定义错误处理前优先判断 Sentry 内置忽略规则,防止绕过 Sentry 过滤机制导致噪音上报
- 添加对 `non-error promise rejection`、`resizeobserver loop` 和 `AbortError` 等常见噪音错误的识别处理
- 当错误被 Sentry 忽略时,调用 `preventDefault` 并输出调试日志,确保浏览器控制台不报错且不上报 Sentry
2026-05-20 09:13:47 +08:00
Abner
ae7e30b5b1 feat: 添加手机浏览器环境检测与警告功能
- 新增 browser-utils.js 模块,提供 isMobileBrowser 检测和 showMobileWarning 警告功能
- 实现会话级去重机制,避免重复显示手机环境警告通知
- 在 SimyoApp 的登录和设备更换流程中添加手机环境检测逻辑
- 在 GiffgaffApp 的 OAuth 登录流程中添加手机环境检测逻辑
- 添加多语言翻译支持,包括中文和英文版本的环境警告提示文本
2026-05-19 23:15:55 +08:00
Abner
2047d1f294 🐛 fix: 调整未捕获 Promise 拒绝的噪音过滤与上报逻辑
- 先将 unhandledrejection 的 reason 统一归一化为 Error 对象用于噪音检测,减少在不同 reason 类型下的分支差异
- 将噪音检测逻辑调整为:命中忽略列表(包括 Error/字符串/对象)即静默吞掉并阻止默认行为,避免浏览器噪音重复上报
- 当不属于噪音且为“非自定义错误”(带 stack 的真实 Error)时,延后校验自定义错误类型后交由 Sentry 自动采集
- 扩展忽略关键字列表,新增 'method not found' 以降低相关已知异常的误报噪音
2026-05-19 22:46:02 +08:00
Abner
2eab92a20f 📝 docs: 更新项目文档并添加 .context 目录管理规则
- 在 CLAUDE.md 中添加 `.context/` 目录的项目上下文说明,明确其用于管理开发决策
- 规定编码规范、工作流规则和决策历史的文件路径:`prefs/coding-style.md`、`prefs/workflow.md` 和 `history/commits.md`
- 添加核心规则:修改代码前必须阅读 prefs/ 相关文档,做重要决策时需按 workflow.md 要求记录变更日志
- 在 .gitignore 中忽略 `.context/` 目录,避免将内部决策记录提交到版本库
2026-05-19 22:07:18 +08:00
Abner
307c82ac74 🐛 fix(deps): 升级 Bootstrap 5.3.0→5.3.8 并添加 bodyTouched 防御性错误守卫
修复 Sentry 报告的 Quark/OpenHarmony 浏览器上 bodyTouched TypeError:
- 升级 Bootstrap CSS+JS 到 5.3.8(修复 form-validation/focustrap 已知 bug)
- 添加全局错误监听器拦截 bodyTouched 异常,降级为 console.warn
- 同步更新 simyo 和 giffgaff 两个页面
2026-05-19 22:07:07 +08:00
Abner
98aa013469 🐛 fix(app): 防御性包装 Logger.env() 调用,防止 SW 缓存竞态导致初始化崩溃
Sentry 报告 Logger.env is not a function 错误(simyo + giffgaff)。
根因:Service Worker 版本部署后可能提供旧版 logger.js 缓存,
导致 Logger 类缺少 env() 方法。env() 为纯日志方法,缺失不影响业务。
修复:对 Logger.env() 添加 try-catch 包装,确保不阻断应用初始化。
2026-05-19 19:39:34 +08:00
Abner
ad16472fad 📝 docs: 全面审查并修复项目文档质量
- 重构 ARCHITECTURE.md,拆分未来架构到独立文件,修复 TypeScript 伪代码
- 修正 CLAUDE.md 模块结构图路径与实际代码一致
- 统一 README 中英文版快速开始步骤,补充环境变量配置
- 修复 TOKEN_REFRESH_FIX.md 未声明变量错误
- 统一修复文档格式模板,更新 reference 文件引用路径
- 优化 CORS_SOLUTION.md 标题语义和安全建议
- 补充 SECURITY.md CSP 配置上下文说明
- 调整 User_Guide.md 视频位置,补充扫码安装步骤
2026-05-19 19:30:37 +08:00
Abner
3c8f90e349 feat: 调整底部 Netlify 徽章布局与尺寸
- 将 Netlify 徽章链接样式由块级居中改为 flex 居中布局,增加水平间距并统一对齐方式
- 调整徽章图片高度从 26px 降至 18px,减少底部区域视觉占用
- 更新徽章挂载位置,将 Netlify 徽章追加到版权行(GitHub 图标后方)以匹配整体信息流
- 同步调整注释文案,明确徽章在底部版权区域中的相对位置
2026-05-19 16:51:05 +08:00
Abner
c10bec8f27 🐛 fix(modules): 移除 notification 模块混合 CJS/ES6 导出,防止 Babel 转译异常
notification-manager.js 和 notification-service.js 残留的 module.exports 与
export default 混合导出会导致 Babel sourceType:unambiguous 模块类型误判,
与 Logger 旧版同类问题一致,可能引发 xxx is not a function 运行时错误。
统一为纯 ES6 export default,消除隐患。
2026-05-19 16:04:24 +08:00
Abner
ba24c5b949 perf: swapSim 上游 500 错误自动重试并优化 UI/日志行为
- 在 giffgaff-graphql 的 swapSim 调用中,针对上游返回 GraphQL errors 且疑似 500 的场景启用最多 2 次的延迟重试(按 attempt 递增延迟),并对业务校验错误(非 500)保持原有失败处理
- 保留 401 未授权场景下基于 cookie 刷新 access token 的重试逻辑,刷新成功后跳出重试循环并直接返回结果
- UIController 在清空页面状态时额外清理会员信息、隐藏 eSIM 信息展示区并清空结果容器内容,避免残留的动态内容
- 调整会员信息日志输出字段,从 memberId 改为 memberProfile.id;同步将 logger 改为默认导出 export default Logger,避免混用 ESM/CJS 引发的构建解析异常
2026-05-19 15:21:28 +08:00
Abner
14ddf7e367 ♻️ refactor: 重构日志模块导出方式并新增运行时通用函数库
- 将 Logger 类从混合 ESM/CJS 导出改为统一使用 CommonJS 的 `module.exports`,避免 Webpack 生产构建时因模块系统混用导致解析异常
- 新增 `runtime-common.sh` 共享脚本文件,集中管理跨语言版本(中英文)共用的安全检测、系统信息收集、审计日志、配置加载等核心运行时函数
- 实现命令安全检查机制,支持按模式(strict/balanced/off)对危险命令进行 warn/challenge/block 三级处理,并支持白名单豁免
- 添加系统信息缓存优化,避免重复调用 `uname`、`sw_vers` 等命令,提升启动性能并减少系统调用开销
2026-05-19 15:08:42 +08:00
Abner
9702d04071 🐛 fix(graphql): 正确处理 Giffgaff GraphQL errors 响应
swapSim 等操作中 Giffgaff 返回 HTTP 200 但 GraphQL body 含 errors,
原代码无条件返回 200 导致前端无法区分成功与业务失败。
现在检测 errors 并返回 422 + 透传实际错误消息。
2026-05-19 14:16:40 +08:00
Abner
a1222dfedc feat: 升级 Sentry 监控系统,增强错误捕获能力
- 使用 npm @sentry/browser@10.30.0 构建完整 SDK bundle(替代旧的 114KB 手动 bundle)
- 放宽错误过滤规则:移除对网络错误(Failed to fetch、Network request failed)的误过滤
- 优化 beforeSend:仅在堆栈帧明确包含扩展路径时才过滤,减少误杀
- 启用 Session Replay:10% 会话采样 + 100% 错误录制,支持用户操作回放
- 添加用户反馈组件:showReportDialog() 允许用户主动报告问题
- 添加健康检查:getSentryHealth() 输出 SDK 状态和过滤统计
- 同步更新 sentry-init.js 和 sentry-loader.js 配置
2026-05-19 13:27:00 +08:00
Abner
8559563e39 🔧 chore: 为 BFF 代理和 GraphQL 函数添加调试日志以排查 500 错误
- Edge Function (bff-proxy): 添加请求入口、ACCESS_KEY 检查、body 读取、
  转发目标、fetch 结果等关键节点日志
- Function (giffgaff-graphql): 添加操作名、参数完整性、上游调用状态、
  token 刷新链路等全链路日志
- 修复: fetch 异常时不再向客户端暴露内部错误详情(安全加固)
- 所有日志仅记录布尔态和状态码,不泄露 token/签名等敏感信息
2026-05-19 12:17:46 +08:00
Abner
51b268d96d feat: 添加全面的控制台调试日志
- 增强 Logger.env() 输出更丰富的环境信息(平台、视口、Cookie、ServiceWorker 等)
- Giffgaff 模块:为 OAuth 登录、Cookie 验证、MFA 验证、会员信息获取、eSIM 预订、SMS 激活、Token 获取等所有步骤添加详细日志
- Simyo 模块:为登录、设备更换、验证码校验、eSIM 获取、二维码生成、安装确认等所有步骤添加详细日志
- 统一使用 [Giffgaff]/[Simyo] 前缀便于控制台过滤
- 输出内容包括:操作步骤、请求参数(脱敏)、响应状态、错误详情、会话恢复状态
2026-05-19 12:09:34 +08:00
Abner
500140cd1b feat: 添加 Netlify 徽章并引入贡献者公约
- 在页面底部添加 Netlify 部署徽章,包含悬停效果和无障碍访问支持
- 创建 CODE_OF_CONDUCT.md 文件,采用 Contributor Covenant 3.0 行为准则
- 更新英文 README 文件,添加行为准则链接说明
- 删除不再使用的 runtime-common.sh 脚本文件,简化项目结构
2026-05-19 10:28:41 +08:00
Abner
ab03025ff2 Merge pull request #58 from Silentely/dependabot/npm_and_yarn/brace-expansion-5.0.6
build(deps): bump brace-expansion from 5.0.5 to 5.0.6
2026-05-19 09:48:43 +08:00
Abner
7602a43e0a Merge pull request #57 from Silentely/cleanup/remove-unused-modules-and-fix-docs
🧹 cleanup: 移除未使用的模块化版本并修复文档问题
2026-05-19 09:48:27 +08:00
dependabot[bot]
f638b4c59b build(deps): bump brace-expansion from 5.0.5 to 5.0.6
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.5 to 5.0.6.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.5...v5.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-18 18:47:38 +00:00
Abner
fe28aec804 📝 docs: 修复 bot 审查发现的文档一致性问题
- 更新 tests/CLAUDE.md:移除已删除的 giffgaff 测试文件引用
- 更新 src/simyo/MODULE_ARCHITECTURE.md:移除对已删除目录的引用
- 更新 CLAUDE.md:修正 Webpack 相关描述,移除已废弃的别名说明

所有测试通过,文档与代码保持一致。
2026-05-18 22:23:10 +08:00
Abner
404fc88332 🧹 chore(cleanup): 移除未使用的模块化版本并修复文档问题
- 删除 src/js/modules/giffgaff/ 和 src/js/modules/simyo/ 目录(未完成的重构尝试)
- 移除 webpack.config.js 中未使用的别名配置和入口文件
- 修复文档错链:移除对不存在的 DEVELOPMENT_GUIDE.md 引用
- 修复文档错链:将 CORS_SOLUTION.md 中的 simyo_proxy_server.js 更正为 server.js
- 更新 tests/CLAUDE.md 中 Jest 版本为 30.3.0
- 移除 src/simyo/MODULE_ARCHITECTURE.md 中过时的重构计划
- 精简 docs/reference/ 下的技术文档,移除与根 README 重复的内容
- 删除已弃用的 .serena/ 工具目录
- 更新根 CLAUDE.md 反映清理后的新目录结构
- 删除 3 个引用已删除模块的测试文件

所有测试通过,构建成功,质量检查和安全检查均通过。
2026-05-18 21:58:42 +08:00
Abner
118ee45371 feat: 移除 Turnstile 支持并优化 reCAPTCHA 错误处理
- 完全移除 Turnstile 验证码相关的代码逻辑,包括初始化、刷新和执行功能
- 删除不再需要的全局变量如 `__cfTurnstileToken` 和 `__lastTurnstileError`
- 优化 reCAPTCHA 的错误处理机制,添加错误计数和最大重试次数限制
- 更新 CSP 策略,移除对 Cloudflare Turnstile 域名的引用
- 简化 captcha-manager.js 代码结构,提高可维护性
2026-05-18 20:46:13 +08:00
Abner
084c055f21 Merge pull request #53 from Silentely/feat/remove-turnstile-and-fixes
♻️ refactor: 移除 Turnstile 验证码、修复 CSP 和 Netlify 构建警告
2026-05-18 20:39:51 +08:00
coderabbitai[bot]
9f0feccc35 📝 Add docstrings to feat/remove-turnstile-and-fixes
Docstrings generation was requested by @Silentely.

The following files were modified:

* `scripts/pre-commit-check.js`

These file types are not supported:
* `CLAUDE.md`
* `netlify.toml`
* `netlify/edge-functions/CLAUDE.md`
* `netlify/functions/CLAUDE.md`
* `src/giffgaff/giffgaff_modular.html`
* `src/simyo/simyo_modular.html`
2026-05-18 12:37:32 +00:00
Abner
319c7da15f 📝 docs: 同步文档和日志规范
- Logger.env() 添加 isDev 门禁,生产环境不再打印 UA 信息
- 更新 CLAUDE.md 移除 Turnstile 验证码描述
- 更新 edge-functions/CLAUDE.md 简化 BFF 职责说明
- 更新 functions/CLAUDE.md 移除 turnstileToken 字段
2026-05-18 20:31:06 +08:00
Abner
307ebe8e84 🔧 chore: 移除 pre-commit 中的远程同步逻辑 2026-05-18 20:18:46 +08:00
Abner
3148a3564c ♻️ refactor: 移除 Turnstile 验证码、修复 CSP 和 Netlify 构建警告
- 移除 Turnstile 验证码逻辑,仅保留 reCAPTCHA 作为可选 fallback
- 修复 Google Fonts CSP 违规:style-src 添加 fonts.googleapis.com
- 移除 netlify.toml 中 /.netlify/functions/* 无效重定向规则
- 为 Giffgaff 和 Simyo 添加调试日志(环境信息 + 操作步骤)
- 简化 bff-proxy.js,移除验证码校验逻辑
2026-05-18 20:16:34 +08:00
Abner
4e9dc0ae76 🐛 fix: 进行 SIM 交换时向 GraphQL 传递正确的 mfaRef
- 在 giffgaff-graphql 函数的 swap 分支中补齐 graphqlBody.variables.mfaRef,确保后续 GraphQL 调用携带 MFA challenge reference
- 在 giffgaff-sms-activate 中引入 effectiveSwapRef(优先使用 swapRef,否则回退 ref),并将 mfaRef 作为 SwapSim 变量传入以避免空 mfaRef
- 更新 src/giffgaff/js/modules/api-config.js 的 swapSim GraphQL 变更签名,新增 $mfaRef 入参并在 swapSim 请求中透传 mfaRef
- 在 src/giffgaff/js/modules/esim-service.js 的 SwapSim 调用中增加 mfaRef 到 variables,并确保传参与 mfaRef 字段对齐以保证后端校验一致
2026-05-18 19:47:48 +08:00
Abner
909b4c592f feat: 完善 swapSim 接口的 MFA 相关头部处理与校验
- 在 `giffgaff-graphql.js` 中为 `swapSim` 操作显式添加 `X-GG-MFA-REF` 和 `x-gg-mfa-ref` 请求头,提升与上游服务的兼容性
- 当 `isSwap` 为真但缺少 `resolvedMfaRef` 时,抛出明确的 `AuthError` 提示,确保必填参数完整性
- 在 `middleware.js` 的 CORS 配置中新增 `X-MFA-Ref` 和 `X-MFA-Challenge-Ref` 到允许的请求头列表中,支持前端跨域请求
- 保持原有 `mfaRef` 作为 GraphQL 请求体顶层字段的逻辑不变,补充请求头层面的双重保障机制
2026-05-18 19:43:03 +08:00
Abner
5a88dc6af3 🐛 fix: eSIM 交换流程补齐/归一化 MFA ref 并增强校验
- 在 eSIM 交换前对 mfaRef 进行 trim 归一化,按需同时设置 X-MFA-Ref 与 X-MFA-Challenge-Ref,并将 mfaRef 作为 GraphQL 顶层字段传入
- 完整短信激活流程中统一从 MFA 校验结果 ref 或 emailCodeRef 获取并校验 swapMfaRef,缺失时抛出缺少 ref 的本地化错误
- MFA 校验增加对 signature 缺失的保护,成功返回时同时携带 ref 供后续交换步骤使用
- Netlify GraphQL 代理函数解析 X-MFA-Ref / X-MFA-Challenge-Ref 与请求体中的 mfaRef,进行 trim 后优先取体内 ref 并回填到 graphqlBody.mfaRef,确保 schema 需要的顶层字段始终可用
2026-05-18 19:36:28 +08:00
Abner
ec84274a91 🔥 remove: 移除 Netlify 中已废弃的 Legacy 页面重定向
- 删除 `/src/giffgaff/giffgaff_complete_esim.html` 到 `/src/giffgaff/giffgaff_modular.html` 的重定向规则
- 删除 `/src/simyo/simyo_complete_esim.html` 到 `/src/simyo/simyo_modular.html` 的重定向规则
- 移除已注释标记为“废弃 Legacy 前端”的相关配置块,避免配置冗余
- 保留根路径重定向 `/` 到 `/index.html` 的现有规则不变
2026-05-18 09:16:44 +08:00
Abner
c2853d2820 🐛 fix: 修复 swapSim 请求 500 错误
- api-config.js: 移除 swapSim mutation 中不存在的 $mfaRef 参数
- esim-service.js: 将 mfaRef 从 GraphQL variables 移至 body 顶层字段
- giffgaff-graphql.js: 转发 mfaRef 至 Giffgaff API(匹配后端 giffgaff-sms-activate 的正确模式)

根因:前端发送了 Giffgaff schema 不接受的 $mfaRef GraphQL 参数,
同时 BFF 函数在构建请求体时丢弃了 mfaRef 顶层字段。
修复后与用户 HAR 中成功的请求格式完全一致。

Fixes #51
2026-05-17 23:58:36 +08:00
Abner
cde452b0c5 🔧 chore: 精简文档结构并更新启动与参考说明
- 删除过时的文档:COOKIE 登录设置指南、集成/性能改进汇总、项目总结、快速参考卡、服务时间检查说明及其修复记录,以及 CHANGES_OVERVIEW.txt
- 调整 docs/CLAUDE.md 的文档模块职责与目录规划,补充安全指南、开发指南与通知系统等指引入口
- 更新 README.md 的启动步骤描述,将“启动代理服务器”更正为“启动开发服务器”
- 更新参考文档中 MFA/激活流程表述:Giffgaff 将“邮件验证码”调整为“邮件/短信验证码”,并强调短信验证码自动激活(推荐);同时修正测试页面路径到 tests/ 目录
- 同步调整 Simyo 参考文档的测试页面路径到 tests/ 目录,保持目录结构一致
2026-05-17 23:49:44 +08:00