rule_item_domain_keyword.go 1004 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package rule
  2. import (
  3. "strings"
  4. "github.com/sagernet/sing-box/adapter"
  5. )
  6. var _ RuleItem = (*DomainKeywordItem)(nil)
  7. type DomainKeywordItem struct {
  8. keywords []string
  9. }
  10. func NewDomainKeywordItem(keywords []string) *DomainKeywordItem {
  11. return &DomainKeywordItem{keywords}
  12. }
  13. func (r *DomainKeywordItem) Match(metadata *adapter.InboundContext) bool {
  14. var domainHost string
  15. if metadata.Domain != "" {
  16. domainHost = metadata.Domain
  17. } else {
  18. domainHost = metadata.Destination.Fqdn
  19. }
  20. if domainHost == "" {
  21. return false
  22. }
  23. domainHost = strings.ToLower(domainHost)
  24. for _, keyword := range r.keywords {
  25. if strings.Contains(domainHost, keyword) {
  26. return true
  27. }
  28. }
  29. return false
  30. }
  31. func (r *DomainKeywordItem) String() string {
  32. kLen := len(r.keywords)
  33. if kLen == 1 {
  34. return "domain_keyword=" + r.keywords[0]
  35. } else if kLen > 3 {
  36. return "domain_keyword=[" + strings.Join(r.keywords[:3], " ") + "...]"
  37. } else {
  38. return "domain_keyword=[" + strings.Join(r.keywords, " ") + "]"
  39. }
  40. }