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.

faketls.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package stream
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "time"
  8. "go.uber.org/zap"
  9. "github.com/9seconds/mtg/conntypes"
  10. "github.com/9seconds/mtg/tlstypes"
  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 := acquireBytesBuffer()
  34. defer releaseBytesBuffer(buf)
  35. for _, v := range tlstypes.MakeRecords(p) {
  36. buf.Reset()
  37. v.WriteBytes(buf)
  38. _, err := writeFunc(buf.Bytes())
  39. if err != nil {
  40. return sum, err
  41. }
  42. sum += v.Data.Len()
  43. }
  44. return sum, nil
  45. }
  46. func (w *wrapperFakeTLS) Conn() net.Conn {
  47. return w.parent.Conn()
  48. }
  49. func (w *wrapperFakeTLS) Logger() *zap.SugaredLogger {
  50. return w.parent.Logger().Named("faketls")
  51. }
  52. func (w *wrapperFakeTLS) LocalAddr() *net.TCPAddr {
  53. return w.parent.LocalAddr()
  54. }
  55. func (w *wrapperFakeTLS) RemoteAddr() *net.TCPAddr {
  56. return w.parent.RemoteAddr()
  57. }
  58. func (w *wrapperFakeTLS) Close() error {
  59. return w.parent.Close()
  60. }
  61. func NewFakeTLS(socket conntypes.StreamReadWriteCloser) conntypes.StreamReadWriteCloser {
  62. faketls := &wrapperFakeTLS{
  63. parent: socket,
  64. }
  65. faketls.readFunc = func() ([]byte, error) {
  66. for {
  67. rec, err := tlstypes.ReadRecord(faketls.parent)
  68. if err != nil {
  69. return nil, err
  70. }
  71. switch rec.Type {
  72. case tlstypes.RecordTypeChangeCipherSpec:
  73. case tlstypes.RecordTypeApplicationData:
  74. buf := &bytes.Buffer{}
  75. rec.Data.WriteBytes(buf)
  76. return buf.Bytes(), nil
  77. default:
  78. return nil, fmt.Errorf("unsupported record type %v", rec.Type)
  79. }
  80. }
  81. }
  82. return faketls
  83. }