You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
5.9 KiB
255 lines
5.9 KiB
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) |
|
}
|
|
|