|
@@ -6,6 +6,7 @@ import (
|
|
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/repository"
|
|
"github.com/go-nunu/nunu-layout-advanced/internal/repository"
|
|
"github.com/spf13/cast"
|
|
"github.com/spf13/cast"
|
|
|
|
+ "golang.org/x/net/publicsuffix"
|
|
"slices"
|
|
"slices"
|
|
"strconv"
|
|
"strconv"
|
|
)
|
|
)
|
|
@@ -15,6 +16,7 @@ type WafFormatterService interface {
|
|
sendFormData(ctx context.Context,addTokenUrl string,addSendUrl string,formData map[string]interface{}) (int, error)
|
|
sendFormData(ctx context.Context,addTokenUrl string,addSendUrl string,formData map[string]interface{}) (int, error)
|
|
validateWafPortCount(ctx context.Context, hostId int) error
|
|
validateWafPortCount(ctx context.Context, hostId int) error
|
|
validateWafDomainCount(ctx context.Context, req v1.GlobalRequire) error
|
|
validateWafDomainCount(ctx context.Context, req v1.GlobalRequire) error
|
|
|
|
+ ConvertToWildcardDomain(ctx context.Context,domain string) (string, error)
|
|
}
|
|
}
|
|
func NewWafFormatterService(
|
|
func NewWafFormatterService(
|
|
service *Service,
|
|
service *Service,
|
|
@@ -139,4 +141,25 @@ func (s *wafFormatterService) validateWafDomainCount(ctx context.Context, req v1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
return nil
|
|
|
|
+}
|
|
|
|
+func (s *wafFormatterService) ConvertToWildcardDomain(ctx context.Context, domain string) (string, error) {
|
|
|
|
+ // 1. 使用 EffectiveTLDPlusOne 获取可注册域名部分。
|
|
|
|
+ // 例如,对于 "www.google.com",这将返回 "google.com"。
|
|
|
|
+ // 对于 "a.b.c.tokyo.jp",这将返回 "c.tokyo.jp"。
|
|
|
|
+ registrableDomain, err := publicsuffix.EffectiveTLDPlusOne(domain)
|
|
|
|
+ if err != nil {
|
|
|
|
+ // 如果域名无效(如 IP 地址、localhost),则返回错误。
|
|
|
|
+ return "", fmt.Errorf("无法处理 '%s': %w", domain, err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 2. 比较原始域名和可注册域名。
|
|
|
|
+ // 如果它们不相等,说明原始域名包含子域名。
|
|
|
|
+ if domain != registrableDomain {
|
|
|
|
+ // 3. 如果存在子域名,则用 "*." 加上可注册域名来构造通配符域名。
|
|
|
|
+ return "*." + registrableDomain, nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 4. 如果原始域名和可注册域名相同(例如,输入就是 "google.com"),
|
|
|
|
+ // 则说明没有子域名可替换,直接返回原始域名。
|
|
|
|
+ return domain, nil
|
|
}
|
|
}
|