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
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package proxy
  2. import (
  3. "sync"
  4. "github.com/9seconds/mtg/conntypes"
  5. "github.com/9seconds/mtg/protocol"
  6. "github.com/9seconds/mtg/wrappers/packetack"
  7. "go.uber.org/zap"
  8. )
  9. func middleConnection(request *protocol.TelegramRequest) {
  10. telegramConn, err := packetack.NewProxy(request)
  11. if err != nil {
  12. request.Logger.Debugw("Cannot dial to Telegram", "error", err)
  13. return
  14. }
  15. defer telegramConn.Close()
  16. var clientConn conntypes.PacketAckFullReadWriteCloser
  17. switch request.ClientProtocol.ConnectionType() {
  18. case conntypes.ConnectionTypeAbridged:
  19. clientConn = packetack.NewClientAbridged(request.ClientConn)
  20. case conntypes.ConnectionTypeIntermediate:
  21. clientConn = packetack.NewClientIntermediate(request.ClientConn)
  22. case conntypes.ConnectionTypeSecure:
  23. clientConn = packetack.NewClientIntermediateSecure(request.ClientConn)
  24. case conntypes.ConnectionTypeUnknown:
  25. panic("unknown connection type")
  26. }
  27. wg := &sync.WaitGroup{}
  28. wg.Add(2) // nolint: gomnd
  29. go middlePipe(telegramConn, clientConn, wg, request.Logger)
  30. go middlePipe(clientConn, telegramConn, wg, request.Logger)
  31. wg.Wait()
  32. }
  33. func middlePipe(dst conntypes.PacketAckWriteCloser,
  34. src conntypes.PacketAckReadCloser,
  35. wg *sync.WaitGroup,
  36. logger *zap.SugaredLogger,
  37. ) {
  38. defer func() {
  39. dst.Close()
  40. src.Close()
  41. wg.Done()
  42. }()
  43. for {
  44. acks := conntypes.ConnectionAcks{}
  45. packet, err := src.Read(&acks)
  46. if err != nil {
  47. logger.Debugw("Cannot read packet", "error", err)
  48. return
  49. }
  50. if err = dst.Write(packet, &acks); err != nil {
  51. logger.Debugw("Cannot send packet", "error", err)
  52. return
  53. }
  54. }
  55. }