wafformatter.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  7. "github.com/spf13/cast"
  8. "strconv"
  9. )
  10. type WafFormatterService interface {
  11. require(ctx context.Context, req v1.GlobalRequire, category string) (v1.GlobalRequire, error)
  12. sendFormData(ctx context.Context,addTokenUrl string,addSendUrl string,formData map[string]interface{}) (int, error)
  13. }
  14. func NewWafFormatterService(
  15. service *Service,
  16. globalRep repository.GlobalLimitRepository,
  17. hostRep repository.HostRepository,
  18. required RequiredService,
  19. parser ParserService,
  20. ) WafFormatterService {
  21. return &wafFormatterService{
  22. Service: service,
  23. globalRep: globalRep,
  24. hostRep: hostRep,
  25. required: required,
  26. parser: parser,
  27. }
  28. }
  29. type wafFormatterService struct {
  30. *Service
  31. globalRep repository.GlobalLimitRepository
  32. hostRep repository.HostRepository
  33. required RequiredService
  34. parser ParserService
  35. }
  36. func (s *wafFormatterService) require(ctx context.Context,req v1.GlobalRequire,category string) (v1.GlobalRequire, error) {
  37. RuleIds, err := s.globalRep.GetGlobalLimitByHostId(ctx, int64(req.HostId))
  38. if err != nil {
  39. return v1.GlobalRequire{}, err
  40. }
  41. req.WafGatewayGroupId = RuleIds.GatewayGroupId
  42. switch category {
  43. case "tcp":
  44. req.LimitRuleId = RuleIds.TcpLimitRuleId
  45. case "udp":
  46. req.LimitRuleId = RuleIds.UdpLimitRuleId
  47. case "web":
  48. req.LimitRuleId = RuleIds.WebLimitRuleId
  49. }
  50. domain, err := s.hostRep.GetDomainById(ctx, req.HostId)
  51. if err != nil {
  52. return v1.GlobalRequire{}, err
  53. }
  54. req.Tag = strconv.Itoa(req.Uid) + "_" + strconv.Itoa(req.HostId) + "_" + domain + "_" + req.Comment
  55. return req, nil
  56. }
  57. func (s *wafFormatterService) sendFormData(ctx context.Context,addTokenUrl string,addSendUrl string,formData map[string]interface{}) (int, error) {
  58. respBody, err := s.required.SendForm(ctx, addTokenUrl, addSendUrl, formData)
  59. if err != nil {
  60. return 0, err
  61. }
  62. // 解析响应内容中的 alert 消息
  63. res, err := s.parser.ParseAlert(string(respBody))
  64. if err != nil {
  65. return 0,err
  66. }
  67. if res != "" {
  68. return 0,fmt.Errorf(res)
  69. }
  70. ruleIdStr, err := s.parser.GetRuleIdByColumnName(ctx, respBody,formData["tag"].(string))
  71. if err != nil {
  72. return 0, err
  73. }
  74. ruleId, err := cast.ToIntE(ruleIdStr)
  75. if err != nil {
  76. return 0,err
  77. }
  78. return ruleId, nil
  79. }