fieldrule.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 FieldRule struct {
  11. Rule
  12. Domain string
  13. IP *net.IPNet
  14. Port v2net.PortRange
  15. Network v2net.NetworkList
  16. }
  17. func (this *FieldRule) Apply(dest v2net.Destination) bool {
  18. address := dest.Address()
  19. if len(this.Domain) > 0 {
  20. if !address.IsDomain() || !strings.Contains(address.Domain(), this.Domain) {
  21. return false
  22. }
  23. }
  24. if this.IP != nil {
  25. if !(address.IsIPv4() || address.IsIPv6()) || !this.IP.Contains(address.IP()) {
  26. return false
  27. }
  28. }
  29. if this.Port != nil {
  30. port := address.Port()
  31. if port < this.Port.From() || port > this.Port.To() {
  32. return false
  33. }
  34. }
  35. if this.Network != nil {
  36. if !this.Network.HasNetwork(v2net.Network(dest.Network())) {
  37. return false
  38. }
  39. }
  40. return true
  41. }
  42. func (this *FieldRule) UnmarshalJSON(data []byte) error {
  43. type RawFieldRule struct {
  44. Rule
  45. Domain string `json:"domain"`
  46. IP string `json:"ip"`
  47. Port *v2netjson.PortRange `json:"port"`
  48. Network *v2netjson.NetworkList `json:"network"`
  49. }
  50. rawFieldRule := RawFieldRule{}
  51. err := json.Unmarshal(data, &rawFieldRule)
  52. if err != nil {
  53. return err
  54. }
  55. this.Type = rawFieldRule.Type
  56. this.OutboundTag = rawFieldRule.OutboundTag
  57. hasField := false
  58. if len(rawFieldRule.Domain) > 0 {
  59. this.Domain = rawFieldRule.Domain
  60. hasField = true
  61. }
  62. if len(rawFieldRule.IP) > 0 {
  63. _, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
  64. if err != nil {
  65. return errors.New("Invalid IP range in router rule: " + err.Error())
  66. }
  67. this.IP = ipNet
  68. hasField = true
  69. }
  70. if rawFieldRule.Port != nil {
  71. this.Port = rawFieldRule.Port
  72. hasField = true
  73. }
  74. if rawFieldRule.Network != nil {
  75. this.Network = rawFieldRule.Network
  76. hasField = true
  77. }
  78. if !hasField {
  79. return errors.New("This rule has no effective fields.")
  80. }
  81. return nil
  82. }