fieldrule.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 && address.IsDomain() {
  20. if !strings.Contains(address.Domain(), this.Domain) {
  21. return false
  22. }
  23. }
  24. if this.IP != nil && (address.IsIPv4() || address.IsIPv6()) {
  25. if !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
  48. Network *v2netjson.NetworkList
  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. this.Domain = rawFieldRule.Domain
  58. _, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
  59. if err != nil {
  60. return errors.New("Invalid IP range in router rule: " + err.Error())
  61. }
  62. this.IP = ipNet
  63. if rawFieldRule.Port != nil {
  64. this.Port = rawFieldRule.Port
  65. }
  66. if rawFieldRule.Network != nil {
  67. this.Network = rawFieldRule.Network
  68. }
  69. return nil
  70. }