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
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

faketls.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package stream
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "time"
  8. "github.com/9seconds/mtg/conntypes"
  9. "github.com/9seconds/mtg/tlstypes"
  10. "go.uber.org/zap"
  11. )
  12. type wrapperFakeTLS struct {
  13. bufferedReader
  14. parent conntypes.StreamReadWriteCloser
  15. }
  16. func (w *wrapperFakeTLS) Write(p []byte) (int, error) {
  17. return w.write(p, func(b []byte) (int, error) {
  18. return w.parent.Write(b)
  19. })
  20. }
  21. func (w *wrapperFakeTLS) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
  22. startTime := time.Now()
  23. return w.write(p, func(b []byte) (int, error) {
  24. elapsed := time.Since(startTime)
  25. if elapsed > timeout {
  26. return w.parent.WriteTimeout(b, timeout-elapsed)
  27. }
  28. return 0, errors.New("timeout")
  29. })
  30. }
  31. func (w *wrapperFakeTLS) write(p []byte, writeFunc func([]byte) (int, error)) (int, error) {
  32. sum := 0
  33. buf := bytes.Buffer{}
  34. for _, v := range tlstypes.MakeRecords(p) {
  35. buf.Reset()
  36. v.WriteBytes(&buf)
  37. _, err := writeFunc(buf.Bytes())
  38. if err != nil {
  39. return sum, err
  40. }
  41. sum += v.Data.Len()
  42. }
  43. return sum, nil
  44. }
  45. func (w *wrapperFakeTLS) Conn() net.Conn {
  46. return w.parent.Conn()
  47. }
  48. func (w *wrapperFakeTLS) Logger() *zap.SugaredLogger {
  49. return w.parent.Logger().Named("faketls")
  50. }
  51. func (w *wrapperFakeTLS) LocalAddr() *net.TCPAddr {
  52. return w.parent.LocalAddr()
  53. }
  54. func (w *wrapperFakeTLS) RemoteAddr() *net.TCPAddr {
  55. return w.parent.RemoteAddr()
  56. }
  57. func (w *wrapperFakeTLS) Close() error {
  58. return w.parent.Close()
  59. }
  60. func NewFakeTLS(socket conntypes.StreamReadWriteCloser) conntypes.StreamReadWriteCloser {
  61. faketls := &wrapperFakeTLS{
  62. parent: socket,
  63. }
  64. faketls.readFunc = func() ([]byte, error) {
  65. for {
  66. rec, err := tlstypes.ReadRecord(faketls.parent)
  67. if err != nil {
  68. return nil, err // nolint: wrapcheck
  69. }
  70. switch rec.Type {
  71. case tlstypes.RecordTypeChangeCipherSpec:
  72. case tlstypes.RecordTypeApplicationData:
  73. buf := &bytes.Buffer{}
  74. rec.Data.WriteBytes(buf)
  75. return buf.Bytes(), nil
  76. case tlstypes.RecordTypeHandshake:
  77. return nil, errors.New("unsupported record type handshake")
  78. default:
  79. return nil, fmt.Errorf("unsupported record type %v", rec.Type)
  80. }
  81. }
  82. }
  83. return faketls
  84. }