258 lines
7.0 KiB
Go
258 lines
7.0 KiB
Go
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"
|
||
)
|