common.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package conf
  2. import (
  3. "encoding/json"
  4. "strings"
  5. v2net "v2ray.com/core/common/net"
  6. "v2ray.com/core/common/protocol"
  7. )
  8. type StringList []string
  9. func NewStringList(raw []string) *StringList {
  10. list := StringList(raw)
  11. return &list
  12. }
  13. func (v StringList) Len() int {
  14. return len(v)
  15. }
  16. func (v *StringList) UnmarshalJSON(data []byte) error {
  17. var strarray []string
  18. if err := json.Unmarshal(data, &strarray); err == nil {
  19. *v = *NewStringList(strarray)
  20. return nil
  21. }
  22. var rawstr string
  23. if err := json.Unmarshal(data, &rawstr); err == nil {
  24. strlist := strings.Split(rawstr, ",")
  25. *v = *NewStringList(strlist)
  26. return nil
  27. }
  28. return newError("unknown format of a string list: " + string(data))
  29. }
  30. type Address struct {
  31. v2net.Address
  32. }
  33. func (v *Address) UnmarshalJSON(data []byte) error {
  34. var rawStr string
  35. if err := json.Unmarshal(data, &rawStr); err != nil {
  36. return err
  37. }
  38. v.Address = v2net.ParseAddress(rawStr)
  39. return nil
  40. }
  41. func (v *Address) Build() *v2net.IPOrDomain {
  42. return v2net.NewIPOrDomain(v.Address)
  43. }
  44. type Network string
  45. func (v Network) Build() v2net.Network {
  46. return v2net.ParseNetwork(string(v))
  47. }
  48. type NetworkList []Network
  49. func (v *NetworkList) UnmarshalJSON(data []byte) error {
  50. var strarray []Network
  51. if err := json.Unmarshal(data, &strarray); err == nil {
  52. nl := NetworkList(strarray)
  53. *v = nl
  54. return nil
  55. }
  56. var rawstr Network
  57. if err := json.Unmarshal(data, &rawstr); err == nil {
  58. strlist := strings.Split(string(rawstr), ",")
  59. nl := make([]Network, len(strlist))
  60. for idx, network := range strlist {
  61. nl[idx] = Network(network)
  62. }
  63. *v = nl
  64. return nil
  65. }
  66. return newError("unknown format of a string list: " + string(data))
  67. }
  68. func (v *NetworkList) Build() *v2net.NetworkList {
  69. if v == nil {
  70. return &v2net.NetworkList{
  71. Network: []v2net.Network{v2net.Network_TCP},
  72. }
  73. }
  74. list := new(v2net.NetworkList)
  75. for _, network := range *v {
  76. list.Network = append(list.Network, network.Build())
  77. }
  78. return list
  79. }
  80. func parseIntPort(data []byte) (v2net.Port, error) {
  81. var intPort uint32
  82. err := json.Unmarshal(data, &intPort)
  83. if err != nil {
  84. return v2net.Port(0), err
  85. }
  86. return v2net.PortFromInt(intPort)
  87. }
  88. func parseStringPort(data []byte) (v2net.Port, v2net.Port, error) {
  89. var s string
  90. err := json.Unmarshal(data, &s)
  91. if err != nil {
  92. return v2net.Port(0), v2net.Port(0), err
  93. }
  94. pair := strings.SplitN(s, "-", 2)
  95. if len(pair) == 0 {
  96. return v2net.Port(0), v2net.Port(0), newError("Config: Invalid port range: ", s)
  97. }
  98. if len(pair) == 1 {
  99. port, err := v2net.PortFromString(pair[0])
  100. return port, port, err
  101. }
  102. fromPort, err := v2net.PortFromString(pair[0])
  103. if err != nil {
  104. return v2net.Port(0), v2net.Port(0), err
  105. }
  106. toPort, err := v2net.PortFromString(pair[1])
  107. if err != nil {
  108. return v2net.Port(0), v2net.Port(0), err
  109. }
  110. return fromPort, toPort, nil
  111. }
  112. type PortRange struct {
  113. From uint32
  114. To uint32
  115. }
  116. func (v *PortRange) Build() *v2net.PortRange {
  117. return &v2net.PortRange{
  118. From: v.From,
  119. To: v.To,
  120. }
  121. }
  122. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  123. func (v *PortRange) UnmarshalJSON(data []byte) error {
  124. port, err := parseIntPort(data)
  125. if err == nil {
  126. v.From = uint32(port)
  127. v.To = uint32(port)
  128. return nil
  129. }
  130. from, to, err := parseStringPort(data)
  131. if err == nil {
  132. v.From = uint32(from)
  133. v.To = uint32(to)
  134. if v.From > v.To {
  135. return newError("invalid port range ", v.From, " -> ", v.To)
  136. }
  137. return nil
  138. }
  139. return newError("invalid port range: ", string(data))
  140. }
  141. type User struct {
  142. EmailString string `json:"email"`
  143. LevelByte byte `json:"level"`
  144. }
  145. func (v *User) Build() *protocol.User {
  146. return &protocol.User{
  147. Email: v.EmailString,
  148. Level: uint32(v.LevelByte),
  149. }
  150. }