Commit Graph

39 Commits

Author SHA1 Message Date
Abner
8bd2bdb8a4 ♻️ refactor: 提取初始化脚本为独立模块并清理过时架构文档
- 将 giffgaff 和 Simyo 页面的国际化初始化内联脚本提取为独立的 `init-i18n.js` 模块
- 将通知系统初始化内联脚本提取为独立的 `init-notification.js` 模块
- 移除 docs 目录下的 ARCHITECTURE.md 和 FUTURE_ARCHITECTURE.md 过期架构文档
- 更新 giffgaff_modular.html 和 simyo_modular.html 以引用新的独立脚本模块
2026-06-13 21:58:09 +08:00
Abner
44b05221f7 ♻️ refactor: 提取公共脚本为独立文件并移除内联 JS
- 将 Giffgaff 和 Simyo 页面中的内联 Bootstrap 错误守卫脚本提取为独立的 `bootstrap-guard.js` 文件,减少 HTML 体积并避免重复代码
- 将内联的入场动画(IntersectionObserver 滚动触发 `.reveal` 效果)提取为独立的 `reveal-animation.js` 文件,两个站点共用同一模块
- Giffgaff 页面中复制激活码和 SSN 按钮从 `onclick` 内联事件改为通过 `data-target` 属性与 `bindCopyCodeButtons` 方法绑定,支持安全上下文 Clipboard API 及降级方案
- 移除 `design-system.css` 和 `animations.css` 的 preload 预加载逻辑,改为直接引用静态样式表,简化 HTML 头部复杂度
- CSP 策略中将 `'unsafe-inline'` 从 Simyo 的 `script-src` 中移除,改用 hash 白名单替代,提升安全性
2026-06-13 21:23:03 +08:00
Abner
e669b96f28 📝 docs: 完善 CLAUDE.md 检索指南并更新激活方式描述文案
- 在 CLAUDE.md 中新增基础检索章节,明确交叉验证策略、工具调用顺序、使用场景优先级及参数调优指南
- 新增网络检索章节,定义 smart-search-cli 工具路由矩阵、执行策略、错误恢复机制和核心约束
- 更新手动激活和短信验证码激活的中文及英文描述文案,明确说明适用场景为实体卡转 eSIM 或设备更换
- 同步更新 i18n-data.js 和 giffgaff_modular.html 中的对应文案,保持中英文翻译一致
2026-06-08 18:11:16 +08:00
Abner
75cbed8ca8 📝 docs: 更新 OAuth 回调URL获取与回切页面说明
- 将 OAuth 登录后切回的目标页面从“eSIM 更换页面”调整为“eSIM-Tools 工具页面(本页面)”
- 同步更新中英文用户指南中开发者工具打开与控制台查找回调URL的步骤描述
- 修改页面内中英文文案:说明新窗口打开后应切回本页面,并在对应输入框处理回调
2026-06-02 00:33:32 +08:00
Abner
72f76bcc79 feat: 更新已付款直取 eSIM 文案与界面提示
- 调整 UI 状态模式文案,将“已购用户获取 eSIM(仅限新购)”替换为“已付款用户直取 eSIM”,并同步状态样式入口
- 更新 i18n 翻译数据:将关键翻译键从“已购用户获取eSIM(仅限新购)”替换为“已付款用户直取 eSIM”,保持英文等值适配
- 完善模块化页面提示信息:在新用户告知与功能确认列表中新增“已支付 £10 直取 eSIM”,并更新直取卡片说明与徽标为“已付款用户专用”
- 更新直取 eSIM 内联区域说明语义:从“新购用户”修正为“已付款用户”,明确条件为“£10 已付但未成功生成 eSIM”
2026-05-30 21:18:07 +08:00
Abner
6631feb817 📝 docs: 更新警告提示文案并补充多 eSIM 选择说明
- 将 `⚠` 警告符号统一替换为 `⚠️`(含 Emoji 编码),确保中英文页面和文档的警告样式一致
- 中文文档和 HTML 中更新警告文案为"作者因条件不符未能实测此功能",英文对应更新为"could not be fully tested by the author due to eligibility constraints",表述更准确
- 在中文和英文用户指南中补充第 4 步操作说明:当账户存在多个可下载的 eSIM 时,需从列表中选择需要的 eSIM 后点击确认
- 将文档中 `reserve/swap` 流程替换为带代码格式的 `reserveESim` / `swapSim`,更精确反映实际接口名称
- 将中文文档中按钮名称的英文引号(「」)改为中文引号(""),保持中文排版风格统一
2026-05-29 18:51:05 +08:00
Abner
2c0f3f4e56 📝 docs: 新增直取 eSIM 功能说明与未测试提醒
- giffgaff_modular.html: 直取 eSIM 内联区添加未测试免责声明,
  小号字体醒目标注,附 Issue 反馈链接
- User_Guide.md: 第 5 步拆分为三种激活方式说明
- User_Guide_EN.md: 同步英文版文档
2026-05-29 18:36:39 +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
8ce7735f5d feat: 添加新用户提示警告框,说明工具使用限制
- 在赞助按钮下方新增 alert 警告提示区域,使用 `alert-warning` 样式搭配橙色三角形图标
- 提示中文用户本工具仅支持已有 Giffgaff 号码的用户,新用户无法使用
- 提示英文用户同样说明仅限现有用户使用,并引导新用户点击链接获取 SIM 卡优惠
- 中英文双语提示均使用已有的 `lang-zh` / `lang-en` 语言切换类,与页面现有语言系统保持一致
- 警告框带有 `reveal` 动画效果和圆角样式,与页面整体设计语言统一
2026-05-23 18:55:29 +08:00
Abner
59ff623359 🐛 fix: 账号无号码时提示更明确并新增对应文案
- 在获取会员信息失败时识别“账号无号码/账户无至少一个账号/错误码4001”等场景,避免直接展示通用失败信息
- 为“钱包为空”场景改用更具体的错误提示,包含支持的功能范围、操作限制说明及跳转 Giffgaff 官网获取号码的链接
- 增补 i18n 文案:新增钱包为空的标题、描述、引导与功能说明(同时覆盖中英文两套翻译)
- 在第三步“获取会员信息”模块前增加操作前必读警示卡片,提示新用户未有号码无法使用,并明确支持的两类操作方向
2026-05-20 23:21:10 +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
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
118ee45371 feat: 移除 Turnstile 支持并优化 reCAPTCHA 错误处理
- 完全移除 Turnstile 验证码相关的代码逻辑,包括初始化、刷新和执行功能
- 删除不再需要的全局变量如 `__cfTurnstileToken` 和 `__lastTurnstileError`
- 优化 reCAPTCHA 的错误处理机制,添加错误计数和最大重试次数限制
- 更新 CSP 策略,移除对 Cloudflare Turnstile 域名的引用
- 简化 captcha-manager.js 代码结构,提高可维护性
2026-05-18 20:46:13 +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
c3926b14eb 📝 docs: 修正误导性描述,明确工具仅支持已有用户 eSIM 设备更换 2026-05-17 21:57:13 +08:00
Abner
a5c933566d 🐛 fix: CSP 添加 unsafe-eval 解决 Turnstile 验证码 eval 报错
Cloudflare Turnstile SDK 内部使用 eval() 执行 challenge,
但 CSP script-src 未配置 unsafe-eval 导致 EvalError。
2026-05-17 16:30:32 +08:00
Abner
a1628aa33a 🐛 fix(security): 修复全部 76 个 CodeQL 安全扫描告警
修复 GitHub 代码扫描发现的所有安全问题,涵盖 20 个文件、76 个告警:

- Actions 工作流:添加 Fork 仓库限制、来源验证、persist-credentials: false、移除 npm cache
- 明文存储:localStorage 迁移到 secureStorage (sessionStorage + TTL)
- 日志注入:新增 sanitizeLog() 过滤换行符,覆盖全部 console.log 调用
- SSRF:新增 isAllowedTarget() 域名白名单校验
- SRI 完整性:为 Bootstrap/Font Awesome/GTM 添加 integrity + crossorigin
- XSS 防护:错误消息 HTML 转义、Service Worker origin 验证
- URL 清洗:hostname.includes() 替换为精确域名匹配
- HTML 过滤:扩展标签黑名单、添加事件属性过滤
- 限流:全局引入 createRateLimiter (200 req/min/IP)
2026-05-06 21:46:25 +08:00
Abner
35fc5a842d ️ revert(ui): 撤回浏览器兼容提醒改动 2026-04-11 23:03:28 +08:00
Abner
381d16df07 feat(ui): 新增首页与子页面浏览器兼容提醒 2026-04-11 22:50:20 +08:00
Abner
62e1363563 feat: 添加 Ko-fi 赞助按钮和改进样式
- 在首页、Giffgaff 和 Simyo 页面中添加了 Ko-fi 赞助按钮,方便用户支持项目。
- 引入了新的 `.header-actions` CSS 类,用于统一管理按钮组的布局和间距。
- 优化了按钮的样式,使其更具现代感和一致性,包括悬停效果和焦点状态。
- 为新增的 Ko-fi 按钮添加了相应的国际化文本和 ARIA 标签。
- 调整了移动端响应式样式,确保按钮在小屏幕设备上也能良好显示。
- 统一了 GitHub 和 Ko-fi 按钮的样式,使其在视觉上更协调。
- 更新了设计系统 CSS 文件,添加了新的按钮组样式和响应式适配。
2026-03-19 19:10:01 +08:00
Abner
54e279153e fix: 禁用 Cookie 登录功能并更新文档说明
- 禁用 giffgaff 模块中的 Cookie 登录选项,并修改了其视觉样式,使其不可用。
- 更新了中文和英文用户指南,明确告知用户视频教程中获取 OAuth 回调 URL 的方式可能已过时,应参考文字教程。
- 禁用 Cookie 登录是为了解决潜在的安全问题或功能限制,确保用户体验和数据安全。
2026-02-21 16:28:47 +08:00
Abner
c1d02b5021 docs: 更新OAuth回调URL获取指引,提升用户操作体验
* 优化了获取giffgaff OAuth回调URL的步骤,使其更清晰、更易于用户操作。
* 调整了用户手册(中英文)中的相关说明,指导用户通过控制台错误信息获取回调URL,而非网络面板。
* 同步更新了eSIM更换页面(giffgaff_modular.html)上的操作提示文本,与新指引保持一致。
* 更新了配套的截图文件(101.jpg 和 103.jpg)以匹配新的操作流程。
2026-01-24 20:46:02 +08:00
Abner
3fa2d7494e feat: 实现OAuth回调URL智能提取功能
* 引入新的逻辑,可以从用户输入或粘贴到回调URL字段的文本中自动识别并提取`giffgaff://auth/callback/...`格式的URL。
* 优化了用户在粘贴包含额外信息(如日志或其他文本)的OAuth回调URL时的体验,减少手动清理URL的需要。
* 为回调URL输入框添加了`input`和`paste`事件监听器,以便实时处理并格式化URL。
* 当成功提取URL时,会显示一个短暂的成功提示,通知用户URL已自动修正。
* 调整了HTML页面中giffgaff官网链接的文本颜色,从白色改为深色,以提高在浅色背景下的可读性。
2026-01-22 22:57:12 +08:00
Abner
32a32541c5 fix: 更新 giffgaff OAuth 登录流程以适应外部变更
* 针对 giffgaff OAuth 登录增加了前置条件,要求用户在进行 OAuth 授权前必须先登录 giffgaff 官网。
* 修正了获取回调 URL 的指引,现在引导用户在浏览器控制台中查找报错信息中的回调 URL,而非网络标签页。
* 提供了更详细的控制台报错信息示例,以帮助用户准确复制回调 URL。
* 更新了内部通知系统,添加了关于 giffgaff OAuth 登录方式变更的通知。
* 将原有“OAuth 交换时报错 400 问题”的通知类型从“success”调整为“info”,并设置为非活跃。
2026-01-22 22:43:48 +08:00
Abner
9da2e0bf95 fix: giffgaff tutorial link; freeze legacy pages 2025-12-31 00:21:43 +08:00
Abner
be8c2b4522 fix(ui): 移除内联onclick事件,改用事件监听器模式
- Giffgaff: 修复openTutorial未定义错误(Sentry #7148717229)
- Simyo: 统一改造openHelp/startDeviceChange/skipDeviceChange
- 移除全局函数暴露,消除window污染
- 符合CSP安全策略,提升可维护性
2025-12-29 19:58:39 +08:00
Abner
65068df5dd fix(sentry): 修复 CSP 内联脚本问题并增强敏感数据脱敏
- 新增 sentry-config.js 外链脚本替代 HTML 内联配置
- 修改 HTML 文件引用外链脚本以符合 CSP 策略
- 重写 inject-sentry-config.js 仅处理配置文件
- 添加 sentry-sdk-loaded 事件触发,修复 SDK 超时覆盖问题
- 增强 beforeSend 脱敏逻辑,覆盖 query_string 和更多敏感参数
2025-12-13 23:36:44 +08:00
Abner
f330b42b04 fix(csp): 修复 Sentry 上报被 CSP 阻止的问题
- 将 CSP connect-src 中的 `*.ingest.sentry.io` 改为 `*.sentry.io`
- 原因:Sentry 使用 `o493416.ingest.us.sentry.io` 多级子域名
- 通配符 `*.ingest.sentry.io` 不匹配多级子域名
2025-12-13 22:56:20 +08:00
Abner
d8b06136dc fix(sentry): 修复 Sentry SDK 加载问题,改用 CDN 方式
由于项目使用原生 ES 模块而非 webpack 打包,npm 导入方式无法工作。
改用 CDN 动态加载方案:

- 新增 src/js/sentry-loader.js:从 CDN 动态加载 Sentry SDK
- 重写 src/js/modules/sentry-init.js:使用 window.Sentry 而非 npm 导入
- 新增 scripts/inject-sentry-config.js:构建时注入环境变量配置
- 更新 build-static.js:集成 Sentry 配置注入步骤
- 更新 HTML 文件:添加 Sentry 配置脚本块和 CSP 策略

测试方法:部署后在控制台执行 testSentry() 或 window.testSentry()
2025-12-13 22:16:51 +08:00
Abner
727f4517f7 style: 统一表单样式并改进UI设计系统
- 将多个表单字段从传统标签布局升级为浮动标签设计,提升视觉一致性
- 重构通知系统,弃用自定义toast实现,改用统一的NotificationManager
- 添加玻璃态设计效果,为卡片和状态面板增加背景模糊和半透明效果
- 引入骨架屏加载动画和步骤指示器脉冲效果,增强用户体验
- 优化深色模式支持,改进颜色对比度和视觉层次
- 添加粘性底部操作栏,为移动端提供更好的交互体验
- 统一使用Inter字体,提升整体排版美观度
2025-11-30 19:19:52 +08:00
Abner
e8d31267f2 refactor: 重构样式系统和通知组件,提升代码模块化和可维护性
将内联CSS样式从index.html迁移到模块化的notification.css文件
为Giffgaff和Simyo页面添加通知系统样式引用
实现状态面板的可折叠设计,改善用户体验
添加深色模式支持,增强可访问性
优化悬停效果,仅在支持设备上显示
添加官方暂停通道的提示信息
统一管理网络状态指示器和加载动画样式
2025-11-30 18:51:20 +08:00
Abner
188d4af85a feat: 实现多提供商验证码系统,支持 Cloudflare Turnstile 和 Google reCAPTCHA
- 新增 CaptchaManager 类,统一管理 Turnstile 和 reCAPTCHA 验证码的初始化和 token 管理
- 扩展 BFF 代理支持多验证码提供商,根据配置自动切换验证逻辑
- 新增公共配置端点,动态下发验证码提供商配置到前端
- 重构 API 管理器,统一处理验证码 token 的头部和载荷注入
- 更新 CSP 策略,支持两种验证码服务的域名和资源
- 保留原有 Turnstile 功能的同时,支持 reCAPTCHA 作为备选方案
- 提供灵活的配置选项,可通过环境变量控制提供商开关和强制验证
2025-11-24 19:03:43 +08:00
Abner
eae40231bd feat: 实现 Turnstile token 自动刷新机制
- 新增 `triggerTurnstileRefresh()` 函数,在 token 获取失败时自动重试
- 为所有 Turnstile 回调函数添加错误处理逻辑,记录错误信息到 `__lastTurnstileError`
- 在 OAuth 流程中增加 token 刷新功能,提高认证成功率
- 添加全局刷新句柄 `__esimTurnstileRefresh` 供模块间调用
- 改进错误日志记录,包含具体错误信息以便调试
2025-11-24 17:07:19 +08:00
Abner
5a29e64ec7 feat: 重构部署流程并移除 Service Worker
- 新增部署工具脚本:添加 `build-static.js`、`deploy-prepare.js`、`deploy-analyze.js` 和 `test-deploy-config.js` 标准化构建部署流程
- 配置 Netlify 发布目录:修改 `netlify.toml` 将 `publish` 从根目录切换到 `dist` 目录以增强安全性
- 移除 Service Worker 相关代码:删除 `sw.js` 并清理相关注册逻辑,简化性能优化策略
- 增强服务器静态文件服务:重构静态资源中间件,增加环境检查和错误处理
- 改进 API 密钥处理逻辑:统一 Netlify Functions 的密钥验证流程,增加配置缺失提示
- 添加 Serena AI 配置文件:包含项目元数据、语言服务器设置和常用命令记忆
- 重构 HTML 页面路由:使用配置化的路由表替代硬编码路径,提高可维护性
2025-11-23 19:44:45 +08:00
Abner
7bdcbfcaee feat(security): 更新 Content-Security-Policy 策略配置
新增对 Google Analytics、Google Tag Manager 和 Cloudflare Turnstile 的支持,
同时调整 frame-src 允许加载特定域名内容。此变更应用于多个页面的 CSP 设置,
包括 index.html、giffgaff 和 simyo 相关页面,提升安全性与功能兼容性。

fix(turnstile): 改进 Cloudflare Turnstile 初始化逻辑

增强 widget 加载稳定性并优化 token 刷新机制,增加错误处理和状态管理,
防止重复执行并适配浏览器可见性变化。提取独立脚本确保 CSP 兼容性,
避免内联代码触发安全策略限制。

feat(i18n): 实现页脚组件国际化支持

为 copyright 文本、GitHub 链接及容器添加多语言切换能力,
引入翻译键值绑定与动态更新机制,并完善中英文对照文本定义。

refactor(footer): 抽离页脚国际化相关逻辑

将原有静态文本生成改为参数化解析方式,分离品牌名称与年份范围计算逻辑,
便于后续扩展更多本地化字段与样式控制选项。

chore(scripts): 创建首页专用 i18n 初始化模块

消除主页中的内联 JavaScript 脚本片段,将其封装成外部可引用的 ES Module,
解决潜在的内容安全策略冲突问题,提高代码整洁度和维护性。
2025-11-02 10:41:05 +08:00
Abner
317c243092 feat(giffgaff,simyo): 调整语言切换按钮位置至头部按钮区域 2025-11-01 14:07:30 +08:00
Abner
34e4d11032 feat(i18n): 添加多语言支持并优化页面结构
- 为首页和 Giffgaff 工具页添加语言切换功能
- 引入国际化模块,支持中英文内容动态切换
- 更新 HTML 结构以支持多语言文本包裹
- 添加语言切换按钮样式及交互逻辑
- 在页面加载时初始化国际化设置
- 补充页面元信息描述,提升 SEO 及可访问性
2025-11-01 13:50:08 +08:00
Abner
b977a93b0d fix(giffgaff): 修复样式表和脚本路径引用错误
修正了 giffgaff 模块中 CSS 样式表和 JavaScript 脚本的相对路径引用,
确保资源能够被正确加载。将原先不正确的相对路径更新为基于项目根
目录的绝对路径形式。
2025-10-31 23:37:48 +08:00
Abner
0de9083f4b feat(giffgaff): 重构eSIM工具为模块化架构
将原有的单文件实现拆分为模块化结构,提升代码可维护性和扩展性。
新增模块包括状态管理、UI控制、认证处理和eSIM服务等。
同时保留原始版本作为备份,支持通过路由切换访问不同版本。

新增MODULE_ARCHITECTURE.md详细说明模块设计与数据流向。
更新README文档,提供模块化版本使用指南和开发建议。
调整Netlify和服务器路由配置,支持新版和旧版页面共存。
2025-10-31 23:30:45 +08:00