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 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package proxy
  2. import (
  3. "context"
  4. "net"
  5. "sync"
  6. "github.com/juju/errors"
  7. "github.com/9seconds/mtg/client"
  8. "github.com/9seconds/mtg/config"
  9. "github.com/9seconds/mtg/mtproto"
  10. "github.com/9seconds/mtg/telegram"
  11. "github.com/9seconds/mtg/wrappers"
  12. )
  13. func NewProxyMiddle(conf *config.Config) *Proxy {
  14. tg := telegram.NewMiddleTelegram(conf)
  15. return &Proxy{
  16. conf: conf,
  17. acceptCallback: func(ctx context.Context, cancel context.CancelFunc, clientSocket net.Conn,
  18. connID string, wait *sync.WaitGroup, conf *config.Config) error {
  19. client, opts, err := client.MiddleInit(ctx, cancel, clientSocket, connID, conf)
  20. if err != nil {
  21. return errors.Annotate(err, "Cannot initialize client connection")
  22. }
  23. defer client.Close()
  24. server, err := middleTelegramStream(ctx, cancel, opts, connID, tg)
  25. if err != nil {
  26. return errors.Annotate(err, "Cannot initialize telegram connection")
  27. }
  28. defer server.Close()
  29. wait.Add(2)
  30. go middlePipe(client, server, wait, &opts.ReadHacks)
  31. go middlePipe(server, client, wait, &opts.WriteHacks)
  32. return nil
  33. },
  34. }
  35. }
  36. func middleTelegramStream(ctx context.Context, cancel context.CancelFunc, opts *mtproto.ConnectionOpts,
  37. connID string, tg *telegram.MiddleTelegram) (wrappers.WrapPacketReadWriteCloser, error) {
  38. streamConn, err := tg.Dial(connID, opts)
  39. if err != nil {
  40. return nil, errors.Annotate(err, "Cannot dial to Telegram")
  41. }
  42. streamConn = wrappers.NewCtx(ctx, cancel, streamConn)
  43. packetConn, err := tg.Init(opts, streamConn)
  44. if err != nil {
  45. return nil, errors.Annotate(err, "Cannot handshake telegram")
  46. }
  47. return packetConn, nil
  48. }
  49. func middlePipe(src wrappers.WrapPacketReader, dst wrappers.WrapPacketWriter, wait *sync.WaitGroup, hacks *mtproto.Hacks) {
  50. defer wait.Done()
  51. for {
  52. hacks.SimpleAck = false
  53. hacks.QuickAck = false
  54. packet, err := src.Read()
  55. if err != nil {
  56. return
  57. }
  58. if _, err = dst.Write(packet); err != nil {
  59. return
  60. }
  61. }
  62. }