feat(sora): 新增 Sora 平台支持并修复高危安全和性能问题

新增功能:
- 新增 Sora 账号管理和 OAuth 认证
- 新增 Sora 视频/图片生成 API 网关
- 新增 Sora 任务调度和缓存机制
- 新增 Sora 使用统计和计费支持
- 前端增加 Sora 平台配置界面

安全修复(代码审核):
- [SEC-001] 限制媒体下载响应体大小(图片 20MB、视频 200MB),防止 DoS 攻击
- [SEC-002] 限制 SDK API 响应大小(1MB),防止内存耗尽
- [SEC-003] 修复 SSRF 风险,添加 URL 验证并强制使用代理配置

BUG 修复(代码审核):
- [BUG-001] 修复 for 循环内 defer 累积导致的资源泄漏
- [BUG-002] 修复图片并发槽位获取失败时已持有锁未释放的永久泄漏

性能优化(代码审核):
- [PERF-001] 添加 Sentinel Token 缓存(3 分钟有效期),减少 PoW 计算开销

技术细节:
- 使用 io.LimitReader 限制所有外部输入的大小
- 添加 urlvalidator 验证防止 SSRF 攻击
- 使用 sync.Map 实现线程安全的包级缓存
- 优化并发槽位管理,添加 releaseAll 模式防止泄漏

影响范围:
- 后端:新增 Sora 相关数据模型、服务、网关和管理接口
- 前端:新增 Sora 平台配置、账号管理和监控界面
- 配置:新增 Sora 相关配置项和环境变量

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
yangjianbo
2026-01-29 16:18:38 +08:00
parent bece1b5201
commit 13262a5698
97 changed files with 29541 additions and 68 deletions

View File

@@ -941,6 +941,7 @@ export default {
anthropic: 'Anthropic',
openai: 'OpenAI',
gemini: 'Gemini',
sora: 'Sora',
antigravity: 'Antigravity'
},
saving: '保存中...',
@@ -1199,6 +1200,7 @@ export default {
openai: 'OpenAI',
anthropic: 'Anthropic',
gemini: 'Gemini',
sora: 'Sora',
antigravity: 'Antigravity'
},
types: {
@@ -1382,6 +1384,11 @@ export default {
baseUrlHint: '留空使用官方 OpenAI API',
apiKeyHint: '您的 OpenAI API Key'
},
// Sora specific hints
sora: {
baseUrlHint: '留空使用全局 Sora Base URL',
apiKeyHint: '您的 Sora access token'
},
modelRestriction: '模型限制(可选)',
modelWhitelist: '模型白名单',
modelMapping: '模型映射',
@@ -2936,6 +2943,47 @@ export default {
defaultConcurrency: '默认并发数',
defaultConcurrencyHint: '新用户的最大并发请求数'
},
sora: {
title: 'Sora 设置',
description: '配置 Sora 上游请求、缓存与去水印策略',
baseUrl: 'Sora Base URL',
baseUrlPlaceholder: 'https://sora.chatgpt.com/backend',
baseUrlHint: 'Sora 后端 API 基础地址',
callLogicMode: '调用模式',
callLogicModeDefault: '默认',
callLogicModeNative: '原生',
callLogicModeProxy: '代理',
callLogicModeHint: '默认保持当前策略',
timeout: '请求超时(秒)',
timeoutHint: '单次任务超时控制',
maxRetries: '最大重试次数',
maxRetriesHint: '上游请求失败时的重试次数',
pollInterval: '轮询间隔(秒)',
pollIntervalHint: '任务状态轮询间隔',
cacheEnabled: '启用缓存',
cacheEnabledHint: '启用生成结果缓存并提供本地下载',
cacheBaseDir: '缓存根目录',
cacheVideoDir: '视频缓存目录',
cacheMaxBytes: '缓存容量(字节)',
cacheMaxBytesHint: '0 表示不限制',
cacheUserDirEnabled: '按用户隔离缓存目录',
cacheUserDirEnabledHint: '开启后按用户创建子目录',
cacheAllowedHosts: '缓存下载白名单',
cacheAllowedHostsPlaceholder: '每行一个域名,例如: oscdn2.dyysy.com',
cacheAllowedHostsHint: '为空时回退全局 URL 白名单',
watermarkFreeEnabled: '启用去水印',
watermarkFreeEnabledHint: '尝试通过解析服务获取无水印视频',
watermarkFreeParseMethod: '解析方式',
watermarkFreeParseMethodThirdParty: '第三方解析',
watermarkFreeParseMethodCustom: '自定义解析',
watermarkFreeParseMethodHint: '选择去水印解析方式',
watermarkFreeCustomParseUrl: '自定义解析地址',
watermarkFreeCustomParseToken: '自定义解析 Token',
watermarkFreeFallback: '解析失败降级',
watermarkFreeFallbackHint: '失败时返回原视频',
tokenRefreshEnabled: '启用 Token 刷新',
tokenRefreshEnabledHint: '定时刷新 Sora Token需配置调度'
},
site: {
title: '站点设置',
description: '自定义站点品牌',