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 1.8KB

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