From 7d1707ca7cac2c41eaa2c9596570d63adf133bf9 Mon Sep 17 00:00:00 2001 From: wangchuxiao <wangchuxiao97@outlook.com> Date: Mon, 15 Aug 2022 16:51:41 +0800 Subject: [PATCH] fix log --- cmd/open_im_demo/main.go | 8 +- internal/demo/register/invitation_code.go | 112 ++++++++++++++ internal/demo/register/ip_limit.go | 137 ++++++++++++++++++ internal/demo/register/set_password.go | 26 +++- internal/rpc/auth/auth.go | 7 - pkg/base_info/pagination.go | 6 + .../mysql_model/im_mysql_model/demo_model.go | 7 +- .../im_mysql_model/invitation_model.go | 32 +++- .../db/mysql_model/im_mysql_model/ip_model.go | 40 +++++ .../mysql_model/im_mysql_model/user_model.go | 37 ----- script/check_all.sh | 2 +- 11 files changed, 359 insertions(+), 55 deletions(-) create mode 100644 internal/demo/register/invitation_code.go create mode 100644 internal/demo/register/ip_limit.go create mode 100644 pkg/base_info/pagination.go create mode 100644 pkg/common/db/mysql_model/im_mysql_model/ip_model.go diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 72eeee974..90d225fa0 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -40,8 +40,14 @@ func main() { demoRouterGroup.POST("/login", register.Login) demoRouterGroup.POST("/reset_password", register.ResetPassword) } + cmsRouterGroup := r.Group("/cms") + { + cmsRouterGroup.POST("/generate_invitation_code", register.GenerateInvitationCode) + cmsRouterGroup.POST("/query_invitation_code", register.QueryInvitationCode) + cmsRouterGroup.POST("/get_invitation_codes", register.GetInvitationCodes) + } defaultPorts := config.Config.Demo.Port - ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 42233 as port") + ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 10004 as port") flag.Parse() fmt.Println("start demo api server, port: ", *ginPort) address := "0.0.0.0:" + strconv.Itoa(*ginPort) diff --git a/internal/demo/register/invitation_code.go b/internal/demo/register/invitation_code.go new file mode 100644 index 000000000..51aac1aa3 --- /dev/null +++ b/internal/demo/register/invitation_code.go @@ -0,0 +1,112 @@ +package register + +import ( + apiStruct "Open_IM/pkg/base_info" + "Open_IM/pkg/common/constant" + imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" + "Open_IM/pkg/common/log" + "Open_IM/pkg/utils" + "github.com/gin-gonic/gin" + "net/http" + "time" +) + +type InvitationCode struct { + InvitationCode string `json:"invitationCode"` + CreateTime time.Time `json:"createTime"` + UserID string `json:"userID"` + LastTime time.Time `json:"lastTime"` + Status int32 `json:"status"` +} + +type GenerateInvitationCodeReq struct { + CodesNum int `json:"codesNum" binding:"required"` + CodeLen int `json:"codeLen" binding:"required"` + OperationID string `json:"operationID" binding:"required"` +} + +type GenerateInvitationCodeResp struct { + Codes []string `json:"codes"` +} + +func GenerateInvitationCode(c *gin.Context) { + req := GenerateInvitationCodeReq{} + resp := GenerateInvitationCodeResp{} + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + return + } + var err error + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) + resp.Codes, err = imdb.BatchCreateInvitationCodes(req.CodesNum, req.CodeLen) + if err != nil { + log.NewError(req.OperationID, "BatchCreateInvitationCodes failed", req.CodesNum, req.CodeLen) + c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrDB, "errMsg": "Verification code error!"}) + return + } + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) +} + +type QueryInvitationCodeReq struct { + Code string `json:"code" binding:"required"` + OperationID string `json:"operationID" binding:"required"` +} + +type QueryInvitationCodeResp struct { + InvitationCode +} + +func QueryInvitationCode(c *gin.Context) { + req := QueryInvitationCodeReq{} + resp := QueryInvitationCodeResp{} + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + return + } + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) + invitation, err := imdb.GetInvitationCode(req.Code) + if err != nil { + log.NewError(req.OperationID, "GetInvitationCode failed", req.Code) + c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrDB, "errMsg": "Verification code error!"}) + return + } + resp.UserID = invitation.UserID + resp.CreateTime = invitation.CreateTime + resp.Status = invitation.Status + resp.LastTime = invitation.LastTime + resp.InvitationCode.InvitationCode = invitation.InvitationCode + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp:", resp) + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) +} + +type GetInvitationCodesReq struct { + Status int32 `json:"status" binding:"required"` + OperationID string `json:"operationID" binding:"required"` + apiStruct.Pagination +} + +type GetInvitationCodesResp struct { + apiStruct.Pagination + codes []InvitationCode +} + +func GetInvitationCodes(c *gin.Context) { + req := GetInvitationCodesReq{} + resp := GetInvitationCodesResp{} + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + return + } + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) + codes, err := imdb.GetInvitationCodes(req.ShowNumber, req.PageNumber, req.Status) + if err != nil { + log.NewError(req.OperationID, "GetInvitationCode failed", req.ShowNumber, req.PageNumber, req.Status) + c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrDB, "errMsg": "Verification code error!"}) + return + } + resp.Pagination.PageNumber = req.PageNumber + resp.Pagination.ShowNumber = req.ShowNumber + utils.CopyStructFields(codes, resp.codes) + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp:", resp) + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) +} diff --git a/internal/demo/register/ip_limit.go b/internal/demo/register/ip_limit.go new file mode 100644 index 000000000..9e4e42eee --- /dev/null +++ b/internal/demo/register/ip_limit.go @@ -0,0 +1,137 @@ +package register + +import ( + "Open_IM/pkg/common/constant" + "Open_IM/pkg/common/db" + imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" + "Open_IM/pkg/common/log" + "Open_IM/pkg/utils" + "github.com/gin-gonic/gin" + "net/http" + "time" +) + +type QueryIPReq struct { + OperationID string `json:"operationID"` + IP string `json:"ip"` +} + +type QueryIPResp struct { + IP string `json:"ip"` + RegisterNum int `json:"num"` + UserIDList []string `json:"userIDList"` + Status int +} + +func QueryIP(c *gin.Context) { + req := QueryIPReq{} + resp := QueryIPResp{} + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + return + } + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) + ips, err := imdb.QueryUserIPLimits(req.IP) + if err != nil { + log.NewError(req.OperationID, "GetInvitationCode failed", req.IP) + c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrDB, "errMsg": "QueryUserIPLimits error!"}) + return + } + resp.IP = req.IP + resp.RegisterNum = len(ips) + for _, ip := range ips { + resp.UserIDList = append(resp.UserIDList, ip.UserID) + } + b, _ := imdb.IsLimitLoginIp(req.IP) + if b == true { + resp.Status = 1 + } + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "resp:", resp) + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data": resp}) +} + +type GetIPListReq struct { +} + +type GetIPListResp struct { +} + +func GetIPList(c *gin.Context) { + +} + +type AddIPLimitReq struct { + OperationID string `json:"operationID"` + IP string `json:"ip"` + LimitTime int32 `json:"limitTime"` +} + +type AddIPLimitResp struct { +} + +func AddIPLimit(c *gin.Context) { + req := AddIPLimitReq{} + //resp := AddIPLimitResp{} + if err := c.BindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + return + } + log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "req:", req) + if err := imdb.InsertOneIntoIpLimits(db.IpLimit{ + Ip: req.IP, + LimitRegister: 1, + LimitLogin: 1, + CreateTime: time.Now(), + LimitTime: time.Time{}, + }); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.IP, req.LimitTime) + c.JSON(http.StatusInternalServerError, gin.H{"errCode": constant.ErrDB, "errMsg": "InsertOneIntoIpLimits error!"}) + return + } + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": ""}) +} + +type RemoveIPLimitReq struct { +} + +type RemoveIPLimitResp struct { +} + +func RemoveIPLimit(c *gin.Context) { + +} + +// ===========================================sk 写 + +type QueryUserIDIPLimitReq struct { + UserID string `json:"userID" binding:"required"` +} + +type QueryUserIDIPLimitResp struct { +} + +func QueryUserIDIPLimit(c *gin.Context) { + +} + +type AddUserIPLimitReq struct { +} + +type AddUserIPLimitResp struct { +} + +// 添加ip 特定用户才能登录 user_ip_limits 表 +func AddUserIPLimit(c *gin.Context) { + +} + +type RemoveUserIPLimitReq struct { +} + +type RemoveUserIPLimitResp struct { +} + +// 删除ip 特定用户才能登录 user_ip_limits 表 +func RemoveUserIPLimit(c *gin.Context) { + +} diff --git a/internal/demo/register/set_password.go b/internal/demo/register/set_password.go index 3f5d691cd..79c74a261 100644 --- a/internal/demo/register/set_password.go +++ b/internal/demo/register/set_password.go @@ -5,9 +5,10 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/db" - "Open_IM/pkg/common/db/mysql_model/im_mysql_model" + imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" http2 "Open_IM/pkg/common/http" "Open_IM/pkg/common/log" + pbAuth "Open_IM/pkg/proto/auth" pbFriend "Open_IM/pkg/proto/friend" "Open_IM/pkg/utils" "encoding/json" @@ -41,6 +42,17 @@ func SetPassword(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) return } + + var ip string + Limited, LimitError := imdb.IsLimitRegisterIp(ip) + if LimitError != nil { + log.Error(params.OperationID, utils.GetSelfFuncName(), LimitError, ip) + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + } + if Limited { + c.JSON(http.StatusBadRequest, gin.H{"errCode": constant.FormattingError, "errMsg": err.Error()}) + } + var account string if params.Email != "" { account = params.Email @@ -65,7 +77,7 @@ func SetPassword(c *gin.Context) { } } if config.Config.Demo.NeedInvitationCode { - err := im_mysql_model.CheckInvitationCode(params.InvitationCode) + err := imdb.CheckInvitationCode(params.InvitationCode) if err != nil { c.JSON(http.StatusOK, gin.H{"errCode": constant.InvitationError, "errMsg": "邀请码错误"}) } @@ -120,12 +132,20 @@ func SetPassword(c *gin.Context) { return } log.Info(params.OperationID, "begin store mysql", account, params.Password, "info", params.FaceURL, params.Nickname) - err = im_mysql_model.SetPassword(account, params.Password, params.Ex, userID, params.AreaCode) + err = imdb.SetPassword(account, params.Password, params.Ex, userID, params.AreaCode) if err != nil { log.NewError(params.OperationID, "set phone number password error", account, "err", err.Error()) c.JSON(http.StatusOK, gin.H{"errCode": constant.RegisterFailed, "errMsg": err.Error()}) return } + if config.Config.Demo.NeedInvitationCode { + //判断一下验证码的使用情况 + LockSucc := imdb.TryLockInvitationCode(params.InvitationCode, userID) + if LockSucc { + imdb.FinishInvitationCode(params.InvitationCode, userID) + } + } + log.Info(params.OperationID, "end setPassword", account, params.Password) // demo onboarding if params.UserID == "" && config.Config.Demo.OnboardProcess { diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 399c5c567..6bdedd091 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -30,13 +30,6 @@ func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) user.Birth = utils.UnixSecondToTime(int64(req.UserInfo.Birth)) } log.Debug(req.OperationID, "copy ", user, req.UserInfo) - Limited, LimitError := imdb.IsLimitRegisterIp(req.UserInfo.CreateIp) - if LimitError != nil { - return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: LimitError.Error()}}, nil - } - if Limited { - return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.RegisterLimit, ErrMsg: "Register Limit"}}, nil - } err := imdb.UserRegister(user) if err != nil { if err == constant.InvitationMsg { diff --git a/pkg/base_info/pagination.go b/pkg/base_info/pagination.go new file mode 100644 index 000000000..d73725632 --- /dev/null +++ b/pkg/base_info/pagination.go @@ -0,0 +1,6 @@ +package base_info + +type Pagination struct { + PageNumber int32 `json:"pageNumber" binding:"required"` + ShowNumber int32 `json:"showNumber" binding:"required"` +} diff --git a/pkg/common/db/mysql_model/im_mysql_model/demo_model.go b/pkg/common/db/mysql_model/im_mysql_model/demo_model.go index 8184b5a6e..4c5b25b4a 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/demo_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/demo_model.go @@ -2,6 +2,7 @@ package im_mysql_model import ( "Open_IM/pkg/common/db" + "errors" _ "gorm.io/gorm" ) @@ -46,7 +47,11 @@ func AddUserRegisterAddFriendIDList(userIDList ...string) error { for _, v := range userIDList { list = append(list, db.RegisterAddFriend{UserID: v}) } - err := db.DB.MysqlDB.DefaultGormDB().Create(list).Error + result := db.DB.MysqlDB.DefaultGormDB().Create(list) + if int(result.RowsAffected) < len(userIDList) { + return errors.New("some line insert failed") + } + err := result.Error return err } diff --git a/pkg/common/db/mysql_model/im_mysql_model/invitation_model.go b/pkg/common/db/mysql_model/im_mysql_model/invitation_model.go index 0f5c3d030..56e22dd34 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/invitation_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/invitation_model.go @@ -3,6 +3,7 @@ package im_mysql_model import ( "Open_IM/pkg/common/db" "errors" + "github.com/jinzhu/gorm" "math/rand" "time" ) @@ -10,15 +11,17 @@ import ( /** * 批量生成邀请码 */ -func BatchCreateInvitationCodes(CodeNums int, CodeLen int) error { +func BatchCreateInvitationCodes(CodeNums int, CodeLen int) ([]string, error) { i := CodeNums + var codes []string for { if i == 0 { break } + code := CreateRandomString(CodeLen) invitation := new(db.Invitation) invitation.CreateTime = time.Now() - invitation.InvitationCode = CreateRandomString(CodeLen) + invitation.InvitationCode = code invitation.LastTime = time.Now() invitation.Status = 0 invitation.UserID = "" @@ -29,8 +32,9 @@ func BatchCreateInvitationCodes(CodeNums int, CodeLen int) error { if result.RowsAffected > 0 { i = i - 1 } + codes = append(codes, code) } - return nil + return codes, nil } /** @@ -54,9 +58,9 @@ func CheckInvitationCode(code string) error { /** * 尝试加锁模式解决邀请码抢占的问题 */ -func TryLockInvitationCode(Code string, UserId string) bool { +func TryLockInvitationCode(Code string, UserID string) bool { Data := make(map[string]interface{}, 0) - Data["user_id"] = UserId + Data["user_id"] = UserID Data["status"] = 1 Data["last_time"] = time.Now() result := db.DB.MysqlDB.DefaultGormDB().Table("invitations").Where("invitation_code=? and user_id=? and status=?", Code, "", 0).Updates(Data) @@ -79,6 +83,17 @@ func FinishInvitationCode(Code string, UserId string) bool { return result.RowsAffected > 0 } +func GetInvitationCode(code string) (*db.Invitation, error) { + invitation := &db.Invitation{ + InvitationCode: code, + } + err := db.DB.MysqlDB.DefaultGormDB().Model(invitation).Find(invitation).Error + if gorm.IsRecordNotFoundError(err) { + return invitation, nil + } + return invitation, err +} + func CreateRandomString(strlen int) string { str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" bytes := []byte(str) @@ -89,3 +104,10 @@ func CreateRandomString(strlen int) string { } return string(result) } + +func GetInvitationCodes(pageNumber, showNumber, status int32) ([]db.Invitation, error) { + var invitationList []db.Invitation + err := db.DB.MysqlDB.DefaultGormDB().Model(db.Invitation{}).Limit(int(showNumber)).Offset(int(showNumber*(pageNumber-1))).Where("status=?", status). + Order("create_time desc").Find(&invitationList).Error + return invitationList, err +} diff --git a/pkg/common/db/mysql_model/im_mysql_model/ip_model.go b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go new file mode 100644 index 000000000..e5a09f238 --- /dev/null +++ b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go @@ -0,0 +1,40 @@ +package im_mysql_model + +import "Open_IM/pkg/common/db" + +func IsLimitRegisterIp(RegisterIp string) (bool, error) { + //如果已经存在则限制 + var count int64 + if err := db.DB.MysqlDB.DefaultGormDB().Table("ip_limits").Where("ip=? and limit_register=? and limit_time>now()", RegisterIp, 1).Count(&count).Error; err != nil { + return false, err + } + return count > 0, nil +} + +func IsLimitLoginIp(LoginIp string) (bool, error) { + //如果已经存在则限制 + var count int64 + if err := db.DB.MysqlDB.DefaultGormDB().Table("ip_limits").Where("ip=? and limit_login=? and limit_time>now()", LoginIp, 1).Count(&count).Error; err != nil { + return false, err + } + return count > 0, nil +} + +func IsLimitUserLoginIp(userID string, LoginIp string) (bool, error) { + //如果已经存在则放行 + var count int64 + if err := db.DB.MysqlDB.DefaultGormDB().Table("user_ip_limits").Where("ip=? and user_id=?", LoginIp, userID).Count(&count).Error; err != nil { + return false, err + } + return count == 0, nil +} + +func QueryUserIPLimits(ip string) ([]db.UserIpLimit, error) { + var ips []db.UserIpLimit + err := db.DB.MysqlDB.DefaultGormDB().Model(&db.UserIpLimit{}).Where("ip=?", ip).Find(&ips).Error + return ips, err +} + +func InsertOneIntoIpLimits(ipLimits db.IpLimit) error { + return db.DB.MysqlDB.DefaultGormDB().Model(&db.IpLimit{}).Create(ipLimits).Error +} diff --git a/pkg/common/db/mysql_model/im_mysql_model/user_model.go b/pkg/common/db/mysql_model/im_mysql_model/user_model.go index c91444259..c8a5d603e 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/user_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/user_model.go @@ -46,20 +46,10 @@ func UserRegister(user db.User) error { user.LastLoginTime = time.Now() user.LoginTimes = 0 user.LastLoginIp = user.CreateIp - if config.Config.Demo.NeedInvitationCode { - //判断一下验证码的使用情况 - LockSucc := TryLockInvitationCode(user.InvitationCode, user.UserID) - if !LockSucc { - return constant.InvitationMsg - } - } err := db.DB.MysqlDB.DefaultGormDB().Table("users").Create(&user).Error if err != nil { return err } - if config.Config.Demo.NeedInvitationCode { - FinishInvitationCode(user.InvitationCode, user.UserID) - } return nil } @@ -288,30 +278,3 @@ func GetBlockUsersNumCount() (int32, error) { } return int32(count), nil } - -func IsLimitRegisterIp(RegisterIp string) (bool, error) { - //如果已经存在则限制 - var count int64 - if err := db.DB.MysqlDB.DefaultGormDB().Table("ip_limits").Where("ip=? and limit_register=? and limit_time>now()", RegisterIp, 1).Count(&count).Error; err != nil { - return false, err - } - return count > 0, nil -} - -func IsLimitLoginIp(LoginIp string) (bool, error) { - //如果已经存在则限制 - var count int64 - if err := db.DB.MysqlDB.DefaultGormDB().Table("ip_limits").Where("ip=? and limit_login=? and limit_time>now()", LoginIp, 1).Count(&count).Error; err != nil { - return false, err - } - return count > 0, nil -} - -func IsLimitUserLoginIp(userID string, LoginIp string) (bool, error) { - //如果已经存在则放行 - var count int64 - if err := db.DB.MysqlDB.DefaultGormDB().Table("user_ip_limits").Where("ip=? and user_id=?", LoginIp, userID).Count(&count).Error; err != nil { - return false, err - } - return count == 0, nil -} diff --git a/script/check_all.sh b/script/check_all.sh index 6dbe2c9d1..522230813 100644 --- a/script/check_all.sh +++ b/script/check_all.sh @@ -58,7 +58,7 @@ fi check=$(ps aux | grep -w ./${cron_task_name} | grep -v grep | wc -l) if [ $check -ge 1 ]; then - echo -e ${GREEN_PREFIX}"none port has been listening,belongs service is cron_task_name"${COLOR_SUFFIX} + echo -e ${GREEN_PREFIX}"none port has been listening,belongs service is openImCronTask"${COLOR_SUFFIX} else echo -e ${RED_PREFIX}"cron_task_name service does not start normally"${COLOR_SUFFIX} echo -e ${RED_PREFIX}"please check ../logs/openIM.log "${COLOR_SUFFIX}