webforwarding.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package service
  2. import (
  3. "context"
  4. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  7. "strconv"
  8. )
  9. type WebForwardingService interface {
  10. GetWebForwarding(ctx context.Context, id int64) (*model.WebForwarding, error)
  11. AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error)
  12. EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error)
  13. DeleteWebForwarding(ctx context.Context, wafWebId int) (string, error)
  14. }
  15. func NewWebForwardingService(
  16. service *Service,
  17. required RequiredService,
  18. webForwardingRepository repository.WebForwardingRepository,
  19. crawler CrawlerService,
  20. parser ParserService,
  21. wafformatter WafFormatterService,
  22. ) WebForwardingService {
  23. return &webForwardingService{
  24. Service: service,
  25. webForwardingRepository: webForwardingRepository,
  26. required: required,
  27. parser: parser,
  28. crawler: crawler,
  29. wafformatter: wafformatter,
  30. }
  31. }
  32. type webForwardingService struct {
  33. *Service
  34. webForwardingRepository repository.WebForwardingRepository
  35. required RequiredService
  36. parser ParserService
  37. crawler CrawlerService
  38. wafformatter WafFormatterService
  39. }
  40. func (s *webForwardingService) require(ctx context.Context,req v1.GlobalRequire) (v1.GlobalRequire, error) {
  41. res, err := s.wafformatter.require(ctx, req, "web")
  42. if err != nil {
  43. return v1.GlobalRequire{}, err
  44. }
  45. return res, nil
  46. }
  47. func (s *webForwardingService) GetWebForwarding(ctx context.Context, id int64) (*model.WebForwarding, error) {
  48. return s.webForwardingRepository.GetWebForwarding(ctx, id)
  49. }
  50. // buildWafFormData 辅助函数,用于构建通用的 formData
  51. func (s *webForwardingService) buildWafFormData(req *v1.WebForwardingData, require v1.GlobalRequire) map[string]interface{} {
  52. return map[string]interface{}{
  53. "tag": req.Tag,
  54. "port": req.Port,
  55. "domain": req.Domain,
  56. "custom_host": req.CustomHost,
  57. "waf_gateway_group_id": require.WafGatewayGroupId,
  58. "waf_web_limit_id": require.LimitRuleId,
  59. "cc_count": req.CcCount,
  60. "cc_duration": req.CcDuration,
  61. "cc_block_count": req.CcBlockCount,
  62. "cc_block_duration": req.CcBlockDuration,
  63. "cc_4xx_count": req.Cc4xxCount,
  64. "cc_4xx_duration": req.Cc4xxDuration,
  65. "cc_4xx_block_count": req.Cc4xxBlockCount,
  66. "cc_4xx_block_duration": req.Cc4xxBlockDuration,
  67. "cc_5xx_count": req.Cc5xxCount,
  68. "cc_5xx_duration": req.Cc5xxDuration,
  69. "cc_5xx_block_count": req.Cc5xxBlockCount,
  70. "cc_5xx_block_duration": req.Cc5xxBlockDuration,
  71. "backend_list": req.BackendList,
  72. "allow_ip_list": req.AllowIpList,
  73. "deny_ip_list": req.DenyIpList,
  74. "access_rule": req.AccessRule,
  75. "is_https": req.IsHttps,
  76. "comment": req.Comment,
  77. }
  78. }
  79. // buildWebForwardingModel 辅助函数,用于构建通用的 WebForwarding 模型
  80. // ruleId 是从 WAF 系统获取的 ID
  81. func (s *webForwardingService) buildWebForwardingModel(req *v1.WebForwardingData,ruleId int, require v1.GlobalRequire) *model.WebForwarding {
  82. return &model.WebForwarding{
  83. HostId: require.HostId,
  84. RuleId: ruleId,
  85. Tag: req.Tag,
  86. Port: strconv.Itoa(req.Port),
  87. Domain: req.Domain,
  88. CustomHost: req.CustomHost,
  89. WafGatewayGroupId: require.WafGatewayGroupId,
  90. WebLimitRuleId: require.LimitRuleId,
  91. CcCount: req.CcCount,
  92. CcDuration: req.CcDuration,
  93. CcBlockCount: req.CcBlockCount,
  94. CcBlockDuration: req.CcBlockDuration,
  95. Cc4xxCount: req.Cc4xxCount,
  96. Cc4xxDuration: req.Cc4xxDuration,
  97. Cc4xxBlockCount: req.Cc4xxBlockCount,
  98. Cc4xxBlockDuration: req.Cc4xxBlockDuration,
  99. Cc5xxCount: req.Cc5xxCount,
  100. Cc5xxDuration: req.Cc5xxDuration,
  101. Cc5xxBlockCount: req.Cc5xxBlockCount,
  102. Cc5xxBlockDuration: req.Cc5xxBlockDuration,
  103. IsHttps: req.IsHttps,
  104. Comment: req.Comment,
  105. }
  106. }
  107. func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
  108. require, err := s.require(ctx, v1.GlobalRequire{
  109. HostId: req.HostId,
  110. Uid: req.Uid,
  111. Comment: req.WebForwardingData.Comment,
  112. })
  113. if err != nil {
  114. return "", err
  115. }
  116. formData := s.buildWafFormData(&req.WebForwardingData, require)
  117. wafWebId, err := s.wafformatter.sendFormData(ctx, "admin/info/waf_web/new", "admin/new/waf_web", formData)
  118. if err != nil {
  119. return "", err
  120. }
  121. webModel := s.buildWebForwardingModel(&req.WebForwardingData, wafWebId, require)
  122. if err := s.webForwardingRepository.AddWebForwarding(ctx, webModel); err != nil {
  123. return "", err
  124. }
  125. return "", nil
  126. }
  127. func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
  128. require, err := s.require(ctx, v1.GlobalRequire{
  129. HostId: req.HostId,
  130. Uid: req.Uid,
  131. Comment: req.WebForwardingData.Comment,
  132. })
  133. if err != nil {
  134. return "", err
  135. }
  136. formData := s.buildWafFormData(&req.WebForwardingData, require)
  137. _, err = s.wafformatter.sendFormData(ctx, "admin/info/waf_web/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WebForwardingData.WafWebId), "admin/edit/waf_web", formData)
  138. if err != nil {
  139. return "", err
  140. }
  141. webModel := s.buildWebForwardingModel(&req.WebForwardingData, req.WebForwardingData.WafWebId, require)
  142. webModel.Id = req.Id
  143. if err := s.webForwardingRepository.AddWebForwarding(ctx, webModel); err != nil {
  144. return "", err
  145. }
  146. return "", nil
  147. }
  148. func (s *webForwardingService) DeleteWebForwarding(ctx context.Context, wafWebId int) (string, error) {
  149. res, err := s.crawler.DeleteRule(ctx, wafWebId, "admin/delete/waf_web?page=1&__pageSize=10&__sort=waf_web_id&__sort_type=desc")
  150. if err != nil {
  151. return "", err
  152. }
  153. return res, nil
  154. }