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.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 := packetack.NewProxy(request)
  11. defer telegramConn.Close()
  12. var clientConn conntypes.PacketAckFullReadWriteCloser
  13. switch request.ClientProtocol.ConnectionType() {
  14. case conntypes.ConnectionTypeAbridged:
  15. clientConn = packetack.NewClientAbridged(request.ClientConn)
  16. case conntypes.ConnectionTypeIntermediate:
  17. clientConn = packetack.NewClientIntermediate(request.ClientConn)
  18. case conntypes.ConnectionTypeSecure:
  19. clientConn = packetack.NewClientIntermediateSecure(request.ClientConn)
  20. default:
  21. panic("unknown connection type")
  22. }
  23. wg := &sync.WaitGroup{}
  24. wg.Add(2)
  25. go middlePipe(telegramConn, clientConn, wg, request.Logger)
  26. go middlePipe(clientConn, telegramConn, wg, request.Logger)
  27. wg.Wait()
  28. }
  29. func middlePipe(dst conntypes.PacketAckWriteCloser,
  30. src conntypes.PacketAckReadCloser,
  31. wg *sync.WaitGroup,
  32. logger *zap.SugaredLogger) {
  33. defer func() {
  34. dst.Close()
  35. src.Close()
  36. wg.Done()
  37. }()
  38. for {
  39. acks := conntypes.ConnectionAcks{}
  40. packet, err := src.Read(&acks)
  41. if err != nil {
  42. logger.Debugw("Cannot read packet", "error", err)
  43. return
  44. }
  45. if err = dst.Write(packet, &acks); err != nil {
  46. logger.Debugw("Cannot send packet", "error", err)
  47. return
  48. }
  49. }
  50. }