fix: Gmail 泛域名邮箱(含点号/+别名)直接拒绝赠送试用
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 5m23s

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
shanshanzhong 2026-04-21 01:09:34 -07:00
parent f1bfc78d66
commit 23a7a292ef

View File

@ -38,7 +38,35 @@ func ShouldGrantTrialForEmail(register config.RegisterConfig, email string) bool
if register.TrialEmailDomainWhitelist == "" {
return false
}
return IsEmailDomainWhitelisted(email, register.TrialEmailDomainWhitelist)
if !IsEmailDomainWhitelisted(email, register.TrialEmailDomainWhitelist) {
return false
}
// Gmail 系域名local part 含点号或 + 别名的视为泛域名,直接拒绝赠送
if IsDisposableAlias(email) {
return false
}
return true
}
// IsDisposableAlias detects Gmail dot trick and + alias abuse.
// For Gmail-like domains, local part containing "." or "+" is rejected.
// For all other domains, only "+" alias is rejected.
func IsDisposableAlias(email string) bool {
parts := strings.SplitN(strings.ToLower(strings.TrimSpace(email)), "@", 2)
if len(parts) != 2 {
return false
}
local, domain := parts[0], parts[1]
// All domains: reject + alias
if strings.ContainsRune(local, '+') {
return true
}
// Gmail-like domains: reject dots in local part
if isGmailLikeDomain(domain) && strings.ContainsRune(local, '.') {
return true
}
return false
}
// NormalizeEmail returns a canonical form of the email for trial deduplication.