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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package wrappers
  2. import (
  3. "net"
  4. "time"
  5. "go.uber.org/zap"
  6. "github.com/9seconds/mtg/stats"
  7. )
  8. type ConnPurpose uint8
  9. func (c ConnPurpose) String() string {
  10. switch c {
  11. case ConnPurposeClient:
  12. return "client"
  13. case ConnPurposeTelegram:
  14. return "telegram"
  15. }
  16. return ""
  17. }
  18. const (
  19. ConnPurposeClient = iota
  20. ConnPurposeTelegram
  21. )
  22. const (
  23. connTimeoutRead = 5 * time.Minute
  24. connTimeoutWrite = 5 * time.Minute
  25. )
  26. type Conn struct {
  27. connID string
  28. conn net.Conn
  29. logger *zap.SugaredLogger
  30. publicIPv4 net.IP
  31. publicIPv6 net.IP
  32. }
  33. func (c *Conn) Write(p []byte) (int, error) {
  34. c.conn.SetWriteDeadline(time.Now().Add(connTimeoutWrite))
  35. n, err := c.conn.Write(p)
  36. c.logger.Debugw("Write to stream", "bytes", n, "error", err)
  37. stats.EgressTraffic(n)
  38. return n, err
  39. }
  40. func (c *Conn) Read(p []byte) (int, error) {
  41. c.conn.SetReadDeadline(time.Now().Add(connTimeoutRead))
  42. n, err := c.conn.Read(p)
  43. c.logger.Debugw("Read from stream", "bytes", n, "error", err)
  44. stats.IngressTraffic(n)
  45. return n, err
  46. }
  47. func (c *Conn) Close() error {
  48. defer c.logger.Debugw("Closed connection")
  49. return c.conn.Close()
  50. }
  51. func (c *Conn) LocalAddr() *net.TCPAddr {
  52. addr := c.conn.LocalAddr().(*net.TCPAddr)
  53. newAddr := *addr
  54. if c.RemoteAddr().IP.To4() != nil {
  55. if c.publicIPv4 != nil {
  56. newAddr.IP = c.publicIPv4
  57. }
  58. } else if c.publicIPv6 != nil {
  59. newAddr.IP = c.publicIPv6
  60. }
  61. return &newAddr
  62. }
  63. func (c *Conn) RemoteAddr() *net.TCPAddr {
  64. return c.conn.RemoteAddr().(*net.TCPAddr)
  65. }
  66. func (c *Conn) Logger() *zap.SugaredLogger {
  67. return c.logger
  68. }
  69. func NewConn(conn net.Conn, connID string, purpose ConnPurpose, publicIPv4, publicIPv6 net.IP) StreamReadWriteCloser {
  70. logger := zap.S().With(
  71. "connection_id", connID,
  72. "local_address", conn.LocalAddr(),
  73. "remote_address", conn.RemoteAddr(),
  74. "purpose", purpose,
  75. ).Named("conn")
  76. wrapper := Conn{
  77. logger: logger,
  78. connID: connID,
  79. conn: conn,
  80. publicIPv4: publicIPv4,
  81. publicIPv6: publicIPv6,
  82. }
  83. wrapper.logger = logger.With("faked_local_addr", wrapper.LocalAddr())
  84. return &wrapper
  85. }