internal/service/action/captcha_strategy.go (183 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package action
import (
"context"
"time"
"github.com/apache/answer/plugin"
"github.com/segmentfault/pacman/log"
"github.com/apache/answer/internal/entity"
)
// ValidationStrategy
// true pass
// false need captcha
func (cs *CaptchaService) ValidationStrategy(ctx context.Context, unit, actionType string) bool {
// If the captcha is not enabled, the verification is passed directly
if !plugin.CaptchaEnabled() {
return true
}
info, err := cs.captchaRepo.GetActionType(ctx, unit, actionType)
if err != nil {
log.Error(err)
return false
}
switch actionType {
case entity.CaptchaActionEmail:
return cs.CaptchaActionEmail(ctx, unit, info)
case entity.CaptchaActionPassword:
return cs.CaptchaActionPassword(ctx, unit, info)
case entity.CaptchaActionEditUserinfo:
return cs.CaptchaActionEditUserinfo(ctx, unit, info)
case entity.CaptchaActionQuestion:
return cs.CaptchaActionQuestion(ctx, unit, info)
case entity.CaptchaActionAnswer:
return cs.CaptchaActionAnswer(ctx, unit, info)
case entity.CaptchaActionComment:
return cs.CaptchaActionComment(ctx, unit, info)
case entity.CaptchaActionEdit:
return cs.CaptchaActionEdit(ctx, unit, info)
case entity.CaptchaActionInvitationAnswer:
return cs.CaptchaActionInvitationAnswer(ctx, unit, info)
case entity.CaptchaActionSearch:
return cs.CaptchaActionSearch(ctx, unit, info)
case entity.CaptchaActionReport:
return cs.CaptchaActionReport(ctx, unit, info)
case entity.CaptchaActionDelete:
return cs.CaptchaActionDelete(ctx, unit, info)
case entity.CaptchaActionVote:
return cs.CaptchaActionVote(ctx, unit, info)
}
//actionType not found
return false
}
func (cs *CaptchaService) CaptchaActionEmail(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
// You need a verification code every time
return false
}
func (cs *CaptchaService) CaptchaActionPassword(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 3
setTime := int64(60 * 30) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
return false
}
if now-actionInfo.LastTime != 0 && now-actionInfo.LastTime > setTime {
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionPassword, "", 0)
}
return true
}
func (cs *CaptchaService) CaptchaActionEditUserinfo(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 3
setTime := int64(60 * 30) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
return false
}
if now-actionInfo.LastTime != 0 && now-actionInfo.LastTime > setTime {
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionEditUserinfo, "", 0)
}
return true
}
func (cs *CaptchaService) CaptchaActionQuestion(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 10
setTime := int64(5) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionAnswer(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 10
setTime := int64(5) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionComment(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 30
setTime := int64(1) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionEdit(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 10
if actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionInvitationAnswer(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 30
if actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionSearch(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
now := time.Now().Unix()
setNum := 20
setTime := int64(60) //seconds
if now-int64(actionInfo.LastTime) <= setTime && actionInfo.Num >= setNum {
return false
}
if now-actionInfo.LastTime > setTime {
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionSearch, "", 0)
}
return true
}
func (cs *CaptchaService) CaptchaActionReport(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 30
setTime := int64(1) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionDelete(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 5
setTime := int64(5) //seconds
now := time.Now().Unix()
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
return false
}
return true
}
func (cs *CaptchaService) CaptchaActionVote(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
if actionInfo == nil {
return true
}
setNum := 40
if actionInfo.Num >= setNum {
return false
}
return true
}