package common import ( "crypto/tls" //"os" //"strconv" "sync" "time" "github.com/google/uuid" ) var StartTime = time.Now().Unix() // unit: second var Version = "v0.0.0" // this hard coding will be replaced automatically when building, no need to manually change var SystemName = "TokenFactory" var Footer = "" var Logo = "" var TopUpLink = "" // var ChatLink = "" // var ChatLink2 = "" var QuotaPerUnit = 500 * 1000.0 // $0.002 / 1K tokens // 保留旧变量以兼容历史逻辑,实际展示由 general_setting.quota_display_type 控制 var DisplayInCurrencyEnabled = true var DisplayTokenStatEnabled = true var DrawingEnabled = true var TaskEnabled = true var DataExportEnabled = true var DataExportInterval = 5 // unit: minute var DataExportDefaultTime = "hour" // unit: minute var DefaultCollapseSidebar = false // default value of collapse sidebar // Any options with "Secret", "Token" in its key won't be return by GetOptions var SessionSecret = uuid.New().String() var CryptoSecret = uuid.New().String() var OptionMap map[string]string var OptionMapRWMutex sync.RWMutex var ItemsPerPage = 10 var MaxRecentItems = 1000 var PasswordLoginEnabled = true var PasswordRegisterEnabled = true var EmailVerificationEnabled = false var GitHubOAuthEnabled = false var LinuxDOOAuthEnabled = false var WeChatAuthEnabled = false var TelegramOAuthEnabled = false var TurnstileCheckEnabled = false var RegisterEnabled = true var EmailDomainRestrictionEnabled = false // 是否启用邮箱域名限制 var EmailAliasRestrictionEnabled = false // 是否启用邮箱别名限制 var EmailDomainWhitelist = []string{ "gmail.com", "163.com", "126.com", "qq.com", "outlook.com", "hotmail.com", "icloud.com", "yahoo.com", "foxmail.com", } var EmailLoginAuthServerList = []string{ "smtp.sendcloud.net", "smtp.azurecomm.net", } var DebugEnabled bool var MemoryCacheEnabled bool var LogConsumeEnabled = true var TLSInsecureSkipVerify bool var InsecureTLSConfig = &tls.Config{InsecureSkipVerify: true} var SMTPServer = "" var SMTPPort = 587 var SMTPSSLEnabled = false var SMTPAccount = "" var SMTPFrom = "" var SMTPToken = "" var GitHubClientId = "" var GitHubClientSecret = "" var LinuxDOClientId = "" var LinuxDOClientSecret = "" var LinuxDOMinimumTrustLevel = 0 var WeChatServerAddress = "" var WeChatServerToken = "" var WeChatAccountQRCodeImageURL = "" var TurnstileSiteKey = "" var TurnstileSecretKey = "" var TelegramBotToken = "" var TelegramBotName = "" // 短信注册配置(支持通过 options 动态调整)。 var SMSVerificationEnabled = false var SMSAccessKeyID = "" var SMSAccessKeySecret = "" var SMSCodeSignName = "" var SMSCodeTemplateCode = "" var SMSCodeValidMinutes = 5 var SMSCodeCooldownMinutes = 1 var SMSCodeDailyLimit = 10 var SMSPhoneBlacklist = []string{} var QuotaForNewUser = 0 var QuotaForInviter = 0 var QuotaForInvitee = 0 // StudentApprovalRewardQuota: 学员申请审批通过时赠送给用户的额度(内部 quota 单位)。 // 默认 50 USD(按默认 QuotaPerUnit=500000 换算为 25000000)。 var StudentApprovalRewardQuota = 50 * 500 * 1000 // AffiliateDefaultCommissionBps 被邀请用户充值时给邀请人的默认分销比例,存储为万分之一单位(1=0.01%,100=1%,1000=10%)。单用户可在 aff_invite_relations 覆盖。默认 1000 即 10%。 var AffiliateDefaultCommissionBps = 1000 var ChannelDisableThreshold = 5.0 var AutomaticDisableChannelEnabled = false var AutomaticEnableChannelEnabled = false var QuotaRemindThreshold = 1000 var PreConsumedQuota = 500 var RetryTimes = 0 //var RootUserEmail = "" var IsMasterNode bool var requestInterval int var RequestInterval time.Duration var SyncFrequency int // unit is second var BatchUpdateEnabled = false var BatchUpdateInterval int var RelayTimeout int // unit is second var RelayMaxIdleConns int var RelayMaxIdleConnsPerHost int var GeminiSafetySetting string // https://docs.cohere.com/docs/safety-modes Type; NONE/CONTEXTUAL/STRICT var CohereSafetySetting string const ( RequestIdKey = "X-Oneapi-Request-Id" ) const ( RoleGuestUser = 0 RoleCommonUser = 1 RoleDistributorUser = 5 // 已废弃:历史「分销商」曾用 role=5,现已迁移为 role=1 + is_distributor=1;请勿在新逻辑中使用该角色值 RoleAdminUser = 10 RoleRootUser = 100 ) // DistributorFlagNo / DistributorFlagYes:users.is_distributor 存库与 JSON 统一用 0/1(与 role 解耦的分销资格标记)。 const ( DistributorFlagNo = 0 DistributorFlagYes = 1 ) // UserCreatedBy:users.created_by,标记账号创建来源(管理端展示)。未显式设置时 Insert/InsertWithTx 默认为 registration。 const ( UserCreatedByRegistration = "registration" // 自助注册(密码、短信、OAuth、微信等) UserCreatedByAdmin = "admin" // 管理员后台创建 UserCreatedByImport = "import" // 批量导入或外部脚本写入 UserCreatedByBootstrap = "bootstrap" // 安装向导或首次启动自动创建 root ) func IsValidateRole(role int) bool { return role == RoleGuestUser || role == RoleCommonUser || role == RoleDistributorUser || role == RoleAdminUser || role == RoleRootUser } var ( FileUploadPermission = RoleGuestUser FileDownloadPermission = RoleGuestUser ImageUploadPermission = RoleGuestUser ImageDownloadPermission = RoleGuestUser ) // All duration's unit is seconds // Shouldn't larger then RateLimitKeyExpirationDuration var ( GlobalApiRateLimitEnable bool GlobalApiRateLimitNum int GlobalApiRateLimitDuration int64 GlobalWebRateLimitEnable bool GlobalWebRateLimitNum int GlobalWebRateLimitDuration int64 CriticalRateLimitEnable bool CriticalRateLimitNum = 20 CriticalRateLimitDuration int64 = 20 * 60 UploadRateLimitNum = 10 UploadRateLimitDuration int64 = 60 DownloadRateLimitNum = 10 DownloadRateLimitDuration int64 = 60 // Per-user search rate limit (applies after authentication, keyed by user ID) SearchRateLimitEnable = true SearchRateLimitNum = 10 SearchRateLimitDuration int64 = 60 ) var RateLimitKeyExpirationDuration = 20 * time.Minute const ( UserStatusEnabled = 1 // don't use 0, 0 is the default value! UserStatusDisabled = 2 // also don't use 0 ) const ( StudentStatusNone = 0 StudentStatusPending = 1 StudentStatusApproved = 2 StudentStatusRejected = 3 ) const ( TokenStatusEnabled = 1 // don't use 0, 0 is the default value! TokenStatusDisabled = 2 // also don't use 0 TokenStatusExpired = 3 TokenStatusExhausted = 4 ) const ( RedemptionCodeStatusEnabled = 1 // don't use 0, 0 is the default value! RedemptionCodeStatusDisabled = 2 // also don't use 0 RedemptionCodeStatusUsed = 3 // also don't use 0 ) const ( ChannelStatusUnknown = 0 ChannelStatusEnabled = 1 // don't use 0, 0 is the default value! ChannelStatusManuallyDisabled = 2 // also don't use 0 ChannelStatusAutoDisabled = 3 ) const ( TopUpStatusPending = "pending" TopUpStatusSuccess = "success" TopUpStatusFailed = "failed" TopUpStatusExpired = "expired" )