From b82261f80821c97785ccd5e04ae47e1e80eb1f74 Mon Sep 17 00:00:00 2001 From: aichy Date: Fri, 28 Jul 2023 17:33:20 +0800 Subject: [PATCH 1/2] update docker file --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 66e0326a..ef700dee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ LABEL maintainer="aichy@sf.com" ARG GOPROXY # ENV GOPROXY ${GOPROXY:-direct} -ENV GOPROXY=https://goproxy.io,direct +ENV GOPROXY=https://proxy.golang.com.cn,direct ENV GOPATH /go ENV GOROOT /usr/local/go From fb3328e438b91e5ea373885e83ec5eb977d840bd Mon Sep 17 00:00:00 2001 From: aichy Date: Tue, 1 Aug 2023 15:01:28 +0800 Subject: [PATCH 2/2] update captcha --- internal/controller/answer_controller.go | 49 ++++++------ internal/controller/comment_controller.go | 49 ++++++------ internal/controller/question_controller.go | 82 +++++++++++++-------- internal/controller/vote_controller.go | 48 ++++++------ internal/schema/question_schema.go | 2 + internal/service/action/captcha_strategy.go | 2 +- 6 files changed, 135 insertions(+), 97 deletions(-) diff --git a/internal/controller/answer_controller.go b/internal/controller/answer_controller.go index 9dbc1483..81344b85 100644 --- a/internal/controller/answer_controller.go +++ b/internal/controller/answer_controller.go @@ -136,8 +136,20 @@ func (ac *AnswerController) Add(ctx *gin.Context) { } req.QuestionID = uid.DeShortID(req.QuestionID) req.UserID = middleware.GetLoginUserIDFromContext(ctx) + + canList, err := ac.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ + permission.AnswerEdit, + permission.AnswerDelete, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + + linkUrlLimitUser := canList[2] isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := ac.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionAnswer, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -164,7 +176,7 @@ func (ac *AnswerController) Add(ctx *gin.Context) { handler.HandleResponse(ctx, err, nil) return } - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { ac.actionService.ActionRecordAdd(ctx, entity.CaptchaActionAnswer, req.UserID) } info, questionInfo, has, err := ac.answerService.Get(ctx, answerID, req.UserID) @@ -177,15 +189,6 @@ func (ac *AnswerController) Add(ctx *gin.Context) { return } - canList, err := ac.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ - permission.AnswerEdit, - permission.AnswerDelete, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } - objectOwner := ac.rankService.CheckOperationObjectOwner(ctx, req.UserID, info.ID) req.CanEdit = canList[0] || objectOwner req.CanDelete = canList[1] || objectOwner @@ -216,9 +219,20 @@ func (ac *AnswerController) Update(ctx *gin.Context) { return } req.UserID = middleware.GetLoginUserIDFromContext(ctx) + + canList, err := ac.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ + permission.AnswerEdit, + permission.AnswerEditWithoutReview, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } req.QuestionID = uid.DeShortID(req.QuestionID) + linkUrlLimitUser := canList[2] isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := ac.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionEdit, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -230,15 +244,6 @@ func (ac *AnswerController) Update(ctx *gin.Context) { } } - canList, err := ac.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ - permission.AnswerEdit, - permission.AnswerEditWithoutReview, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } - objectOwner := ac.rankService.CheckOperationObjectOwner(ctx, req.UserID, req.ID) req.CanEdit = canList[0] || objectOwner req.NoNeedReview = canList[1] || objectOwner @@ -252,7 +257,7 @@ func (ac *AnswerController) Update(ctx *gin.Context) { handler.HandleResponse(ctx, err, nil) return } - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { ac.actionService.ActionRecordAdd(ctx, entity.CaptchaActionEdit, req.UserID) } _, _, _, err = ac.answerService.Get(ctx, req.ID, req.UserID) diff --git a/internal/controller/comment_controller.go b/internal/controller/comment_controller.go index 5efdfa8b..17e65d49 100644 --- a/internal/controller/comment_controller.go +++ b/internal/controller/comment_controller.go @@ -54,8 +54,20 @@ func (cc *CommentController) AddComment(ctx *gin.Context) { } req.ObjectID = uid.DeShortID(req.ObjectID) req.UserID = middleware.GetLoginUserIDFromContext(ctx) + + canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ + permission.CommentAdd, + permission.CommentEdit, + permission.CommentDelete, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + linkUrlLimitUser := canList[3] isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := cc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionComment, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -67,15 +79,6 @@ func (cc *CommentController) AddComment(ctx *gin.Context) { } } - canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ - permission.CommentAdd, - permission.CommentEdit, - permission.CommentDelete, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } req.CanAdd = canList[0] req.CanEdit = canList[1] req.CanDelete = canList[2] @@ -85,7 +88,7 @@ func (cc *CommentController) AddComment(ctx *gin.Context) { } resp, err := cc.commentService.AddComment(ctx, req) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { cc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionComment, req.UserID) } handler.HandleResponse(ctx, err, resp) @@ -154,9 +157,20 @@ func (cc *CommentController) UpdateComment(ctx *gin.Context) { } req.UserID = middleware.GetLoginUserIDFromContext(ctx) + canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ + permission.CommentAdd, + permission.CommentEdit, + permission.CommentDelete, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + linkUrlLimitUser := canList[3] req.IsAdmin = middleware.GetIsAdminFromContext(ctx) isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := cc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionEdit, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -168,15 +182,6 @@ func (cc *CommentController) UpdateComment(ctx *gin.Context) { } } - canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ - permission.CommentAdd, - permission.CommentEdit, - permission.CommentDelete, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } req.CanAdd = canList[0] req.CanEdit = canList[1] req.CanDelete = canList[2] @@ -191,7 +196,7 @@ func (cc *CommentController) UpdateComment(ctx *gin.Context) { } resp, err := cc.commentService.UpdateComment(ctx, req) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { cc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionEdit, req.UserID) } handler.HandleResponse(ctx, err, resp) diff --git a/internal/controller/question_controller.go b/internal/controller/question_controller.go index b14b715b..0d8a2cec 100644 --- a/internal/controller/question_controller.go +++ b/internal/controller/question_controller.go @@ -330,10 +330,25 @@ func (qc *QuestionController) AddQuestion(ctx *gin.Context) { if ctx.IsAborted() { return } - req.UserID = middleware.GetLoginUserIDFromContext(ctx) + req.UserID = middleware.GetLoginUserIDFromContext(ctx) + canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{ + permission.QuestionAdd, + permission.QuestionEdit, + permission.QuestionDelete, + permission.QuestionClose, + permission.QuestionReopen, + permission.TagUseReservedTag, + permission.TagAdd, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + linkUrlLimitUser := canList[7] isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := qc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionQuestion, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -345,19 +360,6 @@ func (qc *QuestionController) AddQuestion(ctx *gin.Context) { } } - canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{ - permission.QuestionAdd, - permission.QuestionEdit, - permission.QuestionDelete, - permission.QuestionClose, - permission.QuestionReopen, - permission.TagUseReservedTag, - permission.TagAdd, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } req.CanAdd = canList[0] req.CanEdit = canList[1] req.CanDelete = canList[2] @@ -408,7 +410,7 @@ func (qc *QuestionController) AddQuestion(ctx *gin.Context) { handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), errFields) return } - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { qc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionQuestion, req.UserID) } handler.HandleResponse(ctx, err, resp) @@ -439,11 +441,26 @@ func (qc *QuestionController) AddQuestionByAnswer(ctx *gin.Context) { permission.QuestionClose, permission.QuestionReopen, permission.TagUseReservedTag, + permission.LinkUrlLimit, }) if err != nil { handler.HandleResponse(ctx, err, nil) return } + + linkUrlLimitUser := canList[6] + isAdmin := middleware.GetUserIsAdminModerator(ctx) + if !isAdmin || !linkUrlLimitUser { + captchaPass := qc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionQuestion, req.UserID, req.CaptchaID, req.CaptchaCode) + if !captchaPass { + errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ + ErrorField: "captcha_code", + ErrorMsg: translator.Tr(handler.GetLang(ctx), reason.CaptchaVerificationFailed), + }) + handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) + return + } + } req.CanAdd = canList[0] req.CanEdit = canList[1] req.CanDelete = canList[2] @@ -481,6 +498,10 @@ func (qc *QuestionController) AddQuestionByAnswer(ctx *gin.Context) { } } + if !isAdmin || !linkUrlLimitUser { + qc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionQuestion, req.UserID) + } + if len(errFields) > 0 { handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), errFields) return @@ -535,8 +556,21 @@ func (qc *QuestionController) UpdateQuestion(ctx *gin.Context) { } req.ID = uid.DeShortID(req.ID) req.UserID = middleware.GetLoginUserIDFromContext(ctx) + canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{ + permission.QuestionEdit, + permission.QuestionDelete, + permission.QuestionEditWithoutReview, + permission.TagUseReservedTag, + permission.TagAdd, + permission.LinkUrlLimit, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + linkUrlLimitUser := canList[5] isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { captchaPass := qc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionEdit, req.UserID, req.CaptchaID, req.CaptchaCode) if !captchaPass { errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ @@ -548,18 +582,6 @@ func (qc *QuestionController) UpdateQuestion(ctx *gin.Context) { } } - canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{ - permission.QuestionEdit, - permission.QuestionDelete, - permission.QuestionEditWithoutReview, - permission.TagUseReservedTag, - permission.TagAdd, - }) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } - objectOwner := qc.rankService.CheckOperationObjectOwner(ctx, req.UserID, req.ID) req.CanEdit = canList[0] || objectOwner req.CanDelete = canList[1] @@ -599,7 +621,7 @@ func (qc *QuestionController) UpdateQuestion(ctx *gin.Context) { handler.HandleResponse(ctx, err, resp) return } - if !isAdmin { + if !isAdmin || !linkUrlLimitUser { qc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionEdit, req.UserID) } handler.HandleResponse(ctx, nil, &schema.UpdateQuestionResp{WaitForReview: !req.NoNeedReview}) diff --git a/internal/controller/vote_controller.go b/internal/controller/vote_controller.go index 74ea2f02..236fbe82 100644 --- a/internal/controller/vote_controller.go +++ b/internal/controller/vote_controller.go @@ -53,6 +53,19 @@ func (vc *VoteController) VoteUp(ctx *gin.Context) { } req.ObjectID = uid.DeShortID(req.ObjectID) req.UserID = middleware.GetLoginUserIDFromContext(ctx) + + can, needRank, err := vc.rankService.CheckVotePermission(ctx, req.UserID, req.ObjectID, true) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + if !can { + lang := handler.GetLang(ctx) + msg := translator.TrWithData(lang, reason.NoEnoughRankToOperate, &schema.PermissionTrTplData{Rank: needRank}) + handler.HandleResponse(ctx, errors.Forbidden(reason.NoEnoughRankToOperate).WithMsg(msg), nil) + return + } + isAdmin := middleware.GetUserIsAdminModerator(ctx) if !isAdmin { captchaPass := vc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionVote, req.UserID, req.CaptchaID, req.CaptchaCode) @@ -66,17 +79,6 @@ func (vc *VoteController) VoteUp(ctx *gin.Context) { } } - can, needRank, err := vc.rankService.CheckVotePermission(ctx, req.UserID, req.ObjectID, true) - if err != nil { - handler.HandleResponse(ctx, err, nil) - return - } - if !can { - lang := handler.GetLang(ctx) - msg := translator.TrWithData(lang, reason.NoEnoughRankToOperate, &schema.PermissionTrTplData{Rank: needRank}) - handler.HandleResponse(ctx, errors.Forbidden(reason.NoEnoughRankToOperate).WithMsg(msg), nil) - return - } if !isAdmin { vc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionVote, req.UserID) } @@ -106,17 +108,7 @@ func (vc *VoteController) VoteDown(ctx *gin.Context) { req.ObjectID = uid.DeShortID(req.ObjectID) req.UserID = middleware.GetLoginUserIDFromContext(ctx) isAdmin := middleware.GetUserIsAdminModerator(ctx) - if !isAdmin { - captchaPass := vc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionVote, req.UserID, req.CaptchaID, req.CaptchaCode) - if !captchaPass { - errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ - ErrorField: "captcha_code", - ErrorMsg: translator.Tr(handler.GetLang(ctx), reason.CaptchaVerificationFailed), - }) - handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) - return - } - } + can, needRank, err := vc.rankService.CheckVotePermission(ctx, req.UserID, req.ObjectID, false) if err != nil { handler.HandleResponse(ctx, err, nil) @@ -128,6 +120,18 @@ func (vc *VoteController) VoteDown(ctx *gin.Context) { handler.HandleResponse(ctx, errors.Forbidden(reason.NoEnoughRankToOperate).WithMsg(msg), nil) return } + + if !isAdmin { + captchaPass := vc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionVote, req.UserID, req.CaptchaID, req.CaptchaCode) + if !captchaPass { + errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ + ErrorField: "captcha_code", + ErrorMsg: translator.Tr(handler.GetLang(ctx), reason.CaptchaVerificationFailed), + }) + handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) + return + } + } if !isAdmin { vc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionVote, req.UserID) } diff --git a/internal/schema/question_schema.go b/internal/schema/question_schema.go index e023699d..6a586b19 100644 --- a/internal/schema/question_schema.go +++ b/internal/schema/question_schema.go @@ -94,6 +94,8 @@ type QuestionAddByAnswer struct { UserID string `json:"-"` MentionUsernameList []string `validate:"omitempty" json:"mention_username_list"` QuestionPermission + CaptchaID string `json:"captcha_id"` // captcha_id + CaptchaCode string `json:"captcha_code"` } func (req *QuestionAddByAnswer) Check() (errFields []*validator.FormErrorField, err error) { diff --git a/internal/service/action/captcha_strategy.go b/internal/service/action/captcha_strategy.go index 5ab9a19e..8b2a13e8 100644 --- a/internal/service/action/captcha_strategy.go +++ b/internal/service/action/captcha_strategy.go @@ -85,7 +85,7 @@ func (cs *CaptchaService) CaptchaActionEditUserinfo(ctx context.Context, unit st func (cs *CaptchaService) CaptchaActionQuestion(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool { spew.Dump("[CaptchaActionQuestion]", actioninfo) - setNum := 3 + setNum := 10 setTime := int64(5) //seconds now := time.Now().Unix() if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {