common.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package conf
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "github.com/xtls/xray-core/common/net"
  6. "github.com/xtls/xray-core/common/platform"
  7. "github.com/xtls/xray-core/common/protocol"
  8. )
  9. type StringList []string
  10. func NewStringList(raw []string) *StringList {
  11. list := StringList(raw)
  12. return &list
  13. }
  14. func (v StringList) Len() int {
  15. return len(v)
  16. }
  17. func (v *StringList) UnmarshalJSON(data []byte) error {
  18. var strarray []string
  19. if err := json.Unmarshal(data, &strarray); err == nil {
  20. *v = *NewStringList(strarray)
  21. return nil
  22. }
  23. var rawstr string
  24. if err := json.Unmarshal(data, &rawstr); err == nil {
  25. strlist := strings.Split(rawstr, ",")
  26. *v = *NewStringList(strlist)
  27. return nil
  28. }
  29. return newError("unknown format of a string list: " + string(data))
  30. }
  31. type Address struct {
  32. net.Address
  33. }
  34. func (v *Address) UnmarshalJSON(data []byte) error {
  35. var rawStr string
  36. if err := json.Unmarshal(data, &rawStr); err != nil {
  37. return newError("invalid address: ", string(data)).Base(err)
  38. }
  39. if strings.HasPrefix(rawStr, "env:") {
  40. rawStr = platform.NewEnvFlag(rawStr[4:]).GetValue(func() string { return "" })
  41. }
  42. v.Address = net.ParseAddress(rawStr)
  43. return nil
  44. }
  45. func (v *Address) Build() *net.IPOrDomain {
  46. return net.NewIPOrDomain(v.Address)
  47. }
  48. type Network string
  49. func (v Network) Build() net.Network {
  50. switch strings.ToLower(string(v)) {
  51. case "tcp":
  52. return net.Network_TCP
  53. case "udp":
  54. return net.Network_UDP
  55. case "unix":
  56. return net.Network_UNIX
  57. default:
  58. return net.Network_Unknown
  59. }
  60. }
  61. type NetworkList []Network
  62. func (v *NetworkList) UnmarshalJSON(data []byte) error {
  63. var strarray []Network
  64. if err := json.Unmarshal(data, &strarray); err == nil {
  65. nl := NetworkList(strarray)
  66. *v = nl
  67. return nil
  68. }
  69. var rawstr Network
  70. if err := json.Unmarshal(data, &rawstr); err == nil {
  71. strlist := strings.Split(string(rawstr), ",")
  72. nl := make([]Network, len(strlist))
  73. for idx, network := range strlist {
  74. nl[idx] = Network(network)
  75. }
  76. *v = nl
  77. return nil
  78. }
  79. return newError("unknown format of a string list: " + string(data))
  80. }
  81. func (v *NetworkList) Build() []net.Network {
  82. if v == nil {
  83. return []net.Network{net.Network_TCP}
  84. }
  85. list := make([]net.Network, 0, len(*v))
  86. for _, network := range *v {
  87. list = append(list, network.Build())
  88. }
  89. return list
  90. }
  91. func parseIntPort(data []byte) (net.Port, error) {
  92. var intPort uint32
  93. err := json.Unmarshal(data, &intPort)
  94. if err != nil {
  95. return net.Port(0), err
  96. }
  97. return net.PortFromInt(intPort)
  98. }
  99. func parseStringPort(s string) (net.Port, net.Port, error) {
  100. if strings.HasPrefix(s, "env:") {
  101. s = platform.NewEnvFlag(s[4:]).GetValue(func() string { return "" })
  102. }
  103. pair := strings.SplitN(s, "-", 2)
  104. if len(pair) == 0 {
  105. return net.Port(0), net.Port(0), newError("invalid port range: ", s)
  106. }
  107. if len(pair) == 1 {
  108. port, err := net.PortFromString(pair[0])
  109. return port, port, err
  110. }
  111. fromPort, err := net.PortFromString(pair[0])
  112. if err != nil {
  113. return net.Port(0), net.Port(0), err
  114. }
  115. toPort, err := net.PortFromString(pair[1])
  116. if err != nil {
  117. return net.Port(0), net.Port(0), err
  118. }
  119. return fromPort, toPort, nil
  120. }
  121. func parseJSONStringPort(data []byte) (net.Port, net.Port, error) {
  122. var s string
  123. err := json.Unmarshal(data, &s)
  124. if err != nil {
  125. return net.Port(0), net.Port(0), err
  126. }
  127. return parseStringPort(s)
  128. }
  129. type PortRange struct {
  130. From uint32
  131. To uint32
  132. }
  133. func (v *PortRange) Build() *net.PortRange {
  134. return &net.PortRange{
  135. From: v.From,
  136. To: v.To,
  137. }
  138. }
  139. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  140. func (v *PortRange) UnmarshalJSON(data []byte) error {
  141. port, err := parseIntPort(data)
  142. if err == nil {
  143. v.From = uint32(port)
  144. v.To = uint32(port)
  145. return nil
  146. }
  147. from, to, err := parseJSONStringPort(data)
  148. if err == nil {
  149. v.From = uint32(from)
  150. v.To = uint32(to)
  151. if v.From > v.To {
  152. return newError("invalid port range ", v.From, " -> ", v.To)
  153. }
  154. return nil
  155. }
  156. return newError("invalid port range: ", string(data))
  157. }
  158. type PortList struct {
  159. Range []PortRange
  160. }
  161. func (list *PortList) Build() *net.PortList {
  162. portList := new(net.PortList)
  163. for _, r := range list.Range {
  164. portList.Range = append(portList.Range, r.Build())
  165. }
  166. return portList
  167. }
  168. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  169. func (list *PortList) UnmarshalJSON(data []byte) error {
  170. var listStr string
  171. var number uint32
  172. if err := json.Unmarshal(data, &listStr); err != nil {
  173. if err2 := json.Unmarshal(data, &number); err2 != nil {
  174. return newError("invalid port: ", string(data)).Base(err2)
  175. }
  176. }
  177. rangelist := strings.Split(listStr, ",")
  178. for _, rangeStr := range rangelist {
  179. trimmed := strings.TrimSpace(rangeStr)
  180. if len(trimmed) > 0 {
  181. if strings.Contains(trimmed, "-") || strings.Contains(trimmed, "env:") {
  182. from, to, err := parseStringPort(trimmed)
  183. if err != nil {
  184. return newError("invalid port range: ", trimmed).Base(err)
  185. }
  186. list.Range = append(list.Range, PortRange{From: uint32(from), To: uint32(to)})
  187. } else {
  188. port, err := parseIntPort([]byte(trimmed))
  189. if err != nil {
  190. return newError("invalid port: ", trimmed).Base(err)
  191. }
  192. list.Range = append(list.Range, PortRange{From: uint32(port), To: uint32(port)})
  193. }
  194. }
  195. }
  196. if number != 0 {
  197. list.Range = append(list.Range, PortRange{From: number, To: number})
  198. }
  199. return nil
  200. }
  201. type User struct {
  202. EmailString string `json:"email"`
  203. LevelByte byte `json:"level"`
  204. }
  205. func (v *User) Build() *protocol.User {
  206. return &protocol.User{
  207. Email: v.EmailString,
  208. Level: uint32(v.LevelByte),
  209. }
  210. }