command_test.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package scenarios
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "testing"
  7. "v2ray.com/core/app/policy"
  8. "google.golang.org/grpc"
  9. "v2ray.com/core"
  10. "v2ray.com/core/app/commander"
  11. "v2ray.com/core/app/proxyman"
  12. "v2ray.com/core/app/proxyman/command"
  13. "v2ray.com/core/app/router"
  14. "v2ray.com/core/common/net"
  15. "v2ray.com/core/common/protocol"
  16. "v2ray.com/core/common/serial"
  17. "v2ray.com/core/common/uuid"
  18. "v2ray.com/core/proxy/dokodemo"
  19. "v2ray.com/core/proxy/freedom"
  20. "v2ray.com/core/proxy/vmess"
  21. "v2ray.com/core/proxy/vmess/inbound"
  22. "v2ray.com/core/proxy/vmess/outbound"
  23. "v2ray.com/core/testing/servers/tcp"
  24. . "v2ray.com/ext/assert"
  25. )
  26. func TestCommanderRemoveHandler(t *testing.T) {
  27. assert := With(t)
  28. tcpServer := tcp.Server{
  29. MsgProcessor: xor,
  30. }
  31. dest, err := tcpServer.Start()
  32. assert(err, IsNil)
  33. defer tcpServer.Close()
  34. clientPort := pickPort()
  35. cmdPort := pickPort()
  36. clientConfig := &core.Config{
  37. App: []*serial.TypedMessage{
  38. serial.ToTypedMessage(&commander.Config{
  39. Tag: "api",
  40. Service: []*serial.TypedMessage{
  41. serial.ToTypedMessage(&command.Config{}),
  42. },
  43. }),
  44. serial.ToTypedMessage(&router.Config{
  45. Rule: []*router.RoutingRule{
  46. {
  47. InboundTag: []string{"api"},
  48. Tag: "api",
  49. },
  50. },
  51. }),
  52. },
  53. Inbound: []*core.InboundHandlerConfig{
  54. {
  55. Tag: "d",
  56. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  57. PortRange: net.SinglePortRange(clientPort),
  58. Listen: net.NewIPOrDomain(net.LocalHostIP),
  59. }),
  60. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  61. Address: net.NewIPOrDomain(dest.Address),
  62. Port: uint32(dest.Port),
  63. NetworkList: &net.NetworkList{
  64. Network: []net.Network{net.Network_TCP},
  65. },
  66. }),
  67. },
  68. {
  69. Tag: "api",
  70. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  71. PortRange: net.SinglePortRange(cmdPort),
  72. Listen: net.NewIPOrDomain(net.LocalHostIP),
  73. }),
  74. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  75. Address: net.NewIPOrDomain(dest.Address),
  76. Port: uint32(dest.Port),
  77. NetworkList: &net.NetworkList{
  78. Network: []net.Network{net.Network_TCP},
  79. },
  80. }),
  81. },
  82. },
  83. Outbound: []*core.OutboundHandlerConfig{
  84. {
  85. Tag: "default-outbound",
  86. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  87. },
  88. },
  89. }
  90. servers, err := InitializeServerConfigs(clientConfig)
  91. assert(err, IsNil)
  92. {
  93. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  94. IP: []byte{127, 0, 0, 1},
  95. Port: int(clientPort),
  96. })
  97. assert(err, IsNil)
  98. payload := "commander request."
  99. nBytes, err := conn.Write([]byte(payload))
  100. assert(err, IsNil)
  101. assert(nBytes, Equals, len(payload))
  102. response := make([]byte, 1024)
  103. nBytes, err = conn.Read(response)
  104. assert(err, IsNil)
  105. assert(response[:nBytes], Equals, xor([]byte(payload)))
  106. assert(conn.Close(), IsNil)
  107. }
  108. cmdConn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", cmdPort), grpc.WithInsecure())
  109. assert(err, IsNil)
  110. hsClient := command.NewHandlerServiceClient(cmdConn)
  111. resp, err := hsClient.RemoveInbound(context.Background(), &command.RemoveInboundRequest{
  112. Tag: "d",
  113. })
  114. assert(err, IsNil)
  115. assert(resp, IsNotNil)
  116. {
  117. _, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  118. IP: []byte{127, 0, 0, 1},
  119. Port: int(clientPort),
  120. })
  121. assert(err, IsNotNil)
  122. }
  123. CloseAllServers(servers)
  124. }
  125. func TestCommanderAddRemoveUser(t *testing.T) {
  126. assert := With(t)
  127. tcpServer := tcp.Server{
  128. MsgProcessor: xor,
  129. }
  130. dest, err := tcpServer.Start()
  131. assert(err, IsNil)
  132. defer tcpServer.Close()
  133. u1 := protocol.NewID(uuid.New())
  134. u2 := protocol.NewID(uuid.New())
  135. cmdPort := pickPort()
  136. serverPort := pickPort()
  137. serverConfig := &core.Config{
  138. App: []*serial.TypedMessage{
  139. serial.ToTypedMessage(&commander.Config{
  140. Tag: "api",
  141. Service: []*serial.TypedMessage{
  142. serial.ToTypedMessage(&command.Config{}),
  143. },
  144. }),
  145. serial.ToTypedMessage(&router.Config{
  146. Rule: []*router.RoutingRule{
  147. {
  148. InboundTag: []string{"api"},
  149. Tag: "api",
  150. },
  151. },
  152. }),
  153. serial.ToTypedMessage(&policy.Config{
  154. Level: map[uint32]*policy.Policy{
  155. 0: {
  156. Timeout: &policy.Policy_Timeout{
  157. UplinkOnly: &policy.Second{Value: 0},
  158. DownlinkOnly: &policy.Second{Value: 0},
  159. },
  160. },
  161. },
  162. }),
  163. },
  164. Inbound: []*core.InboundHandlerConfig{
  165. {
  166. Tag: "v",
  167. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  168. PortRange: net.SinglePortRange(serverPort),
  169. Listen: net.NewIPOrDomain(net.LocalHostIP),
  170. }),
  171. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  172. User: []*protocol.User{
  173. {
  174. Account: serial.ToTypedMessage(&vmess.Account{
  175. Id: u1.String(),
  176. AlterId: 64,
  177. }),
  178. },
  179. },
  180. }),
  181. },
  182. {
  183. Tag: "api",
  184. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  185. PortRange: net.SinglePortRange(cmdPort),
  186. Listen: net.NewIPOrDomain(net.LocalHostIP),
  187. }),
  188. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  189. Address: net.NewIPOrDomain(dest.Address),
  190. Port: uint32(dest.Port),
  191. NetworkList: &net.NetworkList{
  192. Network: []net.Network{net.Network_TCP},
  193. },
  194. }),
  195. },
  196. },
  197. Outbound: []*core.OutboundHandlerConfig{
  198. {
  199. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  200. },
  201. },
  202. }
  203. clientPort := pickPort()
  204. clientConfig := &core.Config{
  205. App: []*serial.TypedMessage{
  206. serial.ToTypedMessage(&policy.Config{
  207. Level: map[uint32]*policy.Policy{
  208. 0: {
  209. Timeout: &policy.Policy_Timeout{
  210. UplinkOnly: &policy.Second{Value: 0},
  211. DownlinkOnly: &policy.Second{Value: 0},
  212. },
  213. },
  214. },
  215. }),
  216. },
  217. Inbound: []*core.InboundHandlerConfig{
  218. {
  219. Tag: "d",
  220. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  221. PortRange: net.SinglePortRange(clientPort),
  222. Listen: net.NewIPOrDomain(net.LocalHostIP),
  223. }),
  224. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  225. Address: net.NewIPOrDomain(dest.Address),
  226. Port: uint32(dest.Port),
  227. NetworkList: &net.NetworkList{
  228. Network: []net.Network{net.Network_TCP},
  229. },
  230. }),
  231. },
  232. },
  233. Outbound: []*core.OutboundHandlerConfig{
  234. {
  235. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  236. Receiver: []*protocol.ServerEndpoint{
  237. {
  238. Address: net.NewIPOrDomain(net.LocalHostIP),
  239. Port: uint32(serverPort),
  240. User: []*protocol.User{
  241. {
  242. Account: serial.ToTypedMessage(&vmess.Account{
  243. Id: u2.String(),
  244. AlterId: 64,
  245. SecuritySettings: &protocol.SecurityConfig{
  246. Type: protocol.SecurityType_AES128_GCM,
  247. },
  248. }),
  249. },
  250. },
  251. },
  252. },
  253. }),
  254. },
  255. },
  256. }
  257. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  258. assert(err, IsNil)
  259. {
  260. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  261. IP: []byte{127, 0, 0, 1},
  262. Port: int(clientPort),
  263. })
  264. assert(err, IsNil)
  265. payload := "commander request."
  266. nBytes, err := conn.Write([]byte(payload))
  267. assert(err, IsNil)
  268. assert(nBytes, Equals, len(payload))
  269. response := make([]byte, 1024)
  270. nBytes, err = conn.Read(response)
  271. assert(nBytes, Equals, 0)
  272. assert(err, Equals, io.EOF)
  273. assert(conn.Close(), IsNil)
  274. }
  275. cmdConn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", cmdPort), grpc.WithInsecure())
  276. assert(err, IsNil)
  277. hsClient := command.NewHandlerServiceClient(cmdConn)
  278. resp, err := hsClient.AlterInbound(context.Background(), &command.AlterInboundRequest{
  279. Tag: "v",
  280. Operation: serial.ToTypedMessage(
  281. &command.AddUserOperation{
  282. User: &protocol.User{
  283. Email: "test@v2ray.com",
  284. Account: serial.ToTypedMessage(&vmess.Account{
  285. Id: u2.String(),
  286. AlterId: 64,
  287. }),
  288. },
  289. }),
  290. })
  291. assert(err, IsNil)
  292. assert(resp, IsNotNil)
  293. {
  294. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  295. IP: []byte{127, 0, 0, 1},
  296. Port: int(clientPort),
  297. })
  298. assert(err, IsNil)
  299. payload := "commander request."
  300. nBytes, err := conn.Write([]byte(payload))
  301. assert(err, IsNil)
  302. assert(nBytes, Equals, len(payload))
  303. response := make([]byte, 1024)
  304. nBytes, err = conn.Read(response)
  305. assert(err, IsNil)
  306. assert(response[:nBytes], Equals, xor([]byte(payload)))
  307. assert(conn.Close(), IsNil)
  308. }
  309. resp, err = hsClient.AlterInbound(context.Background(), &command.AlterInboundRequest{
  310. Tag: "v",
  311. Operation: serial.ToTypedMessage(&command.RemoveUserOperation{Email: "test@v2ray.com"}),
  312. })
  313. assert(resp, IsNotNil)
  314. assert(err, IsNil)
  315. CloseAllServers(servers)
  316. }