rule_package_name.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package route
  2. import (
  3. "strings"
  4. "github.com/sagernet/sing-box/adapter"
  5. "github.com/sagernet/sing-box/common/warning"
  6. C "github.com/sagernet/sing-box/constant"
  7. )
  8. var warnPackageNameOnNonAndroid = warning.New(
  9. func() bool { return !C.IsAndroid },
  10. "rule item `package_name` is only supported on Android",
  11. )
  12. var _ RuleItem = (*PackageNameItem)(nil)
  13. type PackageNameItem struct {
  14. packageNames []string
  15. packageMap map[string]bool
  16. }
  17. func NewPackageNameItem(packageNameList []string) *PackageNameItem {
  18. warnPackageNameOnNonAndroid.Check()
  19. rule := &PackageNameItem{
  20. packageNames: packageNameList,
  21. packageMap: make(map[string]bool),
  22. }
  23. for _, packageName := range packageNameList {
  24. rule.packageMap[packageName] = true
  25. }
  26. return rule
  27. }
  28. func (r *PackageNameItem) Match(metadata *adapter.InboundContext) bool {
  29. if metadata.ProcessInfo == nil || metadata.ProcessInfo.PackageName == "" {
  30. return false
  31. }
  32. return r.packageMap[metadata.ProcessInfo.PackageName]
  33. }
  34. func (r *PackageNameItem) String() string {
  35. var description string
  36. pLen := len(r.packageNames)
  37. if pLen == 1 {
  38. description = "package_name=" + r.packageNames[0]
  39. } else {
  40. description = "package_name=[" + strings.Join(r.packageNames, " ") + "]"
  41. }
  42. return description
  43. }