From 01eab942fd21fa3c606c8ddba88799599257afe5 Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Sat, 1 Nov 2025 09:31:38 -0700 Subject: [PATCH] =?UTF-8?q?fix(auth):=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=B3=A8=E5=86=8C=E5=92=8C=E7=99=BB=E5=BD=95=E5=90=8E?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=B8=85=E7=90=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在用户注册、登录、修改订阅和删除订阅等操作后,添加清理服务器缓存的逻辑 同时修复电话重置密码验证码解析问题 --- .../admin/user/deleteUserSubscribeLogic.go | 4 +++ .../admin/user/updateUserSubscribeLogic.go | 5 ++++ internal/logic/auth/deviceLoginLogic.go | 3 +++ .../logic/auth/telephoneResetPasswordLogic.go | 20 ++++++++++++--- .../logic/auth/telephoneUserRegisterLogic.go | 9 ++++++- internal/logic/auth/userRegisterLogic.go | 9 ++++++- internal/model/node/model.go | 25 +++++++++++++++++++ pkg/ip/ip.go | 12 +++++++++ 8 files changed, 82 insertions(+), 5 deletions(-) diff --git a/internal/logic/admin/user/deleteUserSubscribeLogic.go b/internal/logic/admin/user/deleteUserSubscribeLogic.go index 397299d..209c23e 100644 --- a/internal/logic/admin/user/deleteUserSubscribeLogic.go +++ b/internal/logic/admin/user/deleteUserSubscribeLogic.go @@ -48,5 +48,9 @@ func (l *DeleteUserSubscribeLogic) DeleteUserSubscribe(req *types.DeleteUserSubs l.Errorw("failed to clear subscribe cache", logger.Field("error", err.Error()), logger.Field("subscribeId", userSubscribe.SubscribeId)) return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "failed to clear subscribe cache: %v", err.Error()) } + if err = l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); err != nil { + l.Errorf("ClearServerAllCache error: %v", err.Error()) + return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "failed to clear server cache: %v", err.Error()) + } return nil } diff --git a/internal/logic/admin/user/updateUserSubscribeLogic.go b/internal/logic/admin/user/updateUserSubscribeLogic.go index 9d92ce5..23c2d2f 100644 --- a/internal/logic/admin/user/updateUserSubscribeLogic.go +++ b/internal/logic/admin/user/updateUserSubscribeLogic.go @@ -69,5 +69,10 @@ func (l *UpdateUserSubscribeLogic) UpdateUserSubscribe(req *types.UpdateUserSubs l.Errorw("failed to clear subscribe cache", logger.Field("error", err.Error()), logger.Field("subscribeId", userSub.SubscribeId)) return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "failed to clear subscribe cache: %v", err.Error()) } + + if err = l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); err != nil { + l.Errorf("ClearServerAllCache error: %v", err.Error()) + return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "failed to clear server cache: %v", err.Error()) + } return nil } diff --git a/internal/logic/auth/deviceLoginLogic.go b/internal/logic/auth/deviceLoginLogic.go index e3db871..617d202 100644 --- a/internal/logic/auth/deviceLoginLogic.go +++ b/internal/logic/auth/deviceLoginLogic.go @@ -303,6 +303,9 @@ func (l *DeviceLoginLogic) activeTrial(userId int64, db *gorm.DB) error { logger.Field("expire_time", expireTime), logger.Field("traffic", sub.Traffic), ) + if clearErr := l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); clearErr != nil { + l.Errorf("ClearServerAllCache error: %v", clearErr.Error()) + } return nil } diff --git a/internal/logic/auth/telephoneResetPasswordLogic.go b/internal/logic/auth/telephoneResetPasswordLogic.go index 5cb47cc..b585c99 100644 --- a/internal/logic/auth/telephoneResetPasswordLogic.go +++ b/internal/logic/auth/telephoneResetPasswordLogic.go @@ -2,6 +2,7 @@ package auth import ( "context" + "encoding/json" "fmt" "time" @@ -43,19 +44,32 @@ func (l *TelephoneResetPasswordLogic) TelephoneResetPassword(req *types.Telephon return nil, errors.Wrapf(xerr.NewErrCode(xerr.TelephoneError), "Invalid phone number") } - if l.svcCtx.Config.Mobile.Enable { + if !l.svcCtx.Config.Mobile.Enable { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SmsNotEnabled), "sms login is not enabled") } // if the email verification is enabled, the verification code is required - cacheKey := fmt.Sprintf("%s:%s:%s", config.AuthCodeTelephoneCacheKey, constant.Security, phoneNumber) + cacheKey := fmt.Sprintf("%s:%s:%s", config.AuthCodeTelephoneCacheKey, constant.ParseVerifyType(uint8(constant.Security)), phoneNumber) + l.Logger.Infof("TelephoneResetPassword cacheKey: %s, code: %s", cacheKey, code) value, err := l.svcCtx.Redis.Get(l.ctx, cacheKey).Result() if err != nil { l.Errorw("Redis Error", logger.Field("error", err.Error()), logger.Field("cacheKey", cacheKey)) return nil, errors.Wrapf(xerr.NewErrCode(xerr.VerifyCodeError), "code error") } + l.Logger.Infof("TelephoneResetPassword cacheKey: %s, code: %s,value : %s", cacheKey, code, value) + if value == "" { + l.Errorf("TelephoneResetPassword value empty: %s", value) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.VerifyCodeError), "code error") + } - if value != code { + var payload CacheKeyPayload + if err := json.Unmarshal([]byte(value), &payload); err != nil { + l.Errorf("TelephoneResetPassword Unmarshal Error: %s", err.Error()) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.VerifyCodeError), "code error") + } + + if payload.Code != code { + l.Errorf("TelephoneResetPassword code: %s, code: %s", code, payload.Code) return nil, errors.Wrapf(xerr.NewErrCode(xerr.VerifyCodeError), "code error") } diff --git a/internal/logic/auth/telephoneUserRegisterLogic.go b/internal/logic/auth/telephoneUserRegisterLogic.go index af16811..5fad294 100644 --- a/internal/logic/auth/telephoneUserRegisterLogic.go +++ b/internal/logic/auth/telephoneUserRegisterLogic.go @@ -245,5 +245,12 @@ func (l *TelephoneUserRegisterLogic) activeTrial(uid int64) error { UUID: uuidx.NewUUID().String(), Status: 1, } - return l.svcCtx.UserModel.InsertSubscribe(l.ctx, userSub) + err = l.svcCtx.UserModel.InsertSubscribe(l.ctx, userSub) + if err != nil { + return err + } + if clearErr := l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); clearErr != nil { + l.Errorf("ClearServerAllCache error: %v", clearErr.Error()) + } + return err } diff --git a/internal/logic/auth/userRegisterLogic.go b/internal/logic/auth/userRegisterLogic.go index cf959a9..0198911 100644 --- a/internal/logic/auth/userRegisterLogic.go +++ b/internal/logic/auth/userRegisterLogic.go @@ -231,5 +231,12 @@ func (l *UserRegisterLogic) activeTrial(uid int64) error { UUID: uuidx.NewUUID().String(), Status: 1, } - return l.svcCtx.UserModel.InsertSubscribe(l.ctx, userSub) + err = l.svcCtx.UserModel.InsertSubscribe(l.ctx, userSub) + if err != nil { + return err + } + if clearErr := l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); clearErr != nil { + l.Errorf("ClearServerAllCache error: %v", clearErr.Error()) + } + return err } diff --git a/internal/model/node/model.go b/internal/model/node/model.go index b5ab3ca..0fbe274 100644 --- a/internal/model/node/model.go +++ b/internal/model/node/model.go @@ -14,6 +14,7 @@ type customServerLogicModel interface { FilterNodeList(ctx context.Context, params *FilterNodeParams) (int64, []*Node, error) ClearNodeCache(ctx context.Context, params *FilterNodeParams) error CountNodesByIdsAndTags(ctx context.Context, nodeIds []int64, tags []string) (int64, error) + ClearServerAllCache(ctx context.Context) error } const ( @@ -172,6 +173,30 @@ func (m *customServerModel) ClearServerCache(ctx context.Context, serverId int64 return nil } +func (m *customServerModel) ClearServerAllCache(ctx context.Context) error { + var cursor uint64 + var keys []string + prefix := ServerConfigCacheKey + "*" + for { + scanKeys, newCursor, err := m.Cache.Scan(ctx, cursor, prefix, 999).Result() + if err != nil { + m.Logger.Error(ctx, fmt.Sprintf("ClearServerAllCache err:%v", err)) + break + } + m.Logger.Info(ctx, fmt.Sprintf("ClearServerAllCache query keys:%v", scanKeys)) + keys = append(keys, scanKeys...) + cursor = newCursor + if cursor == 0 { + break + } + } + if len(keys) > 0 { + m.Logger.Info(ctx, fmt.Sprintf("ClearServerAllCache keys:%v", keys)) + return m.Cache.Del(ctx, keys...).Err() + } + return nil +} + // InSet 支持多值 OR 查询 func InSet(field string, values []string) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { diff --git a/pkg/ip/ip.go b/pkg/ip/ip.go index b39eda4..b4aebbc 100644 --- a/pkg/ip/ip.go +++ b/pkg/ip/ip.go @@ -55,6 +55,15 @@ var ( // GetRegionByIp queries the geolocation of an IP address using supported services. func GetRegionByIp(ip string) (*GeoLocationResponse, error) { + // 如果是域名,先解析成 IP + if net.ParseIP(ip) == nil { + ips, err := GetIP(ip) + if err != nil || len(ips) == 0 { + return nil, errors.Wrap(err, "无法解析域名为IP") + } + ip = ips[0] // 取第一个解析到的IP + } + for service, enabled := range queryUrls { if enabled { response, err := fetchGeolocation(service, ip) @@ -62,6 +71,9 @@ func GetRegionByIp(ip string) (*GeoLocationResponse, error) { zap.S().Errorf("Failed to fetch geolocation from %s: %v", service, err) continue } + if response.Country == "" { + continue + } return response, nil } }