Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

server.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package server
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net"
  7. "strconv"
  8. "sync"
  9. "github.com/9seconds/mtg/obfuscated2"
  10. "github.com/juju/errors"
  11. uuid "github.com/satori/go.uuid"
  12. "go.uber.org/zap"
  13. )
  14. type Server struct {
  15. ip net.IP
  16. port int
  17. secret []byte
  18. logger *zap.SugaredLogger
  19. lsock net.Listener
  20. ctx context.Context
  21. }
  22. func (s *Server) Serve() error {
  23. lsock, err := net.Listen("tcp", s.Addr())
  24. if err != nil {
  25. return errors.Annotate(err, "Cannot create listen socket")
  26. }
  27. for {
  28. if conn, err := lsock.Accept(); err != nil {
  29. s.logger.Warn("Cannot allocate incoming connection", "error", err)
  30. } else {
  31. go s.accept(conn)
  32. }
  33. }
  34. return nil
  35. }
  36. func (s *Server) Addr() string {
  37. return net.JoinHostPort(s.ip.String(), strconv.Itoa(s.port))
  38. }
  39. func (s *Server) accept(conn net.Conn) {
  40. defer conn.Close()
  41. ctx, cancel := context.WithCancel(context.Background())
  42. socketID := s.makeSocketID()
  43. s.logger.Debugw("Client connected",
  44. "secret", s.secret,
  45. "addr", conn.RemoteAddr().String(),
  46. "socketid", socketID,
  47. )
  48. clientCipher, dc := s.getClientStream(conn, ctx, cancel, socketID)
  49. // if err != nil {
  50. // s.logger.Warnw("Cannot initialize client connection",
  51. // "secret", s.secret,
  52. // "addr", conn.RemoteAddr().String(),
  53. // "socketid", socketID,
  54. // "error", err,
  55. // )
  56. // return
  57. // }
  58. tgConn, tgCipher := s.getTelegramStream(dc, ctx, cancel, socketID)
  59. // if err != nil {
  60. // s.logger.Warnw("Cannot initialize Telegram connection",
  61. // "socketid", socketID,
  62. // "error", err,
  63. // )
  64. // return
  65. // }
  66. defer tgConn.Close()
  67. wait := &sync.WaitGroup{}
  68. wait.Add(2)
  69. go func() {
  70. buf := make([]byte, 128)
  71. for {
  72. n, err := conn.Read(buf)
  73. if err != nil {
  74. return
  75. }
  76. decrypted := clientCipher.Decrypt(buf[:n])
  77. encrypted := tgCipher.Encrypt(decrypted)
  78. tgConn.Write(encrypted)
  79. }
  80. }()
  81. go func() {
  82. buf := make([]byte, 128)
  83. for {
  84. n, err := tgConn.Read(buf)
  85. if err != nil {
  86. return
  87. }
  88. decrypted := tgCipher.Decrypt(buf[:n])
  89. encrypted := clientCipher.Encrypt(decrypted)
  90. conn.Write(encrypted)
  91. }
  92. }()
  93. // go func() {
  94. // buf := make([]byte, 128)
  95. // for {
  96. // n, err := conn.
  97. // }
  98. // defer wait.Done()
  99. // io.Copy(tgConn, clientConn)
  100. // }()
  101. // go func() {
  102. // defer wait.Done()
  103. // io.Copy(clientConn, tgConn)
  104. // }()
  105. <-ctx.Done()
  106. wait.Wait()
  107. s.logger.Debugw("Client disconnected",
  108. "secret", s.secret,
  109. "addr", conn.RemoteAddr().String(),
  110. "socketid", socketID,
  111. )
  112. }
  113. func (s *Server) makeSocketID() string {
  114. return uuid.NewV4().String()
  115. }
  116. func (s *Server) getClientStream(conn net.Conn, ctx context.Context, cancel context.CancelFunc, socketID string) (Cipher, int16) {
  117. frame, err := obfuscated2.ExtractFrame(conn)
  118. if err != nil {
  119. fmt.Println(err)
  120. // return nil, 0, errors.Annotate(err, "Cannot create client stream")
  121. }
  122. obfs2, dc, err := obfuscated2.ParseObfuscated2ClientFrame(s.secret, frame)
  123. if err != nil {
  124. fmt.Println(err)
  125. // return nil, 0, errors.Annotate(err, "Cannot create client stream")
  126. }
  127. return obfs2, dc
  128. // cipherConn := newCipherReadWriteCloser(conn, obfs2)
  129. // ctxConn := newCtxReadWriteCloser(cipherConn, ctx, cancel)
  130. // // logConn := newLogReadWriteCloser(ctxConn, s.logger, socketID, "client")
  131. // return ctxConn, dc, nil
  132. }
  133. func (s *Server) getTelegramStream(dc int16, ctx context.Context, cancel context.CancelFunc, socketID string) (io.ReadWriteCloser, Cipher) {
  134. socket, err := dialToTelegram(dc)
  135. if err != nil {
  136. fmt.Println(err)
  137. // return nil, errors.Annotate(err, "Cannot dial")
  138. }
  139. obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame()
  140. if n, err := socket.Write(frame); err != nil || n != len(frame) {
  141. fmt.Println(err)
  142. // return nil, errors.Annotate(err, "Cannot write hadnshake frame")
  143. }
  144. return socket, obfs2
  145. // cipherConn := newCipherReadWriteCloser(socket, obfs2)
  146. // ctxConn := newCtxReadWriteCloser(cipherConn, ctx, cancel)
  147. // logConn := newLogReadWriteCloser(ctxConn, s.logger, socketID, "telegram")
  148. // return logConn, nil
  149. }
  150. func NewServer(ip net.IP, port int, secret []byte, logger *zap.SugaredLogger) *Server {
  151. return &Server{
  152. ip: ip,
  153. port: port,
  154. secret: secret,
  155. ctx: context.Background(),
  156. logger: logger,
  157. }
  158. }