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

client_intermediate_secure.go 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package packetack
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "math/rand"
  7. "github.com/9seconds/mtg/conntypes"
  8. )
  9. type wrapperClientIntermediateSecure struct {
  10. wrapperClientIntermediate
  11. }
  12. func (w *wrapperClientIntermediateSecure) Read(acks *conntypes.ConnectionAcks) (conntypes.Packet, error) {
  13. data, err := w.wrapperClientIntermediate.Read(acks)
  14. if err != nil {
  15. return nil, err
  16. }
  17. length := len(data) - (len(data) % 4)
  18. return data[:length], nil
  19. }
  20. func (w *wrapperClientIntermediateSecure) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error {
  21. if acks.Simple {
  22. if _, err := w.parent.Write(packet); err != nil {
  23. return fmt.Errorf("cannot send simpleacked packet: %w", err)
  24. }
  25. return nil
  26. }
  27. buf := bytes.Buffer{}
  28. paddingLength := rand.Intn(4)
  29. buf.Grow(4 + len(packet) + paddingLength)
  30. binary.Write(&buf, binary.LittleEndian, uint32(len(packet)+paddingLength))
  31. buf.Write(packet)
  32. buf.Write(make([]byte, paddingLength))
  33. if _, err := w.parent.Write(buf.Bytes()); err != nil {
  34. return fmt.Errorf("cannot send packet: %w", err)
  35. }
  36. return nil
  37. }
  38. func NewClientIntermediateSecure(parent conntypes.StreamReadWriteCloser) conntypes.PacketAckFullReadWriteCloser {
  39. return &wrapperClientIntermediateSecure{
  40. wrapperClientIntermediate: wrapperClientIntermediate{
  41. parent: parent,
  42. },
  43. }
  44. }