vmessin.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package vmess
  2. import (
  3. "crypto/md5"
  4. "io"
  5. "net"
  6. "github.com/v2ray/v2ray-core"
  7. v2io "github.com/v2ray/v2ray-core/io"
  8. vmessio "github.com/v2ray/v2ray-core/io/vmess"
  9. )
  10. type VMessInboundHandler struct {
  11. vPoint *core.VPoint
  12. clients *core.VUserSet
  13. accepting bool
  14. }
  15. func NewVMessInboundHandler(vp *core.VPoint, clients *core.VUserSet) *VMessInboundHandler {
  16. handler := new(VMessInboundHandler)
  17. handler.vPoint = vp
  18. handler.clients = clients
  19. return handler
  20. }
  21. func (handler *VMessInboundHandler) Listen(port uint8) error {
  22. listener, err := net.Listen("tcp", ":"+string(port))
  23. if err != nil {
  24. return err
  25. }
  26. handler.accepting = true
  27. go handler.AcceptConnections(listener)
  28. return nil
  29. }
  30. func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) error {
  31. for handler.accepting {
  32. connection, err := listener.Accept()
  33. if err != nil {
  34. return err
  35. }
  36. go handler.HandleConnection(connection)
  37. }
  38. return nil
  39. }
  40. func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error {
  41. defer connection.Close()
  42. reader := vmessio.NewVMessRequestReader(handler.clients)
  43. request, err := reader.Read(connection)
  44. if err != nil {
  45. return err
  46. }
  47. response := vmessio.NewVMessResponse(request)
  48. connection.Write(response[:])
  49. requestKey := request.RequestKey[:]
  50. requestIV := request.RequestIV[:]
  51. responseKey := md5.Sum(requestKey)
  52. responseIV := md5.Sum(requestIV)
  53. requestReader, err := v2io.NewAesDecryptReader(requestKey, requestIV, connection)
  54. if err != nil {
  55. return err
  56. }
  57. responseWriter, err := v2io.NewAesEncryptWriter(responseKey[:], responseIV[:], connection)
  58. if err != nil {
  59. return err
  60. }
  61. ray := handler.vPoint.NewInboundConnectionAccepted(request.Address)
  62. input := ray.InboundInput()
  63. output := ray.InboundOutput()
  64. finish := make(chan bool, 2)
  65. go handler.dumpInput(requestReader, input, finish)
  66. go handler.dumpOutput(responseWriter, output, finish)
  67. handler.waitForFinish(finish)
  68. return nil
  69. }
  70. func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []byte, finish chan<- bool) {
  71. for {
  72. buffer := make([]byte, BufferSize)
  73. nBytes, err := reader.Read(buffer)
  74. if err == io.EOF {
  75. finish <- true
  76. break
  77. }
  78. input <- buffer[:nBytes]
  79. }
  80. }
  81. func (handler *VMessInboundHandler) dumpOutput(writer io.Writer, output <-chan []byte, finish chan<- bool) {
  82. for {
  83. buffer, open := <-output
  84. if !open {
  85. finish <- true
  86. break
  87. }
  88. writer.Write(buffer)
  89. }
  90. }
  91. func (handler *VMessInboundHandler) waitForFinish(finish <-chan bool) {
  92. for i := 0; i < 2; i++ {
  93. <-finish
  94. }
  95. }
  96. type VMessInboundHandlerFactory struct {
  97. allowedClients *core.VUserSet
  98. }
  99. func NewVMessInboundHandlerFactory(clients []core.VUser) *VMessInboundHandlerFactory {
  100. factory := new(VMessInboundHandlerFactory)
  101. factory.allowedClients = core.NewVUserSet()
  102. for _, user := range clients {
  103. factory.allowedClients.AddUser(user)
  104. }
  105. return factory
  106. }
  107. func (factory *VMessInboundHandlerFactory) Create(vp *core.VPoint) *VMessInboundHandler {
  108. return NewVMessInboundHandler(vp, factory.allowedClients)
  109. }