From a51f73654381f289eeee98c353c092636e7dea1d Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 30 Aug 2022 17:39:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=81=E6=8B=89=E6=96=B0=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/user_invitation.go | 32 ++++++++++++++++++-------- modules/auth/user_form.go | 3 ++- routers/routes/routes.go | 1 + routers/user/Invitation.go | 41 ++++++++++++++++++++++++++++++--- routers/user/auth.go | 46 ++++++++++++++++++++------------------ 5 files changed, 88 insertions(+), 35 deletions(-) diff --git a/models/user_invitation.go b/models/user_invitation.go index db004b7e1..816cacdaf 100644 --- a/models/user_invitation.go +++ b/models/user_invitation.go @@ -11,28 +11,42 @@ type Invitation struct { ID int64 `xorm:"pk autoincr"` SrcUserID int64 `xorm:"NOT NULL DEFAULT 0"` UserID int64 `xorm:"NOT NULL DEFAULT 0"` - Phone string `xorm:"NULL"` + Phone string `xorm:"INDEX"` CreatedUnix timeutil.TimeStamp `xorm:"created"` } +func QueryInvitaionByPhone(phone string) []*Invitation { + statictisSess := xStatistic.NewSession() + defer statictisSess.Close() + cond := "phone ='" + phone + "'" + invitationList := make([]*Invitation, 0) + if err := statictisSess.Table(new(Invitation)).Where(cond). + Find(&invitationList); err != nil { + return nil + } else { + return invitationList + } +} + func QueryInvitaion(start int64, end int64) ([]*Invitation, int) { statictisSess := xStatistic.NewSession() defer statictisSess.Close() cond := "created_unix >=" + fmt.Sprint(start) + " and created_unix <=" + fmt.Sprint(end) - userList := make([]*Invitation, 0) + invitationList := make([]*Invitation, 0) if err := statictisSess.Table(new(Invitation)).Where(cond).OrderBy("created_unix desc"). - Find(&userList); err != nil { + Find(&invitationList); err != nil { return nil, 0 } - return userList, len(userList) + return invitationList, len(invitationList) } -func InsertInvitaion(invitationUser *Invitation) { +func InsertInvitaion(invitationUser *Invitation) error { statictisSess := xStatistic.NewSession() defer statictisSess.Close() - statictisSess.Insert(invitationUser) + _, err := statictisSess.Insert(invitationUser) + return err } func QueryInvitaionBySrcUserId(srcUserId int64) ([]*Invitation, int) { @@ -40,11 +54,11 @@ func QueryInvitaionBySrcUserId(srcUserId int64) ([]*Invitation, int) { defer statictisSess.Close() cond := "src_user_id =" + fmt.Sprint(srcUserId) - userList := make([]*Invitation, 0) + invitationList := make([]*Invitation, 0) if err := statictisSess.Table(new(Invitation)).Where(cond).OrderBy("created_unix desc"). - Find(&userList); err != nil { + Find(&invitationList); err != nil { return nil, 0 } - return userList, len(userList) + return invitationList, len(invitationList) } diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 130586a5a..885e3efbc 100755 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -86,6 +86,7 @@ type RegisterForm struct { Retype string GRecaptchaResponse string `form:"g-recaptcha-response"` Agree bool + InvitaionCode string } // Validate valideates the fields @@ -372,7 +373,7 @@ func (f *U2FDeleteForm) Validate(ctx *macaron.Context, errs binding.Errors) bind type PhoneNumberForm struct { PhoneNumber string `binding:"Required;MaxSize(20)"` - Mode int `binding:"Required"` + Mode int `binding:"Required"` SlideID string `binding:"Required;MaxSize(100)"` } diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 4982edd93..3f927ea79 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -376,6 +376,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/login/cloud_brain", bindIgnErr(auth.SignInForm{}), user.SignInCloudBrainPost) m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) + m.Get("/invitaion", user.GetInvitaionCode) m.Get("/login/phone", user.SignInPhone) m.Post("/login/phone", bindIgnErr(auth.PhoneNumberCodeForm{}), user.SignInPhonePost) m.Group("", func() { diff --git a/routers/user/Invitation.go b/routers/user/Invitation.go index 12050d928..fc0a03f45 100644 --- a/routers/user/Invitation.go +++ b/routers/user/Invitation.go @@ -1,9 +1,13 @@ package user import ( + "errors" "strings" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/services/repository" ) @@ -25,12 +29,43 @@ func GetInvitaionCode(ctx *context.Context) { } if ctx.IsSigned { - resultJsonMap["invitaion_code"] = ctx.User.Name - + resultJsonMap["invitaion_code"] = getInvitaionCode(ctx) } ctx.JSON(200, resultJsonMap) } -func RegisteUserByInvitaionCode(ctx *context.Context) { +func RegisteUserByInvitaionCode(form auth.RegisterForm, newUserId int64) error { + invitationcode := form.InvitaionCode + + re := models.QueryInvitaionByPhone(form.PhoneNumber) + if re != nil { + if len(re) > 0 { + log.Info("The phone has been invitated. so ingore it.") + return errors.New("The phone has been invitated.") + } + } + + user := parseInvitaionCode(invitationcode) + invitation := &models.Invitation{ + SrcUserID: user.ID, + UserID: newUserId, + Phone: form.PhoneNumber, + } + err := models.InsertInvitaion(invitation) + if err != nil { + log.Info("insert error," + err.Error()) + } + return err +} + +func getInvitaionCode(ctx *context.Context) string { + return ctx.User.Name +} +func parseInvitaionCode(invitationcode string) *models.User { + user, err := models.GetUserByName(invitationcode) + if err == nil { + return user + } + return nil } diff --git a/routers/user/auth.go b/routers/user/auth.go index 7cd6472ff..a95d0e3c4 100755 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -8,11 +8,12 @@ package user import ( "errors" "fmt" - "github.com/gomodule/redigo/redis" "net/http" "strconv" "strings" + "github.com/gomodule/redigo/redis" + "code.gitea.io/gitea/modules/slideimage" phoneService "code.gitea.io/gitea/services/phone" @@ -352,18 +353,17 @@ func SignInPostCommon(ctx *context.Context, form auth.SignInForm) { ctx.Redirect(setting.AppSubURL + "/user/two_factor") } - func SignInCloudBrainPost(ctx *context.Context, form auth.SignInForm) { ctx.Data["PageIsCloudBrainLogin"] = true ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login/cloud_brain" - SignInPostCommon(ctx,form) + SignInPostCommon(ctx, form) } // SignInPost response for sign in request func SignInPost(ctx *context.Context, form auth.SignInForm) { ctx.Data["PageIsLogin"] = true ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" - SignInPostCommon(ctx,form) + SignInPostCommon(ctx, form) } // TwoFactor shows the user a two-factor authentication page. @@ -1337,6 +1337,9 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo ctx.RenderWithErr(ctx.Tr("sign_up_agree_tips"), tplSignUp, &form) return } + if form.InvitaionCode != "" { + RegisteUserByInvitaionCode(ctx, form) + } u := &models.User{ Name: form.UserName, @@ -1919,7 +1922,7 @@ func SendVerifyCode(ctx *context.Context, slideImage *slideimage.SlideImage, for return } - if form.Mode==0 { //注册 + if form.Mode == 0 { //注册 if has { ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.already_register"))) @@ -1935,32 +1938,31 @@ func SendVerifyCode(ctx *context.Context, slideImage *slideimage.SlideImage, for } else { //修改手机号 mode=2 绑定手机 - u, err := models.GetUserByPhoneNumber(phoneNumber) - if err != nil && !models.IsErrUserNotExist(err) { - log.Warn("sql err", err) - ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.query_err"))) - return - } - - if u != nil { + u, err := models.GetUserByPhoneNumber(phoneNumber) + if err != nil && !models.IsErrUserNotExist(err) { + log.Warn("sql err", err) + ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.query_err"))) + return + } - if u.ID == ctx.User.ID { //没有修改手机号 - ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.not_modify"))) - return - } else { //修改的手机已经被别的用户注册 - ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.already_register"))) - return - } + if u != nil { + if u.ID == ctx.User.ID { //没有修改手机号 + ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.not_modify"))) + return + } else { //修改的手机已经被别的用户注册 + ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.already_register"))) + return } - } + } + } redisConn := labelmsg.Get() defer redisConn.Close() sendTimes, err := phoneService.GetPhoneNumberSendTimes(redisConn, phoneNumber) - if err != nil && err!=redis.ErrNil { + if err != nil && err != redis.ErrNil { log.Warn("redis err", err) ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("phone.query_err"))) return