Commit Graph

20 Commits

Author SHA1 Message Date
Abner
f5c5dee5ab 🐛 fix: 修复 Session 恢复后二维码和 LPA 不显示的问题
问题:
- 用户完成 eSIM 激活后,因外部二维码服务不可用导致页面空白
- Session 恢复时未调用 showESimResult() 显示二维码和 LPA 信息

解决方案:
1. 新增通用二维码生成模块 (src/js/modules/qrcode-generator.js)
   - 实现三层降级策略:本地 CDN → 后端 Function → 文本提示
   - 消除对外部服务的依赖,提升隐私保护

2. 新增后端 Function (netlify/functions/qrcode-generate.js)
   - POST /bff/qrcode-generate 接口
   - 返回 base64 编码的 PNG 二维码
   - withAuth 中间件保护 + 输入验证

3. 重构前端二维码生成逻辑
   - Giffgaff/Simyo 统一使用 generateQRCodeWithFallback()
   - 保留并发调用防护和 tooltip 交互
   - 使用 i18n 翻译替代硬编码错误提示

4. 修复 Session 恢复逻辑
   - 在 handleSessionRestore() 中调用 showESimResult()
   - 确保刷新页面后二维码和 LPA 正常显示

技术改进:
- 懒加载 qrcode.js(~13KB gzip),仅在首次调用时加载
- 完整的测试覆盖(前端单元测试 + 后端安全测试)
- 更新 BFF 路由配置(Edge Function + 本地开发服务器)

Closes #75
2026-06-13 19:20:22 +08:00
Abner
4ba791b660 🔧 chore: 优化 Cookie 验证分支逻辑并补充跨文件 CORS 注释
- 重构 `cookieHandler.checkResult` 的条件分支,将"验证通过但未拿到 JWT"的场景从模糊的 `!result.valid` 升级为更精确的 `result.success && !result.valid`,使三类结果路径语义更清晰
- 为三个分支各自添加中文注释,分别标注"完全成功"、"部分成功"和"硬错误,不可继续",提升代码可维护性
- 在 `bff-proxy.js` 顶部新增注释说明该文件运行在 Deno 环境,无法直接引用 Node.js 的 `_shared/cors.js`,并提醒需与 `netlify/functions/_shared/cors.js` 的 `parseOrigins` 保持同步
2026-05-31 21:46:01 +08:00
Abner
df2b6ca814 🐛 fix(auth): 收紧 BFF 鉴权并修复内部调用链路 2026-05-31 19:25:23 +08:00
Abner
b815225845 🐛 fix(auth): 收紧 BFF 鉴权并保持内部路由兼容 2026-05-31 18:15:45 +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
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
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
643c16f393 🐛 fix: 修复 markdown-negotiation.js 全部 Code Scanning 安全警报
- bad-tag-filter:结束标签正则改用 \b[^>]* 匹配所有变体
- double-escaping:HTML 实体解码改为单次遍历回调,避免 < 双重解码
- incomplete-multi-character-sanitization:标签移除从正则改为逐字符 while 循环扫描,彻底消除 CodeQL 误报
2026-05-11 23:05:56 +08:00
Abner
de35542bc9 🐛 fix: 修正 Simyo QR 码支持描述
- Simyo 官方不支持 QR 码,但本工具可生成 eSIM QR 码
- 更新教程、对比表、FAQ 中的相关描述
2026-05-11 09:20:56 +08:00
Abner
4308c302bb feat: 根据 GEO 报告优化首页内容结构
- 添加设备兼容性说明(Apple/Android 设备列表 + EID 检查方法)
- 添加 Giffgaff/Simyo 分步使用教程
- 添加与官方 App 的对比表格
- 添加地区与时间限制说明(Giffgaff UK 时间窗口、Simyo NL 地区)
- 添加技术术语解释(OAuth、GraphQL、LPA、SM-DP+、MFA、EID)
- 添加 FAQ 常见问题(6 个高频问题)
- 添加安全声明区块(第三方工具风险、建议使用非主力号码)
- 更新 Markdown for Agents 主页内容
2026-05-11 09:19:43 +08:00
Abner
7d6faea4df 🐛 fix(security): 修复 markdown-negotiation Edge Function 的 HTML 清理逻辑
- 修复正则表达式匹配带空格的结束标签(如 </script >)
- 添加 \b 单词边界避免部分匹配
- 修复 HTML 实体解码潜在双重反转义问题
2026-05-11 09:06:36 +08:00
Abner
81dd2ce662 feat: 添加 AI Agent 友好元数据与 Markdown 协商支持
- 新增 robots.txt 生成(含 AI 爬虫规则 GPTBot/ClaudeBot/Content-Signal)
- 新增 sitemap.xml 生成(列出规范 URL)
- 新增 .well-known/api-catalog(RFC 9727 API 目录)
- 新增 .well-known/oauth-protected-resource(RFC 9728)
- 新增 .well-known/mcp/server-card.json(SEP-1649)
- 新增 .well-known/agent-skills/index.json(Agent Skills 发现)
- 新增 Link 响应头指向 agent 发现资源(RFC 8288)
- 新增 markdown-negotiation Edge Function(Accept: text/markdown 协商)
2026-05-11 08:59:39 +08:00
Abner
8f9bd3a6be 📝 docs: 新增模块化文档文件并更新主文档索引
- 新增 `src/js/modules/CLAUDE.md`,详细描述通用工具模块的职责、接口和使用方式
- 新增 `netlify/functions/CLAUDE.md`,系统化说明 11 个 Serverless 函数的功能和中间件架构
- 新增 `netlify/edge-functions/CLAUDE.md`,明确 BFF 代理层的验证码校验规则和转发流程
- 新增 `scripts/CLAUDE.md`,梳理 22 个构建和质量检查脚本的用途和执行命令
- 新增 `tests/CLAUDE.md`,说明 Jest 测试框架配置、覆盖率要求和各模块测试文件
- 更新根目录 `CLAUDE.md`,精简内容并添加模块结构图和详细索引导航
2026-04-28 20:14:59 +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
05318df88a feat: 为 Turnstile 验证添加强制执行控制功能
- 新增 TURNSTILE_ENFORCE 环境变量,可在紧急情况下跳过 BFF Turnstile 验证
- 在 CLAUDE.md 和 env.example 中添加完整的 Turnstile 配置说明
- 修改 BFF 代理逻辑,仅在启用强制执行时进行 Turnstile 验证
- 优化前端 JavaScript 代码,移除冗余的验证状态变量
- 在跳过验证时输出警告日志,便于调试和监控
2025-11-24 17:38:12 +08:00
Abner
4a0fcc94fe feat: 重构Netlify Functions架构并增强代码质量
- 新增统一的中间件模块,提供鉴权、CORS和错误处理功能
- 重构所有Functions使用withAuth中间件简化代码结构
- 添加安全存储模块替代localStorage,防御XSS攻击
- 引入HTML清理工具,自动转义特殊字符和验证URL安全性
- 创建代码质量检查脚本,验证语法、环境变量和依赖完整性
- 添加构建日志工具和重构脚本,统一替换console.log为Logger
- 引入ESLint配置,提升代码质量和一致性
- 重构Giffgaff相关API,统一错误处理和验证逻辑
- 优化构建脚本,添加压缩和图片优化功能
- 新增健康检查端点,用于服务监控和状态报告
2025-11-23 22:20:02 +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
2f8fa43b14 feat(security): 集成 Cloudflare Turnstile 验证
- 在 netlify.toml 中添加 Turnstile 相关的 CSP 规则
- 实现 BFF 代理中的 Turnstile token 校验逻辑
- 更新前端页面以支持 Turnstile 验证
- 修改 API 管理器以自动附带 Turnstile token
- 通过环境变量注入 Turnstile site key
2025-08-11 19:34:24 +08:00
Abner
5125c6538b feat(netlify): 实现 BFF (Backend for Frontend) 架构
- 新增 Edge Function 作为前端和后端无服务器函数之间的代理
- 修改前端 API 调用路径,使用 /bff/* 前缀
- 移除前端直接传递 authKey,改为在 Edge Function 中添加
- 优化了请求转发和响应处理
2025-08-11 19:00:28 +08:00