Compare commits

..

No commits in common. "98d8525fa94f11b8c62480410658c6c26d3eaaad" and "92f278d38bb635749d7bbe97c3fc4ddef32186c3" have entirely different histories.

5 changed files with 7 additions and 31 deletions

View File

@ -87,11 +87,12 @@ type RegisterConfig struct {
TrialSubscribe int64 `yaml:"TrialSubscribe" default:"0"` TrialSubscribe int64 `yaml:"TrialSubscribe" default:"0"`
TrialTime int64 `yaml:"TrialTime" default:"0"` TrialTime int64 `yaml:"TrialTime" default:"0"`
TrialTimeUnit string `yaml:"TrialTimeUnit" default:""` TrialTimeUnit string `yaml:"TrialTimeUnit" default:""`
TrialEmailDomainWhitelist string `yaml:"TrialEmailDomainWhitelist" default:""`
IpRegisterLimit int64 `yaml:"IpRegisterLimit" default:"0"` IpRegisterLimit int64 `yaml:"IpRegisterLimit" default:"0"`
IpRegisterLimitDuration int64 `yaml:"IpRegisterLimitDuration" default:"0"` IpRegisterLimitDuration int64 `yaml:"IpRegisterLimitDuration" default:"0"`
EnableIpRegisterLimit bool `yaml:"EnableIpRegisterLimit" default:"false"` EnableIpRegisterLimit bool `yaml:"EnableIpRegisterLimit" default:"false"`
DeviceLimit int64 `yaml:"DeviceLimit" default:"2"` DeviceLimit int64 `yaml:"DeviceLimit" default:"2"`
EnableTrialEmailWhitelist bool `yaml:"EnableTrialEmailWhitelist" default:"false"`
TrialEmailDomainWhitelist string `yaml:"TrialEmailDomainWhitelist" default:""`
} }
type EmailConfig struct { type EmailConfig struct {

View File

@ -126,7 +126,7 @@ func (l *EmailLoginLogic) EmailLogin(req *types.EmailLoginRequest) (resp *types.
return err return err
} }
rc := l.svcCtx.Config.Register rc := l.svcCtx.Config.Register
if rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist) { if rc.EnableTrial && (!rc.EnableTrialEmailWhitelist || IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist)) {
if err = l.activeTrial(userInfo.Id); err != nil { if err = l.activeTrial(userInfo.Id); err != nil {
return err return err
} }

View File

@ -4,7 +4,6 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"time" "time"
"github.com/perfect-panel/server/internal/config" "github.com/perfect-panel/server/internal/config"
@ -394,15 +393,10 @@ func (l *OAuthLoginGetTokenLogic) register(email, avatar, method, openid, reques
} }
} }
rc := l.svcCtx.Config.Register if l.svcCtx.Config.Register.EnableTrial {
// Only activate trial if email domain is in whitelist (whitelist cannot be empty)
shouldActivateTrial := rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && (email != "" && l.isEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist))
if shouldActivateTrial {
l.Debugw("activating trial subscription", l.Debugw("activating trial subscription",
logger.Field("request_id", requestID), logger.Field("request_id", requestID),
logger.Field("user_id", userInfo.Id), logger.Field("user_id", userInfo.Id),
logger.Field("email", email),
) )
var trialErr error var trialErr error
trialSubscribe, trialErr = l.activeTrial(userInfo.Id, requestID) trialSubscribe, trialErr = l.activeTrial(userInfo.Id, requestID)
@ -888,22 +882,3 @@ func (l *OAuthLoginGetTokenLogic) activeTrial(uid int64, requestID string) (*use
) )
return userSub, nil return userSub, nil
} }
// isEmailDomainWhitelisted checks if the email's domain is in the comma-separated whitelist.
// Returns false if the email format is invalid.
func (l *OAuthLoginGetTokenLogic) isEmailDomainWhitelisted(email, whitelistCSV string) bool {
if whitelistCSV == "" {
return false
}
parts := strings.SplitN(email, "@", 2)
if len(parts) != 2 {
return false
}
domain := strings.ToLower(strings.TrimSpace(parts[1]))
for _, d := range strings.Split(whitelistCSV, ",") {
if strings.ToLower(strings.TrimSpace(d)) == domain {
return true
}
}
return false
}

View File

@ -148,7 +148,7 @@ func (l *UserRegisterLogic) UserRegister(req *types.UserRegisterRequest) (resp *
// Activate trial subscription after transaction success (moved outside transaction to reduce lock time) // Activate trial subscription after transaction success (moved outside transaction to reduce lock time)
rc := l.svcCtx.Config.Register rc := l.svcCtx.Config.Register
if rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist) { if rc.EnableTrial && (!rc.EnableTrialEmailWhitelist || IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist)) {
trialSubscribe, err = l.activeTrial(userInfo.Id) trialSubscribe, err = l.activeTrial(userInfo.Id)
if err != nil { if err != nil {
l.Errorw("Failed to activate trial subscription", logger.Field("error", err.Error())) l.Errorw("Failed to activate trial subscription", logger.Field("error", err.Error()))

View File

@ -209,10 +209,10 @@ func (l *BindEmailWithVerificationLogic) refreshBindSessionToken(userId int64) (
} }
// tryGrantTrialOnEmailBind grants trial subscription to the email user (family owner) // tryGrantTrialOnEmailBind grants trial subscription to the email user (family owner)
// if email domain is in the configured whitelist (or if whitelist is empty, no trial is granted). // if EnableTrialEmailWhitelist is on and the email domain matches.
func (l *BindEmailWithVerificationLogic) tryGrantTrialOnEmailBind(ownerUserId int64, email string) { func (l *BindEmailWithVerificationLogic) tryGrantTrialOnEmailBind(ownerUserId int64, email string) {
rc := l.svcCtx.Config.Register rc := l.svcCtx.Config.Register
if !rc.EnableTrial || rc.TrialEmailDomainWhitelist == "" { if !rc.EnableTrial || !rc.EnableTrialEmailWhitelist {
return return
} }
if !auth.IsEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist) { if !auth.IsEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist) {