1. 26 Jan, 2026 3 commits
    • Wesley Liddick's avatar
      Merge pull request #391 from geminiwen/main · 624d9fdd
      Wesley Liddick authored
      fix(subscription): 修复订阅调整逻辑,已过期订阅从当前时间计算
      624d9fdd
    • Wesley Liddick's avatar
      Merge pull request #385 from DDZS987/fix/oauth-token-refresh-missing-project-id-retry · 47fbe433
      Wesley Liddick authored
      fix(oauth): 修复 OAuth 令牌刷新时 missing_project_id 误报问题
      47fbe433
    • shaw's avatar
      feat(auth): 实现 TOTP 双因素认证功能 · 1245f07a
      shaw authored
      新增功能:
      - 支持 Google Authenticator 等应用进行 TOTP 二次验证
      - 用户可在个人设置中启用/禁用 2FA
      - 登录时支持 TOTP 验证流程
      - 管理后台可全局开关 TOTP 功能
      
      安全增强:
      - TOTP 密钥使用 AES-256-GCM 加密存储
      - 添加 TOTP_ENCRYPTION_KEY 配置项,必须手动配置才能启用功能
      - 防止服务重启导致加密密钥变更使用户无法登录
      - 验证失败次数限制,防止暴力破解
      
      配置说明:
      - Docker 部署:在 .env 中设置 TOTP_ENCRYPTION_KEY
      - 非 Docker 部署:在 config.yaml 中设置 totp.encryption_key
      - 生成密钥命令:openssl rand -hex 32
      1245f07a
  2. 25 Jan, 2026 2 commits
  3. 24 Jan, 2026 8 commits
    • Ubuntu's avatar
      fix(oauth): 为初始 OAuth 授权添加 LoadCodeAssist 重试机制 · 4ded9e7d
      Ubuntu authored
      
      
      问题:
      - 初始授权时 LoadCodeAssist 没有重试机制,失败后直接跳过
      - 导致账号创建时就可能缺失 project_id
      - 之后每次刷新都因为 missing_project_id 报错
      
      修复:
      - 统一使用 loadProjectIDWithRetry 方法(最多4次尝试)
      - 初始授权和token刷新使用相同的重试策略
      - 保留原注释说明部分账户可能没有 project_id
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      4ded9e7d
    • Ubuntu's avatar
      fix(oauth): 彻底修复 project_id 丢失问题 · 716272a1
      Ubuntu authored
      
      
      根本原因:
      - BuildAccountCredentials 只在 project_id 非空时才添加该字段
      - LoadCodeAssist 失败时返回空字符串 → 新 credentials 不包含 project_id 键
      - 普通合并逻辑只保留新 credentials 中不存在的键,无法覆盖空值
      
      解决方案:
      1. 在合并后特殊处理 project_id:如果新值为空但旧值非空,保留旧值
      2. LoadCodeAssist 失败不再返回错误,只记录警告
      3. Token 刷新成功(access_token 已更新)就不应标记账户为 error
      
      改进效果:
      - 即使 LoadCodeAssist 连续失败,已有的 project_id 也不会丢失
      - 避免因临时网络问题将账户误标记为不可用
      - 允许在下次刷新时自动重试获取 project_id
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      716272a1
    • shaw's avatar
      feat(auth): 密码重置邮件队列化与限流优化 · 9cc83525
      shaw authored
      - 邮件发送改为异步队列处理,避免并发导致发送失败
      - 新增 Email 维度限流(30秒冷却期),防止邮件轰炸
      - Token 验证使用常量时间比较,防止时序攻击
      - 重构代码消除冗余,提取公共验证逻辑
      9cc83525
    • shaw's avatar
      fix(test): 修复订阅相关测试失败问题 · 43a1031e
      shaw authored
      1. 使用未来日期(2099年)作为测试订阅的过期时间,避免
         normalizeSubscriptionStatus 将测试数据标记为过期
      2. 修复 List 方法调用参数不足的问题(新增 sortBy/sortOrder 参数)
      43a1031e
    • Wesley Liddick's avatar
      Merge pull request #380 from DDZS987/fix/oauth-token-refresh-missing-project-id-retry · a5547b2f
      Wesley Liddick authored
      fix(oauth): 修复 OAuth 令牌刷新时 missing_project_id 误报问题
      a5547b2f
    • shaw's avatar
      feat(subscription): 订阅过期状态自动更新与服务端排序 · b0aa2354
      shaw authored
      - 新增 SubscriptionExpiryService 定时任务,每分钟更新过期订阅状态
      - 订阅列表支持服务端排序(按过期时间、状态、创建时间)
      - 实时显示正确的过期状态,无需等待定时任务
      - 允许对已过期订阅进行续期操作
      - DataTable 组件支持 serverSideSort 模式
      b0aa2354
    • Ubuntu's avatar
      fix(oauth): 修复 OAuth 令牌刷新时 missing_project_id 误报问题 · ffaa6c4a
      Ubuntu authored
      
      
      问题描述:
      在网络波动环境下,LoadCodeAssist 临时失败会被错误地标记为
      "missing_project_id" 不可重试错误,导致账户被禁用。但实际上
      账户配置正确,手动刷新后即可恢复。
      
      解决方案:
      1. 为 LoadCodeAssist 增加重试机制(最多4次,指数退避)
      2. 区分真正的配置缺失和临时网络故障:
         - 如果之前有 project_id,本次获取失败只保留旧值,不报错
         - 只有从未获取过 project_id 且本次也失败时,才标记为缺失
      3. 优化错误判断逻辑,避免误报
      
      改进效果:
      - 提高在复杂网络环境(如家宽代理)下的鲁棒性
      - 减少因临时网络波动导致的服务中断
      - 保持真正配置错误的检测能力
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      ffaa6c4a
    • Wesley Liddick's avatar
      Merge pull request #377 from lynoot/fix/non-streaming-chunk-aggregation · fbf72f0e
      Wesley Liddick authored
      fix(gateway): aggregate all text chunks in non-streaming Gemini responses
      fbf72f0e
  4. 23 Jan, 2026 8 commits
  5. 22 Jan, 2026 6 commits
  6. 21 Jan, 2026 2 commits
  7. 20 Jan, 2026 11 commits