|
@@ -1,9 +1,11 @@
|
|
|
-package waf
|
|
|
+package web
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
+ waf2 "github.com/go-nunu/nunu-layout-advanced/internal/service/api/waf"
|
|
|
+ "github.com/go-nunu/nunu-layout-advanced/internal/service/api/waf/common"
|
|
|
"net"
|
|
|
|
|
|
v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
|
|
@@ -16,7 +18,7 @@ import (
|
|
|
// AidedWebService Web转发辅助服务接口
|
|
|
type AidedWebService interface {
|
|
|
// 验证相关
|
|
|
- ValidateAddRequest(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse) error
|
|
|
+ ValidateAddRequest(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse) error
|
|
|
ValidateEditRequest(ctx context.Context, req *v1.WebForwardingRequest) error
|
|
|
ValidateDeletePermission(oldHostId int, hostId int) error
|
|
|
|
|
@@ -36,15 +38,15 @@ type AidedWebService interface {
|
|
|
ConfigureWafFirewall(ctx context.Context, webId int64, groupId int) error
|
|
|
|
|
|
// 异步任务处理
|
|
|
- ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse)
|
|
|
+ ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse)
|
|
|
ProcessIpWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, ipData *model.WebForwardingRule) error
|
|
|
ProcessDeleteIpWhitelist(ctx context.Context, id int) error
|
|
|
- ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require RequireResponse) error
|
|
|
+ ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require common.RequireResponse) error
|
|
|
ProcessDeleteDomainWhitelist(ctx context.Context, oldData *model.WebForwarding, uid int) error
|
|
|
|
|
|
// 数据库操作
|
|
|
- SaveToDatabase(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse, webId int64, cdnOriginIds map[string]int64) (int, error)
|
|
|
- UpdateDatabaseRecords(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse, ipData *model.WebForwardingRule) error
|
|
|
+ SaveToDatabase(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse, webId int64, cdnOriginIds map[string]int64) (int, error)
|
|
|
+ UpdateDatabaseRecords(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse, ipData *model.WebForwardingRule) error
|
|
|
CleanupDatabaseRecords(ctx context.Context, id int) error
|
|
|
|
|
|
// SSL证书管理
|
|
@@ -53,7 +55,7 @@ type AidedWebService interface {
|
|
|
CleanupSSLCertificate(ctx context.Context, oldData *model.WebForwarding) error
|
|
|
|
|
|
// 数据准备辅助函数
|
|
|
- PrepareWafData(ctx context.Context, req *v1.WebForwardingRequest) (RequireResponse, v1.Website, error)
|
|
|
+ PrepareWafData(ctx context.Context, req *v1.WebForwardingRequest) (common.RequireResponse, v1.Website, error)
|
|
|
BuildProxyConfig(ctx context.Context, req *v1.WebForwardingRequest, gatewayIps []string) (v1.TypeJSON, error)
|
|
|
BulidFormData(ctx context.Context, formData v1.Website) (v1.WebsiteSend, error)
|
|
|
|
|
@@ -62,8 +64,8 @@ type AidedWebService interface {
|
|
|
IsHttpsProtocol(isHttps int) bool
|
|
|
|
|
|
// 模型构建辅助函数
|
|
|
- BuildWebForwardingModel(req *v1.WebForwardingDataRequest, ruleId int, require RequireResponse) *model.WebForwarding
|
|
|
- BuildWebRuleModel(reqData *v1.WebForwardingDataRequest, require RequireResponse, localDbId int, cdnOriginIds map[string]int64) *model.WebForwardingRule
|
|
|
+ BuildWebForwardingModel(req *v1.WebForwardingDataRequest, ruleId int, require common.RequireResponse) *model.WebForwarding
|
|
|
+ BuildWebRuleModel(reqData *v1.WebForwardingDataRequest, require common.RequireResponse, localDbId int, cdnOriginIds map[string]int64) *model.WebForwardingRule
|
|
|
|
|
|
// 列表差异处理辅助函数
|
|
|
FindDifferenceList(oldList, newList []v1.BackendList) (added, removed []v1.BackendList)
|
|
@@ -79,14 +81,14 @@ type AidedWebService interface {
|
|
|
func NewAidedWebService(
|
|
|
service *service.Service,
|
|
|
webForwardingRepository waf.WebForwardingRepository,
|
|
|
- wafformatter WafFormatterService,
|
|
|
+ wafformatter common.WafFormatterService,
|
|
|
sslCert flexCdn.SslCertService,
|
|
|
cdn flexCdn.CdnService,
|
|
|
proxy flexCdn.ProxyService,
|
|
|
websocket flexCdn.WebsocketService,
|
|
|
- cc CcService,
|
|
|
- ccIpList CcIpListService,
|
|
|
- gatewayIp GatewayipService,
|
|
|
+ cc waf2.CcService,
|
|
|
+ ccIpList waf2.CcIpListService,
|
|
|
+ gatewayIp common.GatewayipService,
|
|
|
globalLimitRep waf.GlobalLimitRepository,
|
|
|
) AidedWebService {
|
|
|
return &aidedWebService{
|
|
@@ -107,15 +109,15 @@ func NewAidedWebService(
|
|
|
type aidedWebService struct {
|
|
|
*service.Service
|
|
|
webForwardingRepository waf.WebForwardingRepository
|
|
|
- wafformatter WafFormatterService
|
|
|
+ wafformatter common.WafFormatterService
|
|
|
sslCert flexCdn.SslCertService
|
|
|
cdn flexCdn.CdnService
|
|
|
proxy flexCdn.ProxyService
|
|
|
- websocket flexCdn.WebsocketService
|
|
|
- cc CcService
|
|
|
- ccIpList CcIpListService
|
|
|
- gatewayIp GatewayipService
|
|
|
- globalLimitRep waf.GlobalLimitRepository
|
|
|
+ websocket flexCdn.WebsocketService
|
|
|
+ cc waf2.CcService
|
|
|
+ ccIpList waf2.CcIpListService
|
|
|
+ gatewayIp common.GatewayipService
|
|
|
+ globalLimitRep waf.GlobalLimitRepository
|
|
|
}
|
|
|
|
|
|
const (
|
|
@@ -134,7 +136,7 @@ const (
|
|
|
|
|
|
// BuildWebForwardingModel 辅助函数,用于构建通用的 WebForwarding 模型
|
|
|
// ruleId 是从 WAF 系统获取的 ID
|
|
|
-func (s *aidedWebService) BuildWebForwardingModel(req *v1.WebForwardingDataRequest, ruleId int, require RequireResponse) *model.WebForwarding {
|
|
|
+func (s *aidedWebService) BuildWebForwardingModel(req *v1.WebForwardingDataRequest, ruleId int, require common.RequireResponse) *model.WebForwarding {
|
|
|
return &model.WebForwarding{
|
|
|
HostId: require.HostId,
|
|
|
CdnWebId: ruleId,
|
|
@@ -157,7 +159,7 @@ func (s *aidedWebService) BuildWebForwardingModel(req *v1.WebForwardingDataReque
|
|
|
}
|
|
|
|
|
|
// BuildWebRuleModel 构建WebForwardingRule模型
|
|
|
-func (s *aidedWebService) BuildWebRuleModel(reqData *v1.WebForwardingDataRequest, require RequireResponse, localDbId int, cdnOriginIds map[string]int64) *model.WebForwardingRule {
|
|
|
+func (s *aidedWebService) BuildWebRuleModel(reqData *v1.WebForwardingDataRequest, require common.RequireResponse, localDbId int, cdnOriginIds map[string]int64) *model.WebForwardingRule {
|
|
|
return &model.WebForwardingRule{
|
|
|
Uid: require.Uid,
|
|
|
HostId: require.HostId,
|
|
@@ -168,7 +170,7 @@ func (s *aidedWebService) BuildWebRuleModel(reqData *v1.WebForwardingDataRequest
|
|
|
}
|
|
|
|
|
|
// getRequire 获取前置配置
|
|
|
-func (s *aidedWebService) getRequire (ctx context.Context, req *v1.WebForwardingRequest) (RequireResponse, error) {
|
|
|
+func (s *aidedWebService) getRequire (ctx context.Context, req *v1.WebForwardingRequest) (common.RequireResponse, error) {
|
|
|
// 1. 获取基础配置
|
|
|
require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
|
|
|
HostId: req.HostId,
|
|
@@ -176,10 +178,10 @@ func (s *aidedWebService) getRequire (ctx context.Context, req *v1.WebForwarding
|
|
|
Comment: req.WebForwardingData.Comment,
|
|
|
})
|
|
|
if err != nil {
|
|
|
- return RequireResponse{}, fmt.Errorf("获取WAF前置配置失败: %w", err)
|
|
|
+ return common.RequireResponse{}, fmt.Errorf("获取WAF前置配置失败: %w", err)
|
|
|
}
|
|
|
if require.Uid == 0 {
|
|
|
- return RequireResponse{}, fmt.Errorf("请先配置实例")
|
|
|
+ return common.RequireResponse{}, fmt.Errorf("请先配置实例")
|
|
|
}
|
|
|
|
|
|
return require, nil
|
|
@@ -188,18 +190,18 @@ func (s *aidedWebService) getRequire (ctx context.Context, req *v1.WebForwarding
|
|
|
|
|
|
// PrepareWafData 准备WAF数据
|
|
|
// 职责:协调整个流程,负责获取前置配置和组装最终的 formData。
|
|
|
-func (s *aidedWebService) PrepareWafData(ctx context.Context, req *v1.WebForwardingRequest) (RequireResponse, v1.Website, error) {
|
|
|
+func (s *aidedWebService) PrepareWafData(ctx context.Context, req *v1.WebForwardingRequest) (common.RequireResponse, v1.Website, error) {
|
|
|
|
|
|
// 1. 获取前置配置
|
|
|
require, err := s.getRequire(ctx, req)
|
|
|
if err != nil {
|
|
|
- return RequireResponse{}, v1.Website{}, err
|
|
|
+ return common.RequireResponse{}, v1.Website{}, err
|
|
|
}
|
|
|
|
|
|
// 2. 调用辅助函数,构建核心的代理配置 (将复杂逻辑封装起来)
|
|
|
byteData, err := s.BuildProxyConfig(ctx, req, require.GatewayIps)
|
|
|
if err != nil {
|
|
|
- return RequireResponse{}, v1.Website{}, err // 错误信息在辅助函数中已经包装好了
|
|
|
+ return common.RequireResponse{}, v1.Website{}, err // 错误信息在辅助函数中已经包装好了
|
|
|
}
|
|
|
|
|
|
|
|
@@ -216,7 +218,7 @@ func (s *aidedWebService) PrepareWafData(ctx context.Context, req *v1.WebForward
|
|
|
})
|
|
|
serverJson, err = json.Marshal(serverName)
|
|
|
if err != nil {
|
|
|
- return RequireResponse{}, v1.Website{}, err
|
|
|
+ return common.RequireResponse{}, v1.Website{}, err
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -347,7 +349,7 @@ func (s *aidedWebService) WashDifferentIp(newIpList []string, oldIpList []string
|
|
|
oldAllowIps := s.filterValidIpsConcurrently(oldIpList)
|
|
|
newAllowIps := s.filterValidIpsConcurrently(newIpList)
|
|
|
|
|
|
- addedDenyIps, removedDenyIps = s.wafformatter.findIpDifferences(oldAllowIps, newAllowIps)
|
|
|
+ addedDenyIps, removedDenyIps = s.wafformatter.FindIpDifferences(oldAllowIps, newAllowIps)
|
|
|
return addedDenyIps, removedDenyIps
|
|
|
}
|
|
|
|
|
@@ -536,8 +538,8 @@ func (s *aidedWebService) IsHttpsProtocol(httpsFlag int) bool {
|
|
|
}
|
|
|
|
|
|
// ValidateAddRequest 验证添加请求
|
|
|
-func (s *aidedWebService) ValidateAddRequest(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse) error {
|
|
|
- if err := s.wafformatter.validateWafDomainCount(ctx, v1.GlobalRequire{
|
|
|
+func (s *aidedWebService) ValidateAddRequest(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse) error {
|
|
|
+ if err := s.wafformatter.ValidateWafDomainCount(ctx, v1.GlobalRequire{
|
|
|
HostId: req.HostId,
|
|
|
Domain: req.WebForwardingData.Domain,
|
|
|
Comment: req.WebForwardingData.Comment,
|
|
@@ -546,7 +548,7 @@ func (s *aidedWebService) ValidateAddRequest(ctx context.Context, req *v1.WebFor
|
|
|
return fmt.Errorf("域名数量验证失败: %w", err)
|
|
|
}
|
|
|
|
|
|
- if err := s.wafformatter.validateWafPortCount(ctx, require.HostId); err != nil {
|
|
|
+ if err := s.wafformatter.ValidateWafPortCount(ctx, require.HostId); err != nil {
|
|
|
return fmt.Errorf("端口数量验证失败: %w", err)
|
|
|
}
|
|
|
|
|
@@ -560,7 +562,7 @@ func (s *aidedWebService) ValidateAddRequest(ctx context.Context, req *v1.WebFor
|
|
|
|
|
|
// ValidateEditRequest 验证编辑请求
|
|
|
func (s *aidedWebService) ValidateEditRequest(ctx context.Context, req *v1.WebForwardingRequest) error {
|
|
|
- if err := s.wafformatter.validateWafDomainCount(ctx, v1.GlobalRequire{
|
|
|
+ if err := s.wafformatter.ValidateWafDomainCount(ctx, v1.GlobalRequire{
|
|
|
HostId: req.HostId,
|
|
|
Domain: req.WebForwardingData.Domain,
|
|
|
Comment: req.WebForwardingData.Comment,
|
|
@@ -830,7 +832,7 @@ func (s *aidedWebService) ConfigureWafFirewall(ctx context.Context, webId int64,
|
|
|
}
|
|
|
|
|
|
// ProcessAsyncTasks 处理异步任务
|
|
|
-func (s *aidedWebService) ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse) {
|
|
|
+func (s *aidedWebService) ProcessAsyncTasks(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse) {
|
|
|
// 域名白名单处理
|
|
|
if req.WebForwardingData.Domain != "" {
|
|
|
go func() {
|
|
@@ -890,7 +892,7 @@ func (s *aidedWebService) ProcessIpWhitelistChanges(ctx context.Context, req *v1
|
|
|
}
|
|
|
|
|
|
// 查找IP差异
|
|
|
- addedIps, removedIps := s.wafformatter.findIpDifferences(oldIps, newIps)
|
|
|
+ addedIps, removedIps := s.wafformatter.FindIpDifferences(oldIps, newIps)
|
|
|
|
|
|
// 异步处理添加的IP
|
|
|
if len(addedIps) > 0 {
|
|
@@ -947,7 +949,7 @@ func (s *aidedWebService) ProcessDeleteIpWhitelist(ctx context.Context, id int)
|
|
|
}
|
|
|
|
|
|
// ProcessDomainWhitelistChanges 处理域名白名单变更
|
|
|
-func (s *aidedWebService) ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require RequireResponse) error {
|
|
|
+func (s *aidedWebService) ProcessDomainWhitelistChanges(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, require common.RequireResponse) error {
|
|
|
if oldData.Domain != req.WebForwardingData.Domain {
|
|
|
firstIp, err := s.gatewayIp.GetGatewayipByHostIdFirst(ctx, int64(req.HostId), int64(req.Uid))
|
|
|
if err != nil {
|
|
@@ -1006,7 +1008,7 @@ func (s *aidedWebService) ProcessDeleteDomainWhitelist(ctx context.Context, oldD
|
|
|
}
|
|
|
|
|
|
// SaveToDatabase 保存到数据库
|
|
|
-func (s *aidedWebService) SaveToDatabase(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse, webId int64, cdnOriginIds map[string]int64) (int, error) {
|
|
|
+func (s *aidedWebService) SaveToDatabase(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse, webId int64, cdnOriginIds map[string]int64) (int, error) {
|
|
|
webModel := s.BuildWebForwardingModel(&req.WebForwardingData, int(webId), require)
|
|
|
|
|
|
id, err := s.webForwardingRepository.AddWebForwarding(ctx, webModel)
|
|
@@ -1023,7 +1025,7 @@ func (s *aidedWebService) SaveToDatabase(ctx context.Context, req *v1.WebForward
|
|
|
}
|
|
|
|
|
|
// UpdateDatabaseRecords 更新数据库记录
|
|
|
-func (s *aidedWebService) UpdateDatabaseRecords(ctx context.Context, req *v1.WebForwardingRequest, require RequireResponse, ipData *model.WebForwardingRule) error {
|
|
|
+func (s *aidedWebService) UpdateDatabaseRecords(ctx context.Context, req *v1.WebForwardingRequest, require common.RequireResponse, ipData *model.WebForwardingRule) error {
|
|
|
webModel := s.BuildWebForwardingModel(&req.WebForwardingData, req.WebForwardingData.CdnWebId, require)
|
|
|
webModel.Id = req.WebForwardingData.Id
|
|
|
|