256 lines
5.9 KiB
Go
256 lines
5.9 KiB
Go
package http
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/url"
|
|
"regexp"
|
|
"strconv"
|
|
|
|
"go-common/app/service/main/antispam/conf"
|
|
"go-common/app/service/main/antispam/dao"
|
|
"go-common/app/service/main/antispam/model"
|
|
"go-common/app/service/main/antispam/util"
|
|
"go-common/library/ecode"
|
|
"go-common/library/log"
|
|
bm "go-common/library/net/http/blademaster"
|
|
)
|
|
|
|
// GetRegexp .
|
|
func GetRegexp(c *bm.Context) {
|
|
params := c.Request.Form
|
|
_, err := getAdminID(params)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
id, err := strconv.ParseInt(params.Get(ProtocolRegexpID), 10, 64)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
regexp, err := Svr.GetRegexpByID(c, id)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
c.JSON(regexp, nil)
|
|
}
|
|
|
|
// GetRegexps .
|
|
func GetRegexps(c *bm.Context) {
|
|
params := c.Request.Form
|
|
_, area, err := getAdminIDAndArea(params)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
cond := &Condition{
|
|
Area: area,
|
|
Pagination: &util.Pagination{},
|
|
}
|
|
if params.Get(ProtocolCurPage) != "" {
|
|
if cond.CurPage, err = strconv.ParseInt(params.Get(ProtocolCurPage), 10, 64); err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
}
|
|
if perPage := params.Get(ProtocolPerPage); perPage != "" {
|
|
if cond.PerPage, err = strconv.ParseInt(perPage, 10, 64); err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
}
|
|
if err = cond.Valid(); err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
regexps, total, err := Svr.GetRegexpsByCond(c, ToServiceCond(cond))
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
res := map[string]interface{}{}
|
|
res[ProtocolTotalCounts] = total
|
|
res[ProtocolData] = regexps
|
|
c.JSONMap(res, nil)
|
|
|
|
}
|
|
|
|
// EditRegexp .
|
|
func EditRegexp(c *bm.Context) {
|
|
params := c.Request.Form
|
|
if _, err := getAdminID(params); err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
id, err := strconv.ParseInt(params.Get(ProtocolRegexpID), 10, 64)
|
|
if err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
addOrEditRegexp(c, params, id)
|
|
}
|
|
|
|
// AddRegexp .
|
|
func AddRegexp(c *bm.Context) {
|
|
params := c.Request.Form
|
|
if _, _, err := getAdminIDAndArea(params); err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
var id int64
|
|
addOrEditRegexp(c, params, id)
|
|
}
|
|
|
|
// RecoverRegexp .
|
|
func RecoverRegexp(c *bm.Context) {
|
|
params := c.Request.Form
|
|
adminID, err := getAdminID(params)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
id, err := strconv.ParseInt(params.Get(ProtocolRegexpID), 10, 64)
|
|
if err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
r, err := Svr.GetRegexpByID(c, id)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
if r.State != model.StateDeleted {
|
|
c.JSON(r, nil)
|
|
return
|
|
}
|
|
_, total, err := Svr.GetRegexpsByCond(c, ToServiceCond(&Condition{State: model.StateDefault, Area: r.Area}))
|
|
if err != nil {
|
|
errResp(c, ecode.ServerErr, err)
|
|
return
|
|
}
|
|
if total >= conf.Conf.ServiceOption.MaxRegexpCountsPerArea {
|
|
err = fmt.Errorf("regexp counts cannot exceed %d", conf.Conf.ServiceOption.MaxRegexpCountsPerArea)
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
r.State, r.AdminID = model.StateDefault, adminID
|
|
result, err := Svr.UpsertRegexp(c, r)
|
|
if err != nil {
|
|
errResp(c, ecode.ServerErr, err)
|
|
return
|
|
}
|
|
c.JSON(result, nil)
|
|
}
|
|
|
|
// DeleteRegexp .
|
|
func DeleteRegexp(c *bm.Context) {
|
|
params := c.Request.Form
|
|
adminID, err := getAdminID(params)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
id, err := strconv.ParseInt(params.Get(ProtocolRegexpID), 10, 64)
|
|
if err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
r, err := Svr.DeleteRegexp(c, id, adminID)
|
|
if err != nil {
|
|
errResp(c, ecode.ServerErr, err)
|
|
return
|
|
}
|
|
c.JSON(r, nil)
|
|
}
|
|
|
|
func addOrEditRegexp(c *bm.Context, params url.Values, id int64) {
|
|
adminID, err := getAdminID(params)
|
|
if err != nil {
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
name := params.Get(ProtocolRegexpName)
|
|
if name == "" {
|
|
err = errors.New("empty regexp name")
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
content := params.Get(ProtocolRegexpContent)
|
|
if content == "" {
|
|
err = errors.New("empty regexp content")
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.RequestErr, err)
|
|
return
|
|
}
|
|
if _, err = regexp.Compile(content); err != nil {
|
|
log.Error("%v", err)
|
|
errResp(c, ecode.FilterIllegalRegexp, err)
|
|
return
|
|
}
|
|
op := params.Get(ProtocolRegexpOperation)
|
|
if op == "" {
|
|
op = model.OperationLimit
|
|
}
|
|
area := params.Get(ProtocolArea)
|
|
if id == 0 {
|
|
_, total, err1 := Svr.GetRegexpsByCond(c, ToServiceCond(&Condition{State: model.StateDefault, Area: area}))
|
|
if err1 != nil {
|
|
errResp(c, ecode.ServerErr, err1)
|
|
return
|
|
}
|
|
if total >= conf.Conf.ServiceOption.MaxRegexpCountsPerArea {
|
|
err1 = fmt.Errorf("regexp counts cannot exceed %d", conf.Conf.ServiceOption.MaxRegexpCountsPerArea)
|
|
log.Error("%v", err1)
|
|
errResp(c, ecode.RequestErr, err1)
|
|
return
|
|
}
|
|
|
|
oldR, err1 := Svr.GetRegexpByAreaAndContent(c, area, content)
|
|
if err1 == nil {
|
|
if oldR.State != model.StateDefault {
|
|
oldR.State = model.StateDefault
|
|
result, err2 := Svr.UpsertRegexp(c, oldR)
|
|
if err2 != nil {
|
|
errResp(c, ecode.ServerErr, err2)
|
|
return
|
|
}
|
|
c.JSON(result, nil)
|
|
return
|
|
}
|
|
err1 = fmt.Errorf("regexp(%s) already exists", content)
|
|
log.Error("%v", err1)
|
|
errResp(c, ecode.RequestErr, err1)
|
|
return
|
|
}
|
|
if err != dao.ErrResourceNotExist {
|
|
log.Error("%v", err1)
|
|
errResp(c, ecode.ServerErr, err1)
|
|
return
|
|
}
|
|
}
|
|
r := &model.Regexp{
|
|
ID: id,
|
|
Area: area,
|
|
AdminID: adminID,
|
|
Name: name,
|
|
Content: content,
|
|
Operation: op,
|
|
}
|
|
result, err := Svr.UpsertRegexp(c, r)
|
|
if err != nil {
|
|
errResp(c, ecode.ServerErr, err)
|
|
return
|
|
}
|
|
c.JSON(result, nil)
|
|
}
|