vmess.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package conf
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "github.com/xtls/xray-core/common/errors"
  6. "github.com/xtls/xray-core/common/protocol"
  7. "github.com/xtls/xray-core/common/serial"
  8. "github.com/xtls/xray-core/common/uuid"
  9. "github.com/xtls/xray-core/proxy/vmess"
  10. "github.com/xtls/xray-core/proxy/vmess/inbound"
  11. "github.com/xtls/xray-core/proxy/vmess/outbound"
  12. "google.golang.org/protobuf/proto"
  13. )
  14. type VMessAccount struct {
  15. ID string `json:"id"`
  16. Security string `json:"security"`
  17. Experiments string `json:"experiments"`
  18. }
  19. // Build implements Buildable
  20. func (a *VMessAccount) Build() *vmess.Account {
  21. var st protocol.SecurityType
  22. switch strings.ToLower(a.Security) {
  23. case "aes-128-gcm":
  24. st = protocol.SecurityType_AES128_GCM
  25. case "chacha20-poly1305":
  26. st = protocol.SecurityType_CHACHA20_POLY1305
  27. case "auto":
  28. st = protocol.SecurityType_AUTO
  29. case "none":
  30. st = protocol.SecurityType_NONE
  31. case "zero":
  32. st = protocol.SecurityType_ZERO
  33. default:
  34. st = protocol.SecurityType_AUTO
  35. }
  36. return &vmess.Account{
  37. Id: a.ID,
  38. SecuritySettings: &protocol.SecurityConfig{
  39. Type: st,
  40. },
  41. TestsEnabled: a.Experiments,
  42. }
  43. }
  44. type VMessDefaultConfig struct {
  45. Level byte `json:"level"`
  46. }
  47. // Build implements Buildable
  48. func (c *VMessDefaultConfig) Build() *inbound.DefaultConfig {
  49. config := new(inbound.DefaultConfig)
  50. config.Level = uint32(c.Level)
  51. return config
  52. }
  53. type VMessInboundConfig struct {
  54. Users []json.RawMessage `json:"clients"`
  55. Defaults *VMessDefaultConfig `json:"default"`
  56. }
  57. // Build implements Buildable
  58. func (c *VMessInboundConfig) Build() (proto.Message, error) {
  59. errors.PrintNonRemovalDeprecatedFeatureWarning("VMess (with no Forward Secrecy, etc.)", "VLESS Encryption")
  60. config := &inbound.Config{}
  61. if c.Defaults != nil {
  62. config.Default = c.Defaults.Build()
  63. }
  64. config.User = make([]*protocol.User, len(c.Users))
  65. for idx, rawData := range c.Users {
  66. user := new(protocol.User)
  67. if err := json.Unmarshal(rawData, user); err != nil {
  68. return nil, errors.New("invalid VMess user").Base(err)
  69. }
  70. account := new(VMessAccount)
  71. if err := json.Unmarshal(rawData, account); err != nil {
  72. return nil, errors.New("invalid VMess user").Base(err)
  73. }
  74. u, err := uuid.ParseString(account.ID)
  75. if err != nil {
  76. return nil, err
  77. }
  78. account.ID = u.String()
  79. user.Account = serial.ToTypedMessage(account.Build())
  80. config.User[idx] = user
  81. }
  82. return config, nil
  83. }
  84. type VMessOutboundTarget struct {
  85. Address *Address `json:"address"`
  86. Port uint16 `json:"port"`
  87. Users []json.RawMessage `json:"users"`
  88. }
  89. type VMessOutboundConfig struct {
  90. Address *Address `json:"address"`
  91. Port uint16 `json:"port"`
  92. Level uint32 `json:"level"`
  93. Email string `json:"email"`
  94. ID string `json:"id"`
  95. Security string `json:"security"`
  96. Experiments string `json:"experiments"`
  97. Receivers []*VMessOutboundTarget `json:"vnext"`
  98. }
  99. // Build implements Buildable
  100. func (c *VMessOutboundConfig) Build() (proto.Message, error) {
  101. errors.PrintNonRemovalDeprecatedFeatureWarning("VMess (with no Forward Secrecy, etc.)", "VLESS Encryption")
  102. config := new(outbound.Config)
  103. if c.Address != nil {
  104. c.Receivers = []*VMessOutboundTarget{
  105. {
  106. Address: c.Address,
  107. Port: c.Port,
  108. Users: []json.RawMessage{{}},
  109. },
  110. }
  111. }
  112. if len(c.Receivers) != 1 {
  113. return nil, errors.New(`VMess settings: "vnext" should have one and only one member. Multiple endpoints in "vnext" should use multiple VMess outbounds and routing balancer instead`)
  114. }
  115. for _, rec := range c.Receivers {
  116. if len(rec.Users) != 1 {
  117. return nil, errors.New(`VMess vnext: "users" should have one and only one member. Multiple members in "users" should use multiple VMess outbounds and routing balancer instead`)
  118. }
  119. if rec.Address == nil {
  120. return nil, errors.New(`VMess vnext: "address" is not set`)
  121. }
  122. spec := &protocol.ServerEndpoint{
  123. Address: rec.Address.Build(),
  124. Port: uint32(rec.Port),
  125. }
  126. for _, rawUser := range rec.Users {
  127. user := new(protocol.User)
  128. if c.Address != nil {
  129. user.Level = c.Level
  130. user.Email = c.Email
  131. } else {
  132. if err := json.Unmarshal(rawUser, user); err != nil {
  133. return nil, errors.New("invalid VMess user").Base(err)
  134. }
  135. }
  136. account := new(VMessAccount)
  137. if c.Address != nil {
  138. account.ID = c.ID
  139. account.Security = c.Security
  140. account.Experiments = c.Experiments
  141. } else {
  142. if err := json.Unmarshal(rawUser, account); err != nil {
  143. return nil, errors.New("invalid VMess user").Base(err)
  144. }
  145. }
  146. u, err := uuid.ParseString(account.ID)
  147. if err != nil {
  148. return nil, err
  149. }
  150. account.ID = u.String()
  151. user.Account = serial.ToTypedMessage(account.Build())
  152. spec.User = user
  153. break
  154. }
  155. config.Receiver = spec
  156. break
  157. }
  158. return config, nil
  159. }