|
@@ -2,7 +2,6 @@ package service
|
|
|
|
|
|
import (
|
|
import (
|
|
"context"
|
|
"context"
|
|
- "fmt"
|
|
|
|
v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
|
|
v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/model"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/model"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/repository"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/repository"
|
|
@@ -55,6 +54,65 @@ func (s *webForwardingService) GetWebForwarding(ctx context.Context, id int64) (
|
|
return s.webForwardingRepository.GetWebForwarding(ctx, id)
|
|
return s.webForwardingRepository.GetWebForwarding(ctx, id)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// buildWafFormData 辅助函数,用于构建通用的 formData
|
|
|
|
+func (s *webForwardingService) buildWafFormData(req *v1.WebForwardingData, require v1.GlobalRequire) map[string]interface{} {
|
|
|
|
+ return map[string]interface{}{
|
|
|
|
+ "tag": req.Tag,
|
|
|
|
+ "port": req.Port,
|
|
|
|
+ "domain": req.Domain,
|
|
|
|
+ "custom_host": req.CustomHost,
|
|
|
|
+ "waf_gateway_group_id": require.WafGatewayGroupId,
|
|
|
|
+ "waf_web_limit_id": require.LimitRuleId,
|
|
|
|
+ "cc_count": req.CcCount,
|
|
|
|
+ "cc_duration": req.CcDuration,
|
|
|
|
+ "cc_block_count": req.CcBlockCount,
|
|
|
|
+ "cc_block_duration": req.CcBlockDuration,
|
|
|
|
+ "cc_4xx_count": req.Cc4xxCount,
|
|
|
|
+ "cc_4xx_duration": req.Cc4xxDuration,
|
|
|
|
+ "cc_4xx_block_count": req.Cc4xxBlockCount,
|
|
|
|
+ "cc_4xx_block_duration": req.Cc4xxBlockDuration,
|
|
|
|
+ "cc_5xx_count": req.Cc5xxCount,
|
|
|
|
+ "cc_5xx_duration": req.Cc5xxDuration,
|
|
|
|
+ "cc_5xx_block_count": req.Cc5xxBlockCount,
|
|
|
|
+ "cc_5xx_block_duration": req.Cc5xxBlockDuration,
|
|
|
|
+ "backend_list": req.BackendList,
|
|
|
|
+ "allow_ip_list": req.AllowIpList,
|
|
|
|
+ "deny_ip_list": req.DenyIpList,
|
|
|
|
+ "access_rule": req.AccessRule,
|
|
|
|
+ "is_https": req.IsHttps,
|
|
|
|
+ "comment": req.Comment,
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// buildWebForwardingModel 辅助函数,用于构建通用的 WebForwarding 模型
|
|
|
|
+// ruleId 是从 WAF 系统获取的 ID
|
|
|
|
+func (s *webForwardingService) buildWebForwardingModel(req *v1.WebForwardingData,ruleId int, require v1.GlobalRequire) *model.WebForwarding {
|
|
|
|
+ return &model.WebForwarding{
|
|
|
|
+ HostId: require.HostId,
|
|
|
|
+ RuleId: ruleId,
|
|
|
|
+ Tag: req.Tag,
|
|
|
|
+ Port: strconv.Itoa(req.Port),
|
|
|
|
+ Domain: req.Domain,
|
|
|
|
+ CustomHost: req.CustomHost,
|
|
|
|
+ WafGatewayGroupId: require.WafGatewayGroupId,
|
|
|
|
+ WebLimitRuleId: require.LimitRuleId,
|
|
|
|
+ CcCount: req.CcCount,
|
|
|
|
+ CcDuration: req.CcDuration,
|
|
|
|
+ CcBlockCount: req.CcBlockCount,
|
|
|
|
+ CcBlockDuration: req.CcBlockDuration,
|
|
|
|
+ Cc4xxCount: req.Cc4xxCount,
|
|
|
|
+ Cc4xxDuration: req.Cc4xxDuration,
|
|
|
|
+ Cc4xxBlockCount: req.Cc4xxBlockCount,
|
|
|
|
+ Cc4xxBlockDuration: req.Cc4xxBlockDuration,
|
|
|
|
+ Cc5xxCount: req.Cc5xxCount,
|
|
|
|
+ Cc5xxDuration: req.Cc5xxDuration,
|
|
|
|
+ Cc5xxBlockCount: req.Cc5xxBlockCount,
|
|
|
|
+ Cc5xxBlockDuration: req.Cc5xxBlockDuration,
|
|
|
|
+ IsHttps: req.IsHttps,
|
|
|
|
+ Comment: req.Comment,
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
|
|
func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
|
|
require, err := s.require(ctx, v1.GlobalRequire{
|
|
require, err := s.require(ctx, v1.GlobalRequire{
|
|
HostId: req.HostId,
|
|
HostId: req.HostId,
|
|
@@ -64,68 +122,42 @@ func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.Web
|
|
if err != nil {
|
|
if err != nil {
|
|
return "", err
|
|
return "", err
|
|
}
|
|
}
|
|
- formData := map[string]interface{}{
|
|
|
|
- "tag": req.WebForwardingData.Tag,
|
|
|
|
- "port": req.WebForwardingData.Port,
|
|
|
|
- "domain": req.WebForwardingData.Domain,
|
|
|
|
- "custom_host": req.WebForwardingData.CustomHost,
|
|
|
|
- "waf_gateway_group_id": require.WafGatewayGroupId,
|
|
|
|
- "waf_web_limit_id": require.LimitRuleId,
|
|
|
|
- "cc_count": req.WebForwardingData.CcCount,
|
|
|
|
- "cc_duration": req.WebForwardingData.CcDuration,
|
|
|
|
- "cc_block_count": req.WebForwardingData.CcBlockCount,
|
|
|
|
- "cc_block_duration": req.WebForwardingData.CcBlockDuration,
|
|
|
|
- "cc_4xx_count": req.WebForwardingData.Cc4xxCount,
|
|
|
|
- "cc_4xx_duration": req.WebForwardingData.Cc4xxDuration,
|
|
|
|
- "cc_4xx_block_count": req.WebForwardingData.Cc4xxBlockCount,
|
|
|
|
- "cc_4xx_block_duration": req.WebForwardingData.Cc4xxBlockDuration,
|
|
|
|
- "cc_5xx_count": req.WebForwardingData.Cc5xxCount,
|
|
|
|
- "cc_5xx_duration": req.WebForwardingData.Cc5xxDuration,
|
|
|
|
- "cc_5xx_block_count": req.WebForwardingData.Cc5xxBlockCount,
|
|
|
|
- "cc_5xx_block_duration": req.WebForwardingData.Cc5xxBlockDuration,
|
|
|
|
- "backend_list": req.WebForwardingData.BackendList,
|
|
|
|
- "allow_ip_list": req.WebForwardingData.AllowIpList,
|
|
|
|
- "deny_ip_list": req.WebForwardingData.DenyIpList,
|
|
|
|
- "access_rule": req.WebForwardingData.AccessRule,
|
|
|
|
- "is_https": req.WebForwardingData.IsHttps,
|
|
|
|
- "comment": req.WebForwardingData.Comment,
|
|
|
|
- }
|
|
|
|
- respBody, err := s.required.SendForm(ctx, "admin/info/waf_web/new", "admin/new/waf_web", formData)
|
|
|
|
|
|
+ formData := s.buildWafFormData(&req.WebForwardingData, require)
|
|
|
|
+ wafWebId, err := s.wafformatter.sendFormData(ctx, "admin/info/waf_web/new", "admin/new/waf_web", formData)
|
|
if err != nil {
|
|
if err != nil {
|
|
return "", err
|
|
return "", err
|
|
}
|
|
}
|
|
- // 解析响应内容中的 alert 消息
|
|
|
|
- res, err := s.parser.ParseAlert(string(respBody))
|
|
|
|
- if err != nil {
|
|
|
|
- return "", err
|
|
|
|
- }
|
|
|
|
- if res != "" {
|
|
|
|
- return "", fmt.Errorf(res)
|
|
|
|
- }
|
|
|
|
- wafWebId, err := s.parser.GetRuleId(ctx, respBody)
|
|
|
|
- if err != nil {
|
|
|
|
|
|
+ webModel := s.buildWebForwardingModel(&req.WebForwardingData, wafWebId, require)
|
|
|
|
+
|
|
|
|
+ if err := s.webForwardingRepository.AddWebForwarding(ctx, webModel); err != nil {
|
|
return "", err
|
|
return "", err
|
|
}
|
|
}
|
|
- fmt.Println("=================================================", wafWebId)
|
|
|
|
return "", nil
|
|
return "", nil
|
|
}
|
|
}
|
|
|
|
|
|
func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
|
|
func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.WebForwardingRequest) (string, error) {
|
|
- formData := map[string]interface{}{
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- respBody, err := s.required.SendForm(ctx, "admin/info/waf_web/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WebForwardingData.WafWebId), "admin/edit/waf_web", formData)
|
|
|
|
|
|
+ require, err := s.require(ctx, v1.GlobalRequire{
|
|
|
|
+ HostId: req.HostId,
|
|
|
|
+ Uid: req.Uid,
|
|
|
|
+ Comment: req.WebForwardingData.Comment,
|
|
|
|
+ })
|
|
if err != nil {
|
|
if err != nil {
|
|
return "", err
|
|
return "", err
|
|
}
|
|
}
|
|
- // 解析响应内容中的 alert 消息
|
|
|
|
- res, err := s.parser.ParseAlert(string(respBody))
|
|
|
|
|
|
+ formData := s.buildWafFormData(&req.WebForwardingData, require)
|
|
|
|
+ _, err = s.wafformatter.sendFormData(ctx, "admin/info/waf_web/edit?&__goadmin_edit_pk="+strconv.Itoa(req.WebForwardingData.WafWebId), "admin/edit/waf_web", formData)
|
|
if err != nil {
|
|
if err != nil {
|
|
return "", err
|
|
return "", err
|
|
}
|
|
}
|
|
- if res != "" {
|
|
|
|
- return "", fmt.Errorf(res)
|
|
|
|
|
|
+
|
|
|
|
+ webModel := s.buildWebForwardingModel(&req.WebForwardingData, req.WebForwardingData.WafWebId, require)
|
|
|
|
+ webModel.Id = req.Id
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if err := s.webForwardingRepository.AddWebForwarding(ctx, webModel); err != nil {
|
|
|
|
+ return "", err
|
|
}
|
|
}
|
|
|
|
+
|
|
return "", nil
|
|
return "", nil
|
|
}
|
|
}
|
|
|
|
|