fieldrule.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package json
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net"
  6. "strings"
  7. v2net "github.com/v2ray/v2ray-core/common/net"
  8. v2netjson "github.com/v2ray/v2ray-core/common/net/json"
  9. )
  10. type StringList []string
  11. func NewStringList(str ...string) *StringList {
  12. list := StringList(str)
  13. return &list
  14. }
  15. func (this *StringList) UnmarshalJSON(data []byte) error {
  16. var strList []string
  17. err := json.Unmarshal(data, &strList)
  18. if err == nil {
  19. *this = make([]string, len(strList))
  20. copy(*this, strList)
  21. return nil
  22. }
  23. var str string
  24. err = json.Unmarshal(data, &str)
  25. if err == nil {
  26. *this = make([]string, 0, 1)
  27. *this = append(*this, str)
  28. return nil
  29. }
  30. return errors.New("Failed to unmarshal string list: " + string(data))
  31. }
  32. func (this *StringList) Len() int {
  33. return len([]string(*this))
  34. }
  35. type FieldRule struct {
  36. Rule
  37. Domain *StringList
  38. IP []*net.IPNet
  39. Port v2net.PortRange
  40. Network v2net.NetworkList
  41. }
  42. func (this *FieldRule) Apply(dest v2net.Destination) bool {
  43. address := dest.Address()
  44. if this.Domain != nil && this.Domain.Len() > 0 {
  45. if !address.IsDomain() {
  46. return false
  47. }
  48. foundMatch := false
  49. for _, domain := range *this.Domain {
  50. if strings.Contains(address.Domain(), domain) {
  51. foundMatch = true
  52. break
  53. }
  54. }
  55. if !foundMatch {
  56. return false
  57. }
  58. }
  59. if this.IP != nil && len(this.IP) > 0 {
  60. if !(address.IsIPv4() || address.IsIPv6()) {
  61. return false
  62. }
  63. foundMatch := false
  64. for _, ipnet := range this.IP {
  65. if ipnet.Contains(address.IP()) {
  66. foundMatch = true
  67. break
  68. }
  69. }
  70. if !foundMatch {
  71. return false
  72. }
  73. }
  74. if this.Port != nil {
  75. port := address.Port()
  76. if port.Value() < this.Port.From().Value() || port.Value() > this.Port.To().Value() {
  77. return false
  78. }
  79. }
  80. if this.Network != nil {
  81. if !this.Network.HasNetwork(v2net.Network(dest.Network())) {
  82. return false
  83. }
  84. }
  85. return true
  86. }
  87. func (this *FieldRule) UnmarshalJSON(data []byte) error {
  88. type RawFieldRule struct {
  89. Rule
  90. Domain *StringList `json:"domain"`
  91. IP *StringList `json:"ip"`
  92. Port *v2netjson.PortRange `json:"port"`
  93. Network *v2netjson.NetworkList `json:"network"`
  94. }
  95. rawFieldRule := RawFieldRule{}
  96. err := json.Unmarshal(data, &rawFieldRule)
  97. if err != nil {
  98. return err
  99. }
  100. this.Type = rawFieldRule.Type
  101. this.OutboundTag = rawFieldRule.OutboundTag
  102. hasField := false
  103. if rawFieldRule.Domain != nil && rawFieldRule.Domain.Len() > 0 {
  104. this.Domain = rawFieldRule.Domain
  105. hasField = true
  106. }
  107. if rawFieldRule.IP != nil && rawFieldRule.IP.Len() > 0 {
  108. this.IP = make([]*net.IPNet, 0, rawFieldRule.IP.Len())
  109. for _, ipStr := range *(rawFieldRule.IP) {
  110. _, ipNet, err := net.ParseCIDR(ipStr)
  111. if err != nil {
  112. return errors.New("Invalid IP range in router rule: " + err.Error())
  113. }
  114. this.IP = append(this.IP, ipNet)
  115. }
  116. hasField = true
  117. }
  118. if rawFieldRule.Port != nil {
  119. this.Port = rawFieldRule.Port
  120. hasField = true
  121. }
  122. if rawFieldRule.Network != nil {
  123. this.Network = rawFieldRule.Network
  124. hasField = true
  125. }
  126. if !hasField {
  127. return errors.New("This rule has no effective fields.")
  128. }
  129. return nil
  130. }