mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-07 17:08:33 +08:00
沿用腾讯天御验证码引入的多服务商模型:aliyun_captcha_enabled 作为独立 开关,与 Cloudflare Turnstile、腾讯天御三方互斥(保存校验 + 运行时 CAPTCHA_PROVIDER_CONFLICT)。后台「安全与认证」合并为单张人机验证卡片: 总开关 + 服务商单选(Turnstile / 腾讯天御 / 阿里云),选中即启用该家并 关闭其它,落库仍是三个独立开关键,由前端映射保证互斥。 阿里云侧同时支持 aliyun 中国站与国际站(alibabacloud.com):两站前端脚本、 region 取值与服务端 API 完全一致,仅账号与 AccessKey 相互独立,因此由 「服务地域」决定线路即可——中国内地走 captcha.cn-shanghai.aliyuncs.com, 非中国内地(新加坡)走 captcha.ap-southeast-1.aliyuncs.com,AccessKey 取自持有该实例的账号,无需在配置中区分站点。 - AliyunCaptchaService 对称 TencentCaptchaService:服务端校验走官方 SDK VerifyIntelligentCaptcha,调用异常按 fail-closed 拦截,与 Turnstile 网络错误行为对称;保存设置时真实探测 AK/SK 有效性 - 保护面对齐腾讯扩展入口:VerifyTencentCaptchaIfEnabled 通用化为 VerifyActionCaptchaIfEnabled,OAuth 登录启动、passkey 登录在阿里云 启用时同样拦截;Turnstile 维持既有覆盖不扩大 - 前端 AliyunCaptchaWidget 为表单内预验证按钮(popup 模式),同时暴露 verify() 供 OAuth 启动、passkey 等动作入口程序化弹窗;未预验证直接 提交时弹窗兜底。SDK 按钮绑定异步完成,弹窗未出现前按 tick 重试触发, 并轮询弹窗可见性识别用户关闭 - captchaVerifyParam 复用 turnstile_token 请求字段提交;公开设置下发 aliyun_captcha_enabled / scene_id / prefix / region - CSP 放行验证码 CDN:script-src/style-src 加 *.alicdn.com
279 lines
11 KiB
Go
279 lines
11 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/Wei-Shaw/sub2api/internal/config"
|
|
"github.com/Wei-Shaw/sub2api/internal/handler/admin"
|
|
"github.com/Wei-Shaw/sub2api/internal/securityaudit"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
|
|
"github.com/google/wire"
|
|
)
|
|
|
|
// ProvideAdminHandlers creates the AdminHandlers struct
|
|
func ProvideAdminHandlers(
|
|
dashboardHandler *admin.DashboardHandler,
|
|
userHandler *admin.UserHandler,
|
|
groupHandler *admin.GroupHandler,
|
|
accountHandler *admin.AccountHandler,
|
|
announcementHandler *admin.AnnouncementHandler,
|
|
dataManagementHandler *admin.DataManagementHandler,
|
|
backupHandler *admin.BackupHandler,
|
|
oauthHandler *admin.OAuthHandler,
|
|
openaiOAuthHandler *admin.OpenAIOAuthHandler,
|
|
geminiOAuthHandler *admin.GeminiOAuthHandler,
|
|
antigravityOAuthHandler *admin.AntigravityOAuthHandler,
|
|
grokOAuthHandler *admin.GrokOAuthHandler,
|
|
proxyHandler *admin.ProxyHandler,
|
|
redeemHandler *admin.RedeemHandler,
|
|
promoHandler *admin.PromoHandler,
|
|
settingHandler *admin.SettingHandler,
|
|
opsHandler *admin.OpsHandler,
|
|
systemHandler *admin.SystemHandler,
|
|
subscriptionHandler *admin.SubscriptionHandler,
|
|
usageHandler *admin.UsageHandler,
|
|
userAttributeHandler *admin.UserAttributeHandler,
|
|
errorPassthroughHandler *admin.ErrorPassthroughHandler,
|
|
tlsFingerprintProfileHandler *admin.TLSFingerprintProfileHandler,
|
|
apiKeyHandler *admin.AdminAPIKeyHandler,
|
|
scheduledTestHandler *admin.ScheduledTestHandler,
|
|
channelHandler *admin.ChannelHandler,
|
|
channelMonitorHandler *admin.ChannelMonitorHandler,
|
|
channelMonitorTemplateHandler *admin.ChannelMonitorRequestTemplateHandler,
|
|
contentModerationHandler *admin.ContentModerationHandler,
|
|
promptAuditHandler *securityaudit.PromptAdminHandler,
|
|
paymentHandler *admin.PaymentHandler,
|
|
affiliateHandler *admin.AffiliateHandler,
|
|
complianceHandler *admin.ComplianceHandler,
|
|
auditLogHandler *admin.AuditLogHandler,
|
|
upstreamBillingProbe *service.UpstreamBillingProbeService,
|
|
ollamaCloudUsage *service.OllamaCloudUsageService,
|
|
) *AdminHandlers {
|
|
accountHandler.SetUpstreamBillingProbeService(upstreamBillingProbe)
|
|
accountHandler.SetOllamaCloudUsageService(ollamaCloudUsage)
|
|
return &AdminHandlers{
|
|
Dashboard: dashboardHandler,
|
|
User: userHandler,
|
|
Group: groupHandler,
|
|
Account: accountHandler,
|
|
Announcement: announcementHandler,
|
|
DataManagement: dataManagementHandler,
|
|
Backup: backupHandler,
|
|
OAuth: oauthHandler,
|
|
OpenAIOAuth: openaiOAuthHandler,
|
|
GeminiOAuth: geminiOAuthHandler,
|
|
AntigravityOAuth: antigravityOAuthHandler,
|
|
GrokOAuth: grokOAuthHandler,
|
|
Proxy: proxyHandler,
|
|
Redeem: redeemHandler,
|
|
Promo: promoHandler,
|
|
Setting: settingHandler,
|
|
Ops: opsHandler,
|
|
System: systemHandler,
|
|
Subscription: subscriptionHandler,
|
|
Usage: usageHandler,
|
|
UserAttribute: userAttributeHandler,
|
|
ErrorPassthrough: errorPassthroughHandler,
|
|
TLSFingerprintProfile: tlsFingerprintProfileHandler,
|
|
APIKey: apiKeyHandler,
|
|
ScheduledTest: scheduledTestHandler,
|
|
Channel: channelHandler,
|
|
ChannelMonitor: channelMonitorHandler,
|
|
ChannelMonitorTemplate: channelMonitorTemplateHandler,
|
|
ContentModeration: contentModerationHandler,
|
|
PromptAudit: promptAuditHandler,
|
|
Payment: paymentHandler,
|
|
Affiliate: affiliateHandler,
|
|
Compliance: complianceHandler,
|
|
AuditLog: auditLogHandler,
|
|
}
|
|
}
|
|
|
|
func ProvideGatewayHandler(
|
|
gatewayService *service.GatewayService,
|
|
openAIGatewayService *service.OpenAIGatewayService,
|
|
geminiCompatService *service.GeminiMessagesCompatService,
|
|
antigravityGatewayService *service.AntigravityGatewayService,
|
|
userService *service.UserService,
|
|
concurrencyService *service.ConcurrencyService,
|
|
billingCacheService *service.BillingCacheService,
|
|
usageService *service.UsageService,
|
|
apiKeyService *service.APIKeyService,
|
|
usageRecordWorkerPool *service.UsageRecordWorkerPool,
|
|
errorPassthroughService *service.ErrorPassthroughService,
|
|
contentModerationService *service.ContentModerationService,
|
|
userMsgQueueService *service.UserMessageQueueService,
|
|
cfg *config.Config,
|
|
settingService *service.SettingService,
|
|
coordinator *securityaudit.Coordinator,
|
|
) *GatewayHandler {
|
|
h := NewGatewayHandler(gatewayService, openAIGatewayService, geminiCompatService, antigravityGatewayService,
|
|
userService, concurrencyService, billingCacheService, usageService, apiKeyService, usageRecordWorkerPool,
|
|
errorPassthroughService, contentModerationService, userMsgQueueService, cfg, settingService)
|
|
h.securityAuditCoordinator = coordinator
|
|
return h
|
|
}
|
|
|
|
func ProvideOpenAIGatewayHandler(
|
|
gatewayService *service.OpenAIGatewayService,
|
|
concurrencyService *service.ConcurrencyService,
|
|
billingCacheService *service.BillingCacheService,
|
|
apiKeyService *service.APIKeyService,
|
|
usageRecordWorkerPool *service.UsageRecordWorkerPool,
|
|
errorPassthroughService *service.ErrorPassthroughService,
|
|
contentModerationService *service.ContentModerationService,
|
|
opsService *service.OpsService,
|
|
grokQuotaService *service.GrokQuotaService,
|
|
cfg *config.Config,
|
|
coordinator *securityaudit.Coordinator,
|
|
) *OpenAIGatewayHandler {
|
|
h := NewOpenAIGatewayHandler(gatewayService, concurrencyService, billingCacheService, apiKeyService,
|
|
usageRecordWorkerPool, errorPassthroughService, contentModerationService, opsService, cfg)
|
|
h.securityAuditCoordinator = coordinator
|
|
h.grokMediaEligibilityProber = grokQuotaService
|
|
return h
|
|
}
|
|
|
|
func ProvideBatchImageHandler(
|
|
batchService *service.BatchImagePublicService,
|
|
download *service.BatchImageDownloadService,
|
|
cleanup *service.BatchImageCleanupService,
|
|
openAI *OpenAIGatewayHandler,
|
|
) *BatchImageHandler {
|
|
h := NewBatchImageHandler(batchService, download, cleanup)
|
|
h.openAI = openAI
|
|
return h
|
|
}
|
|
|
|
// ProvideSystemHandler creates admin.SystemHandler with UpdateService
|
|
func ProvideSystemHandler(updateService *service.UpdateService, lockService *service.SystemOperationLockService) *admin.SystemHandler {
|
|
return admin.NewSystemHandler(updateService, lockService)
|
|
}
|
|
|
|
// ProvideSettingHandler creates SettingHandler with version from BuildInfo
|
|
func ProvideSettingHandler(settingService *service.SettingService, buildInfo BuildInfo, notificationEmailService *service.NotificationEmailService) *SettingHandler {
|
|
h := NewSettingHandler(settingService, buildInfo.Version)
|
|
h.SetNotificationEmailService(notificationEmailService)
|
|
return h
|
|
}
|
|
|
|
// ProvideAdminSettingHandler creates admin.SettingHandler with notification template APIs.
|
|
func ProvideAdminSettingHandler(settingService *service.SettingService, emailService *service.EmailService, turnstileService *service.TurnstileService, aliyunCaptchaService *service.AliyunCaptchaService, opsService *service.OpsService, paymentConfigService *service.PaymentConfigService, paymentService *service.PaymentService, userAttributeService *service.UserAttributeService, notificationEmailService *service.NotificationEmailService, totpService *service.TotpService, userService *service.UserService) *admin.SettingHandler {
|
|
h := admin.NewSettingHandler(settingService, emailService, turnstileService, opsService, paymentConfigService, paymentService, userAttributeService)
|
|
h.SetNotificationEmailService(notificationEmailService)
|
|
h.SetAliyunCaptchaService(aliyunCaptchaService)
|
|
h.SetStepUpDeps(totpService, userService)
|
|
return h
|
|
}
|
|
|
|
// ProvideHandlers creates the Handlers struct
|
|
func ProvideHandlers(
|
|
authHandler *AuthHandler,
|
|
userHandler *UserHandler,
|
|
apiKeyHandler *APIKeyHandler,
|
|
usageHandler *UsageHandler,
|
|
redeemHandler *RedeemHandler,
|
|
subscriptionHandler *SubscriptionHandler,
|
|
announcementHandler *AnnouncementHandler,
|
|
channelMonitorUserHandler *ChannelMonitorUserHandler,
|
|
adminHandlers *AdminHandlers,
|
|
gatewayHandler *GatewayHandler,
|
|
openaiGatewayHandler *OpenAIGatewayHandler,
|
|
settingHandler *SettingHandler,
|
|
totpHandler *TotpHandler,
|
|
passkeyHandler *PasskeyHandler,
|
|
paymentHandler *PaymentHandler,
|
|
paymentWebhookHandler *PaymentWebhookHandler,
|
|
availableChannelHandler *AvailableChannelHandler,
|
|
modelPlazaHandler *ModelPlazaHandler,
|
|
asyncImageHandler *AsyncImageHandler,
|
|
batchImageHandler *BatchImageHandler,
|
|
_ *service.IdempotencyCoordinator,
|
|
_ *service.IdempotencyCleanupService,
|
|
) *Handlers {
|
|
return &Handlers{
|
|
Auth: authHandler,
|
|
User: userHandler,
|
|
APIKey: apiKeyHandler,
|
|
Usage: usageHandler,
|
|
Redeem: redeemHandler,
|
|
Subscription: subscriptionHandler,
|
|
Announcement: announcementHandler,
|
|
ChannelMonitor: channelMonitorUserHandler,
|
|
Admin: adminHandlers,
|
|
Gateway: gatewayHandler,
|
|
OpenAIGateway: openaiGatewayHandler,
|
|
Setting: settingHandler,
|
|
Totp: totpHandler,
|
|
Passkey: passkeyHandler,
|
|
Payment: paymentHandler,
|
|
PaymentWebhook: paymentWebhookHandler,
|
|
AvailableChannel: availableChannelHandler,
|
|
ModelPlaza: modelPlazaHandler,
|
|
AsyncImage: asyncImageHandler,
|
|
BatchImage: batchImageHandler,
|
|
}
|
|
}
|
|
|
|
// ProviderSet is the Wire provider set for all handlers
|
|
var ProviderSet = wire.NewSet(
|
|
// Top-level handlers
|
|
NewAuthHandler,
|
|
NewUserHandler,
|
|
NewAPIKeyHandler,
|
|
NewUsageHandler,
|
|
NewRedeemHandler,
|
|
NewSubscriptionHandler,
|
|
NewAnnouncementHandler,
|
|
NewChannelMonitorUserHandler,
|
|
ProvideGatewayHandler,
|
|
ProvideOpenAIGatewayHandler,
|
|
NewTotpHandler,
|
|
NewPasskeyHandler,
|
|
ProvideSettingHandler,
|
|
NewPaymentHandler,
|
|
NewPaymentWebhookHandler,
|
|
NewAvailableChannelHandler,
|
|
NewModelPlazaHandler,
|
|
NewAsyncImageHandler,
|
|
ProvideBatchImageHandler,
|
|
|
|
// Admin handlers
|
|
admin.NewDashboardHandler,
|
|
admin.NewUserHandler,
|
|
admin.NewGroupHandler,
|
|
admin.ProvideAccountHandler,
|
|
admin.NewAnnouncementHandler,
|
|
admin.NewDataManagementHandler,
|
|
admin.NewBackupHandler,
|
|
admin.NewOAuthHandler,
|
|
admin.NewOpenAIOAuthHandler,
|
|
admin.NewGeminiOAuthHandler,
|
|
admin.NewAntigravityOAuthHandler,
|
|
admin.NewGrokOAuthHandler,
|
|
admin.NewProxyHandler,
|
|
admin.NewRedeemHandler,
|
|
admin.NewPromoHandler,
|
|
ProvideAdminSettingHandler,
|
|
admin.NewOpsHandler,
|
|
ProvideSystemHandler,
|
|
admin.NewSubscriptionHandler,
|
|
admin.NewUsageHandler,
|
|
admin.NewUserAttributeHandler,
|
|
admin.NewErrorPassthroughHandler,
|
|
admin.NewTLSFingerprintProfileHandler,
|
|
admin.NewAdminAPIKeyHandler,
|
|
admin.NewScheduledTestHandler,
|
|
admin.NewChannelHandler,
|
|
admin.NewChannelMonitorHandler,
|
|
admin.NewChannelMonitorRequestTemplateHandler,
|
|
admin.NewContentModerationHandler,
|
|
admin.NewPaymentHandler,
|
|
admin.NewAffiliateHandler,
|
|
admin.NewComplianceHandler,
|
|
admin.NewAuditLogHandler,
|
|
|
|
// AdminHandlers and Handlers constructors
|
|
ProvideAdminHandlers,
|
|
ProvideHandlers,
|
|
)
|