| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| package controller |
|
|
| import ( |
| "encoding/json" |
| "net/http" |
| "strings" |
| "veloera/common" |
| "veloera/model" |
| "veloera/setting" |
| "veloera/setting/operation_setting" |
| "veloera/setting/system_setting" |
|
|
| "github.com/gin-gonic/gin" |
| ) |
|
|
| func GetOptions(c *gin.Context) { |
| var options []*model.Option |
| common.OptionMapRWMutex.Lock() |
| for k, v := range common.OptionMap { |
| if strings.HasSuffix(k, "Token") || strings.HasSuffix(k, "Secret") || strings.HasSuffix(k, "Key") { |
| continue |
| } |
| options = append(options, &model.Option{ |
| Key: k, |
| Value: common.Interface2String(v), |
| }) |
| } |
| common.OptionMapRWMutex.Unlock() |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": options, |
| }) |
| return |
| } |
|
|
| func UpdateOption(c *gin.Context) { |
| var option model.Option |
| err := json.NewDecoder(c.Request.Body).Decode(&option) |
| if err != nil { |
| c.JSON(http.StatusBadRequest, gin.H{ |
| "success": false, |
| "message": "无效的参数", |
| }) |
| return |
| } |
| switch option.Key { |
| case "GitHubOAuthEnabled": |
| if option.Value == "true" && common.GitHubClientId == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 GitHub OAuth,请先填入 GitHub Client Id 以及 GitHub Client Secret!", |
| }) |
| return |
| } |
| case "oidc.enabled": |
| if option.Value == "true" && system_setting.GetOIDCSettings().ClientId == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 OIDC 登录,请先填入 OIDC Client Id 以及 OIDC Client Secret!", |
| }) |
| return |
| } |
| case "LinuxDOOAuthEnabled": |
| if option.Value == "true" && common.LinuxDOClientId == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 LinuxDO OAuth,请先填入 LinuxDO Client Id 以及 LinuxDO Client Secret!", |
| }) |
| return |
| } |
| case "IDCFlareOAuthEnabled": |
| if option.Value == "true" && common.IDCFlareClientId == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 IDC Flare OAuth,请先填入 IDC Flare Client Id 以及 IDC Flare Client Secret!", |
| }) |
| return |
| } |
| case "EmailDomainRestrictionEnabled": |
| if option.Value == "true" && len(common.EmailDomainWhitelist) == 0 { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用邮箱域名限制,请先填入限制的邮箱域名!", |
| }) |
| return |
| } |
| case "WeChatAuthEnabled": |
| if option.Value == "true" && common.WeChatServerAddress == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用微信登录,请先填入微信登录相关配置信息!", |
| }) |
| return |
| } |
| case "TurnstileCheckEnabled": |
| if option.Value == "true" && common.TurnstileSiteKey == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 Turnstile 校验,请先填入 Turnstile 校验相关配置信息!", |
| }) |
|
|
| return |
| } |
| case "TelegramOAuthEnabled": |
| if option.Value == "true" && common.TelegramBotToken == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "无法启用 Telegram OAuth,请先填入 Telegram Bot Token!", |
| }) |
| return |
| } |
| case "GroupRatio": |
| err = setting.CheckGroupRatio(option.Value) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| case "ReverseProxyProvider": |
| if option.Value != "nginx" && option.Value != "cloudflare" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "反向代理提供商必须是 nginx 或 cloudflare", |
| }) |
| return |
| } |
|
|
| } |
| err = model.UpdateOption(option.Key, option.Value) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| }) |
| return |
| } |
|
|
| |
| func ValidateFallbackPricing(c *gin.Context) { |
| var config operation_setting.FallbackPricingConfig |
| err := json.NewDecoder(c.Request.Body).Decode(&config) |
| if err != nil { |
| c.JSON(http.StatusBadRequest, gin.H{ |
| "success": false, |
| "message": "无效的参数", |
| }) |
| return |
| } |
|
|
| |
| err = operation_setting.ValidateFallbackPricingConfig(config) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "兜底倍率配置验证通过", |
| }) |
| return |
| } |
|
|