fakedns.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package dns
  2. import (
  3. "encoding/json"
  4. "net"
  5. "github.com/v2fly/v2ray-core/v5/app/dns/fakedns"
  6. )
  7. type FakeDNSPoolElementConfig struct {
  8. IPPool string `json:"ipPool"`
  9. LRUSize int64 `json:"poolSize"`
  10. }
  11. type FakeDNSConfig struct {
  12. pool *FakeDNSPoolElementConfig
  13. pools []*FakeDNSPoolElementConfig
  14. }
  15. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  16. func (f *FakeDNSConfig) UnmarshalJSON(data []byte) error {
  17. var pool FakeDNSPoolElementConfig
  18. var pools []*FakeDNSPoolElementConfig
  19. var ipPools []string
  20. switch {
  21. case json.Unmarshal(data, &pool) == nil:
  22. f.pool = &pool
  23. case json.Unmarshal(data, &pools) == nil:
  24. f.pools = pools
  25. case json.Unmarshal(data, &ipPools) == nil:
  26. f.pools = make([]*FakeDNSPoolElementConfig, 0, len(ipPools))
  27. for _, ipPool := range ipPools {
  28. _, ipNet, err := net.ParseCIDR(ipPool)
  29. if err != nil {
  30. return err
  31. }
  32. ones, bits := ipNet.Mask.Size()
  33. sizeInBits := bits - ones
  34. if sizeInBits > 16 { // At most 65536 ips for a IP pool
  35. sizeInBits = 16
  36. }
  37. f.pools = append(f.pools, &FakeDNSPoolElementConfig{
  38. IPPool: ipPool,
  39. LRUSize: (1 << sizeInBits) - 1,
  40. })
  41. }
  42. default:
  43. return newError("invalid fakedns config")
  44. }
  45. return nil
  46. }
  47. func (f *FakeDNSConfig) Build() (*fakedns.FakeDnsPoolMulti, error) {
  48. fakeDNSPool := fakedns.FakeDnsPoolMulti{}
  49. if f.pool != nil {
  50. fakeDNSPool.Pools = append(fakeDNSPool.Pools, &fakedns.FakeDnsPool{
  51. IpPool: f.pool.IPPool,
  52. LruSize: f.pool.LRUSize,
  53. })
  54. return &fakeDNSPool, nil
  55. }
  56. if f.pools != nil {
  57. for _, v := range f.pools {
  58. fakeDNSPool.Pools = append(fakeDNSPool.Pools, &fakedns.FakeDnsPool{IpPool: v.IPPool, LruSize: v.LRUSize})
  59. }
  60. return &fakeDNSPool, nil
  61. }
  62. return nil, newError("no valid FakeDNS config")
  63. }
  64. type FakeDNSConfigExtend struct { // Adds boolean value parsing for "fakedns" config
  65. *FakeDNSConfig
  66. }
  67. func (f *FakeDNSConfigExtend) UnmarshalJSON(data []byte) error {
  68. var enabled bool
  69. if json.Unmarshal(data, &enabled) == nil {
  70. if enabled {
  71. f.FakeDNSConfig = &FakeDNSConfig{pools: []*FakeDNSPoolElementConfig{}}
  72. }
  73. return nil
  74. }
  75. return json.Unmarshal(data, &f.FakeDNSConfig)
  76. }