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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

middle.go 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package proxy
  2. import (
  3. "sync"
  4. "go.uber.org/zap"
  5. "github.com/9seconds/mtg/conntypes"
  6. "github.com/9seconds/mtg/protocol"
  7. "github.com/9seconds/mtg/wrappers/packetack"
  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. default:
  25. panic("unknown connection type")
  26. }
  27. wg := &sync.WaitGroup{}
  28. wg.Add(2)
  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. defer func() {
  38. dst.Close()
  39. src.Close()
  40. wg.Done()
  41. }()
  42. for {
  43. acks := conntypes.ConnectionAcks{}
  44. packet, err := src.Read(&acks)
  45. if err != nil {
  46. logger.Debugw("Cannot read packet", "error", err)
  47. return
  48. }
  49. if err = dst.Write(packet, &acks); err != nil {
  50. logger.Debugw("Cannot send packet", "error", err)
  51. return
  52. }
  53. }
  54. }