common.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package conf
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "strings"
  6. "github.com/xtls/xray-core/common/errors"
  7. "github.com/xtls/xray-core/common/net"
  8. "github.com/xtls/xray-core/common/platform"
  9. "github.com/xtls/xray-core/common/protocol"
  10. )
  11. type StringList []string
  12. func NewStringList(raw []string) *StringList {
  13. list := StringList(raw)
  14. return &list
  15. }
  16. func (v StringList) Len() int {
  17. return len(v)
  18. }
  19. func (v *StringList) UnmarshalJSON(data []byte) error {
  20. var strarray []string
  21. if err := json.Unmarshal(data, &strarray); err == nil {
  22. *v = *NewStringList(strarray)
  23. return nil
  24. }
  25. var rawstr string
  26. if err := json.Unmarshal(data, &rawstr); err == nil {
  27. strlist := strings.Split(rawstr, ",")
  28. *v = *NewStringList(strlist)
  29. return nil
  30. }
  31. return errors.New("unknown format of a string list: " + string(data))
  32. }
  33. type Address struct {
  34. net.Address
  35. }
  36. func (v Address) MarshalJSON() ([]byte, error) {
  37. return json.Marshal(v.Address.String())
  38. }
  39. func (v *Address) UnmarshalJSON(data []byte) error {
  40. var rawStr string
  41. if err := json.Unmarshal(data, &rawStr); err != nil {
  42. return errors.New("invalid address: ", string(data)).Base(err)
  43. }
  44. if strings.HasPrefix(rawStr, "env:") {
  45. rawStr = platform.NewEnvFlag(rawStr[4:]).GetValue(func() string { return "" })
  46. }
  47. v.Address = net.ParseAddress(rawStr)
  48. return nil
  49. }
  50. func (v *Address) Build() *net.IPOrDomain {
  51. return net.NewIPOrDomain(v.Address)
  52. }
  53. type Network string
  54. func (v Network) Build() net.Network {
  55. switch strings.ToLower(string(v)) {
  56. case "tcp":
  57. return net.Network_TCP
  58. case "udp":
  59. return net.Network_UDP
  60. case "unix":
  61. return net.Network_UNIX
  62. default:
  63. return net.Network_Unknown
  64. }
  65. }
  66. type NetworkList []Network
  67. func (v *NetworkList) UnmarshalJSON(data []byte) error {
  68. var strarray []Network
  69. if err := json.Unmarshal(data, &strarray); err == nil {
  70. nl := NetworkList(strarray)
  71. *v = nl
  72. return nil
  73. }
  74. var rawstr Network
  75. if err := json.Unmarshal(data, &rawstr); err == nil {
  76. strlist := strings.Split(string(rawstr), ",")
  77. nl := make([]Network, len(strlist))
  78. for idx, network := range strlist {
  79. nl[idx] = Network(network)
  80. }
  81. *v = nl
  82. return nil
  83. }
  84. return errors.New("unknown format of a string list: " + string(data))
  85. }
  86. func (v *NetworkList) Build() []net.Network {
  87. if v == nil {
  88. return []net.Network{net.Network_TCP}
  89. }
  90. list := make([]net.Network, 0, len(*v))
  91. for _, network := range *v {
  92. list = append(list, network.Build())
  93. }
  94. return list
  95. }
  96. func parseIntPort(data []byte) (net.Port, error) {
  97. var intPort uint32
  98. err := json.Unmarshal(data, &intPort)
  99. if err != nil {
  100. return net.Port(0), err
  101. }
  102. return net.PortFromInt(intPort)
  103. }
  104. func parseStringPort(s string) (net.Port, net.Port, error) {
  105. if strings.HasPrefix(s, "env:") {
  106. s = platform.NewEnvFlag(s[4:]).GetValue(func() string { return "" })
  107. }
  108. pair := strings.SplitN(s, "-", 2)
  109. if len(pair) == 0 {
  110. return net.Port(0), net.Port(0), errors.New("invalid port range: ", s)
  111. }
  112. if len(pair) == 1 {
  113. port, err := net.PortFromString(pair[0])
  114. return port, port, err
  115. }
  116. fromPort, err := net.PortFromString(pair[0])
  117. if err != nil {
  118. return net.Port(0), net.Port(0), err
  119. }
  120. toPort, err := net.PortFromString(pair[1])
  121. if err != nil {
  122. return net.Port(0), net.Port(0), err
  123. }
  124. return fromPort, toPort, nil
  125. }
  126. func parseJSONStringPort(data []byte) (net.Port, net.Port, error) {
  127. var s string
  128. err := json.Unmarshal(data, &s)
  129. if err != nil {
  130. return net.Port(0), net.Port(0), err
  131. }
  132. return parseStringPort(s)
  133. }
  134. type PortRange struct {
  135. From uint32
  136. To uint32
  137. }
  138. func (v *PortRange) Build() *net.PortRange {
  139. return &net.PortRange{
  140. From: v.From,
  141. To: v.To,
  142. }
  143. }
  144. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  145. func (v *PortRange) UnmarshalJSON(data []byte) error {
  146. port, err := parseIntPort(data)
  147. if err == nil {
  148. v.From = uint32(port)
  149. v.To = uint32(port)
  150. return nil
  151. }
  152. from, to, err := parseJSONStringPort(data)
  153. if err == nil {
  154. v.From = uint32(from)
  155. v.To = uint32(to)
  156. if v.From > v.To {
  157. return errors.New("invalid port range ", v.From, " -> ", v.To)
  158. }
  159. return nil
  160. }
  161. return errors.New("invalid port range: ", string(data))
  162. }
  163. type PortList struct {
  164. Range []PortRange
  165. }
  166. func (list *PortList) Build() *net.PortList {
  167. portList := new(net.PortList)
  168. for _, r := range list.Range {
  169. portList.Range = append(portList.Range, r.Build())
  170. }
  171. return portList
  172. }
  173. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  174. func (list *PortList) UnmarshalJSON(data []byte) error {
  175. var listStr string
  176. var number uint32
  177. if err := json.Unmarshal(data, &listStr); err != nil {
  178. if err2 := json.Unmarshal(data, &number); err2 != nil {
  179. return errors.New("invalid port: ", string(data)).Base(err2)
  180. }
  181. }
  182. rangelist := strings.Split(listStr, ",")
  183. for _, rangeStr := range rangelist {
  184. trimmed := strings.TrimSpace(rangeStr)
  185. if len(trimmed) > 0 {
  186. if strings.Contains(trimmed, "-") || strings.Contains(trimmed, "env:") {
  187. from, to, err := parseStringPort(trimmed)
  188. if err != nil {
  189. return errors.New("invalid port range: ", trimmed).Base(err)
  190. }
  191. list.Range = append(list.Range, PortRange{From: uint32(from), To: uint32(to)})
  192. } else {
  193. port, err := parseIntPort([]byte(trimmed))
  194. if err != nil {
  195. return errors.New("invalid port: ", trimmed).Base(err)
  196. }
  197. list.Range = append(list.Range, PortRange{From: uint32(port), To: uint32(port)})
  198. }
  199. }
  200. }
  201. if number != 0 {
  202. list.Range = append(list.Range, PortRange{From: number, To: number})
  203. }
  204. return nil
  205. }
  206. type User struct {
  207. EmailString string `json:"email"`
  208. LevelByte byte `json:"level"`
  209. }
  210. func (v *User) Build() *protocol.User {
  211. return &protocol.User{
  212. Email: v.EmailString,
  213. Level: uint32(v.LevelByte),
  214. }
  215. }
  216. // Int32Range deserializes from "1-2" or 1, so can deserialize from both int and number.
  217. // Negative integers can be passed as sentinel values, but do not parse as ranges.
  218. // Value will be exchanged if From > To, use .Left and .Right to get original value if need.
  219. type Int32Range struct {
  220. Left int32
  221. Right int32
  222. From int32
  223. To int32
  224. }
  225. func (v *Int32Range) UnmarshalJSON(data []byte) error {
  226. defer v.ensureOrder()
  227. var str string
  228. var rawint int32
  229. if err := json.Unmarshal(data, &str); err == nil {
  230. left, right, err := ParseRangeString(str)
  231. if err == nil {
  232. v.Left, v.Right = int32(left), int32(right)
  233. return nil
  234. }
  235. } else if err := json.Unmarshal(data, &rawint); err == nil {
  236. v.Left = rawint
  237. v.Right = rawint
  238. return nil
  239. }
  240. return errors.New("Invalid integer range, expected either string of form \"1-2\" or plain integer.")
  241. }
  242. // ensureOrder() gives value to .From & .To and make sure .From < .To
  243. func (r *Int32Range) ensureOrder() {
  244. r.From, r.To = r.Left, r.Right
  245. if r.From > r.To {
  246. r.From, r.To = r.To, r.From
  247. }
  248. }
  249. // "-114-514" → ["-114","514"]
  250. // "-1919--810" → ["-1919","-810"]
  251. func splitFromSecondDash(s string) []string {
  252. parts := strings.SplitN(s, "-", 3)
  253. if len(parts) < 3 {
  254. return []string{s}
  255. }
  256. return []string{parts[0] + "-" + parts[1], parts[2]}
  257. }
  258. // Parse rang in string. Support negative number.
  259. // eg: "114-514" "-114-514" "-1919--810" "114514" ""(return 0)
  260. func ParseRangeString(str string) (int, int, error) {
  261. // for number in string format like "114" or "-1"
  262. if value, err := strconv.Atoi(str); err == nil {
  263. return value, value, nil
  264. }
  265. // for empty "", we treat it as 0
  266. if str == "" {
  267. return 0, 0, nil
  268. }
  269. // for range value, like "114-514"
  270. var pair []string
  271. // Process sth like "-114-514" "-1919--810"
  272. if strings.HasPrefix(str, "-") {
  273. pair = splitFromSecondDash(str)
  274. } else {
  275. pair = strings.SplitN(str, "-", 2)
  276. }
  277. if len(pair) == 2 {
  278. left, err := strconv.Atoi(pair[0])
  279. right, err2 := strconv.Atoi(pair[1])
  280. if err == nil && err2 == nil {
  281. return left, right, nil
  282. }
  283. }
  284. return 0, 0, errors.New("invalid range string: ", str)
  285. }