config_json.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // +build json
  2. package router
  3. import (
  4. "encoding/json"
  5. "errors"
  6. "strconv"
  7. "strings"
  8. "v2ray.com/core/common/collect"
  9. "v2ray.com/core/common/log"
  10. v2net "v2ray.com/core/common/net"
  11. )
  12. type JsonRule struct {
  13. Type string `json:"type"`
  14. OutboundTag string `json:"outboundTag"`
  15. }
  16. func parseIP(s string) *IP {
  17. var addr, mask string
  18. i := strings.Index(s, "/")
  19. if i < 0 {
  20. addr = s
  21. } else {
  22. addr = s[:i]
  23. mask = s[i+1:]
  24. }
  25. ip := v2net.ParseAddress(addr)
  26. if !ip.Family().Either(v2net.AddressFamilyIPv4, v2net.AddressFamilyIPv6) {
  27. return nil
  28. }
  29. bits := uint32(32)
  30. if len(mask) > 0 {
  31. bits64, err := strconv.ParseUint(mask, 10, 32)
  32. if err != nil {
  33. return nil
  34. }
  35. bits = uint32(bits64)
  36. }
  37. if bits > 32 {
  38. log.Warning("Router: invalid network mask: ", bits)
  39. return nil
  40. }
  41. return &IP{
  42. Ip: []byte(ip.IP()),
  43. UnmatchingBits: 32 - bits,
  44. }
  45. }
  46. func parseFieldRule(msg json.RawMessage) (*RoutingRule, error) {
  47. type RawFieldRule struct {
  48. JsonRule
  49. Domain *collect.StringList `json:"domain"`
  50. IP *collect.StringList `json:"ip"`
  51. Port *v2net.PortRange `json:"port"`
  52. Network *v2net.NetworkList `json:"network"`
  53. }
  54. rawFieldRule := new(RawFieldRule)
  55. err := json.Unmarshal(msg, rawFieldRule)
  56. if err != nil {
  57. return nil, err
  58. }
  59. rule := new(RoutingRule)
  60. rule.Tag = rawFieldRule.OutboundTag
  61. if rawFieldRule.Domain != nil {
  62. for _, domain := range *rawFieldRule.Domain {
  63. domainRule := new(Domain)
  64. if strings.HasPrefix(domain, "regexp:") {
  65. domainRule.Type = Domain_Regex
  66. domainRule.Value = domain[7:]
  67. } else {
  68. domainRule.Type = Domain_Plain
  69. domainRule.Value = domain
  70. }
  71. rule.Domain = append(rule.Domain, domainRule)
  72. }
  73. }
  74. if rawFieldRule.IP != nil {
  75. for _, ip := range *rawFieldRule.IP {
  76. ipRule := parseIP(ip)
  77. if ipRule != nil {
  78. rule.Ip = append(rule.Ip, ipRule)
  79. }
  80. }
  81. }
  82. if rawFieldRule.Port != nil {
  83. rule.PortRange = rawFieldRule.Port
  84. }
  85. if rawFieldRule.Network != nil {
  86. rule.NetworkList = rawFieldRule.Network
  87. }
  88. return rule, nil
  89. }
  90. func ParseRule(msg json.RawMessage) *RoutingRule {
  91. rawRule := new(JsonRule)
  92. err := json.Unmarshal(msg, rawRule)
  93. if err != nil {
  94. log.Error("Router: Invalid router rule: ", err)
  95. return nil
  96. }
  97. if rawRule.Type == "field" {
  98. fieldrule, err := parseFieldRule(msg)
  99. if err != nil {
  100. log.Error("Invalid field rule: ", err)
  101. return nil
  102. }
  103. return fieldrule
  104. }
  105. if rawRule.Type == "chinaip" {
  106. chinaiprule, err := parseChinaIPRule(msg)
  107. if err != nil {
  108. log.Error("Router: Invalid chinaip rule: ", err)
  109. return nil
  110. }
  111. return chinaiprule
  112. }
  113. if rawRule.Type == "chinasites" {
  114. chinasitesrule, err := parseChinaSitesRule(msg)
  115. if err != nil {
  116. log.Error("Invalid chinasites rule: ", err)
  117. return nil
  118. }
  119. return chinasitesrule
  120. }
  121. log.Error("Unknown router rule type: ", rawRule.Type)
  122. return nil
  123. }
  124. func (this *Config) UnmarshalJSON(data []byte) error {
  125. type JsonRulesConfig struct {
  126. RuleList []json.RawMessage `json:"rules"`
  127. DomainStrategy string `json:"domainStrategy"`
  128. }
  129. type JsonConfig struct {
  130. Settings *JsonRulesConfig `json:"settings"`
  131. }
  132. jsonConfig := new(JsonConfig)
  133. if err := json.Unmarshal(data, jsonConfig); err != nil {
  134. return err
  135. }
  136. if jsonConfig.Settings == nil {
  137. return errors.New("Router settings is not specified.")
  138. }
  139. settings := jsonConfig.Settings
  140. this.DomainStrategy = Config_AsIs
  141. this.Rule = make([]*RoutingRule, len(settings.RuleList))
  142. domainStrategy := strings.ToLower(settings.DomainStrategy)
  143. if domainStrategy == "alwaysip" {
  144. this.DomainStrategy = Config_UseIp
  145. } else if domainStrategy == "ipifnonmatch" {
  146. this.DomainStrategy = Config_IpIfNonMatch
  147. }
  148. for idx, rawRule := range settings.RuleList {
  149. rule := ParseRule(rawRule)
  150. this.Rule[idx] = rule
  151. }
  152. return nil
  153. }