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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

client_abridged.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package packetack
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "net"
  7. "go.uber.org/zap"
  8. "github.com/9seconds/mtg/conntypes"
  9. "github.com/9seconds/mtg/utils"
  10. )
  11. const (
  12. clientAbridgedSmallPacketLength = 0x7f
  13. clientAbridgedQuickAckLength = 0x80
  14. clientAbridgedLargePacketLength = 16777216 // 256 ^ 3
  15. )
  16. type wrapperClientAbridged struct {
  17. parent conntypes.StreamReadWriteCloser
  18. }
  19. func (w *wrapperClientAbridged) Read(acks *conntypes.ConnectionAcks) (conntypes.Packet, error) {
  20. buf := bytes.Buffer{}
  21. buf.Grow(1)
  22. if _, err := io.CopyN(&buf, w.parent, 1); err != nil {
  23. return nil, fmt.Errorf("cannot read message length: %w", err)
  24. }
  25. msgLength := uint32(buf.Bytes()[0])
  26. buf.Reset()
  27. if msgLength >= clientAbridgedQuickAckLength {
  28. acks.Quick = true
  29. msgLength -= clientAbridgedQuickAckLength
  30. }
  31. if msgLength == clientAbridgedSmallPacketLength {
  32. buf.Grow(3)
  33. if _, err := io.CopyN(&buf, w.parent, 3); err != nil {
  34. return nil, fmt.Errorf("cannot read correct message length: %w", err)
  35. }
  36. number := utils.Uint24{}
  37. copy(number[:], buf.Bytes())
  38. msgLength = utils.FromUint24(number)
  39. }
  40. msgLength *= 4
  41. buf.Reset()
  42. buf.Grow(int(msgLength))
  43. if _, err := io.CopyN(&buf, w.parent, int64(msgLength)); err != nil {
  44. return nil, fmt.Errorf("cannot read message: %w", err)
  45. }
  46. return conntypes.Packet(buf.Bytes()), nil
  47. }
  48. func (w *wrapperClientAbridged) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error {
  49. if len(packet)%4 != 0 {
  50. return fmt.Errorf("incorrect packet length %d", len(packet))
  51. }
  52. if acks.Simple {
  53. if _, err := w.parent.Write(utils.ReverseBytes(packet)); err != nil {
  54. return fmt.Errorf("cannot send a simpleacked packet: %w", err)
  55. }
  56. return nil
  57. }
  58. packetLength := len(packet) / 4
  59. switch {
  60. case packetLength < clientAbridgedSmallPacketLength:
  61. data := append([]byte{byte(packetLength)}, packet...)
  62. if _, err := w.parent.Write(data); err != nil {
  63. return fmt.Errorf("cannot send small packet: %w", err)
  64. }
  65. return nil
  66. case packetLength < clientAbridgedLargePacketLength:
  67. length24 := utils.ToUint24(uint32(packetLength))
  68. buf := bytes.Buffer{}
  69. buf.WriteByte(byte(clientAbridgedSmallPacketLength))
  70. buf.Write(length24[:])
  71. buf.Write(packet)
  72. if _, err := w.parent.Write(buf.Bytes()); err != nil {
  73. return fmt.Errorf("cannot send large packet: %w", err)
  74. }
  75. return nil
  76. }
  77. return fmt.Errorf("packet is too big: %d", len(packet))
  78. }
  79. func (w *wrapperClientAbridged) Close() error {
  80. return w.parent.Close()
  81. }
  82. func (w *wrapperClientAbridged) Conn() net.Conn {
  83. return w.parent.Conn()
  84. }
  85. func (w *wrapperClientAbridged) LocalAddr() *net.TCPAddr {
  86. return w.parent.LocalAddr()
  87. }
  88. func (w *wrapperClientAbridged) RemoteAddr() *net.TCPAddr {
  89. return w.parent.RemoteAddr()
  90. }
  91. func (w *wrapperClientAbridged) Logger() *zap.SugaredLogger {
  92. return w.parent.Logger().Named("client-abridged")
  93. }
  94. func NewClientAbridged(parent conntypes.StreamReadWriteCloser) conntypes.PacketAckFullReadWriteCloser {
  95. return &wrapperClientAbridged{
  96. parent: parent,
  97. }
  98. }