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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

direct.go 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package telegram
  2. import (
  3. "net"
  4. "github.com/juju/errors"
  5. "go.uber.org/zap"
  6. "github.com/9seconds/mtg/config"
  7. "github.com/9seconds/mtg/mtproto"
  8. "github.com/9seconds/mtg/obfuscated2"
  9. "github.com/9seconds/mtg/wrappers"
  10. )
  11. var (
  12. directV4Addresses = map[int16][]string{
  13. 0: []string{"149.154.175.50:443"},
  14. 1: []string{"149.154.167.51:443"},
  15. 2: []string{"149.154.175.100:443"},
  16. 3: []string{"149.154.167.91:443"},
  17. 4: []string{"149.154.171.5:443"},
  18. }
  19. directV6Addresses = map[int16][]string{
  20. 0: []string{"[2001:b28:f23d:f001::a]:443"},
  21. 1: []string{"[2001:67c:04e8:f002::a]:443"},
  22. 2: []string{"[2001:b28:f23d:f003::a]:443"},
  23. 3: []string{"[2001:67c:04e8:f004::a]:443"},
  24. 4: []string{"[2001:b28:f23f:f005::a]:443"},
  25. }
  26. )
  27. type directTelegram struct {
  28. baseTelegram
  29. }
  30. func (t *directTelegram) Dial(sock string, connOpts *mtproto.ConnectionOpts) (wrappers.ReadWriteCloserWithAddr, error) {
  31. dc := connOpts.DC
  32. if dc < 0 {
  33. dc = -dc
  34. } else if dc == 0 {
  35. dc = 1
  36. }
  37. return t.baseTelegram.dial(dc-1, sock, connOpts.ConnectionProto)
  38. }
  39. func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.ReadWriteCloserWithAddr) (wrappers.ReadWriteCloserWithAddr, error) {
  40. obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts)
  41. if n, err := conn.Write(frame); err != nil || n != obfuscated2.FrameLen {
  42. return nil, errors.Annotate(err, "Cannot write hadnshake frame")
  43. }
  44. return wrappers.NewStreamCipherRWC(conn, obfs2.Encryptor, obfs2.Decryptor), nil
  45. }
  46. // NewDirectTelegram returns Telegram instance which connects directly
  47. // to Telegram bypassing middleproxies.
  48. func NewDirectTelegram(conf *config.Config, _ *zap.SugaredLogger) Telegram {
  49. return &directTelegram{baseTelegram{
  50. dialer: tgDialer{
  51. Dialer: net.Dialer{Timeout: telegramDialTimeout},
  52. conf: conf,
  53. },
  54. v4Addresses: directV4Addresses,
  55. v6Addresses: directV6Addresses,
  56. }}
  57. }