rule_conds.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package route
  2. import (
  3. C "github.com/sagernet/sing-box/constant"
  4. "github.com/sagernet/sing-box/option"
  5. )
  6. func hasRule(rules []option.Rule, cond func(rule option.DefaultRule) bool) bool {
  7. for _, rule := range rules {
  8. switch rule.Type {
  9. case C.RuleTypeDefault:
  10. if cond(rule.DefaultOptions) {
  11. return true
  12. }
  13. case C.RuleTypeLogical:
  14. if hasRule(rule.LogicalOptions.Rules, cond) {
  15. return true
  16. }
  17. }
  18. }
  19. return false
  20. }
  21. func hasDNSRule(rules []option.DNSRule, cond func(rule option.DefaultDNSRule) bool) bool {
  22. for _, rule := range rules {
  23. switch rule.Type {
  24. case C.RuleTypeDefault:
  25. if cond(rule.DefaultOptions) {
  26. return true
  27. }
  28. case C.RuleTypeLogical:
  29. if hasDNSRule(rule.LogicalOptions.Rules, cond) {
  30. return true
  31. }
  32. }
  33. }
  34. return false
  35. }
  36. func isProcessRule(rule option.DefaultRule) bool {
  37. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.ProcessPathRegex) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
  38. }
  39. func isProcessDNSRule(rule option.DefaultDNSRule) bool {
  40. return len(rule.ProcessName) > 0 || len(rule.ProcessPath) > 0 || len(rule.ProcessPathRegex) > 0 || len(rule.PackageName) > 0 || len(rule.User) > 0 || len(rule.UserID) > 0
  41. }
  42. func isWIFIRule(rule option.DefaultRule) bool {
  43. return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
  44. }
  45. func isWIFIDNSRule(rule option.DefaultDNSRule) bool {
  46. return len(rule.WIFISSID) > 0 || len(rule.WIFIBSSID) > 0
  47. }