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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package network_test
  2. import (
  3. "net"
  4. "net/url"
  5. "sync"
  6. "testing"
  7. "github.com/9seconds/mtg/v2/mtglib"
  8. "github.com/9seconds/mtg/v2/network/v2"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. "github.com/stretchr/testify/suite"
  12. "github.com/things-go/go-socks5"
  13. )
  14. type SocksProxyTestSuite struct {
  15. EchoServerTestSuite
  16. wg sync.WaitGroup
  17. baseNetwork mtglib.Network
  18. noAuthURL *url.URL
  19. authURL *url.URL
  20. noAuthListener net.Listener
  21. authListener net.Listener
  22. noAuthServer *socks5.Server
  23. authServer *socks5.Server
  24. }
  25. func (suite *SocksProxyTestSuite) SetupSuite() {
  26. suite.EchoServerTestSuite.SetupSuite()
  27. listener, err := net.Listen("tcp4", "127.0.0.1:0")
  28. require.NoError(suite.T(), err)
  29. suite.noAuthListener = listener
  30. listener, err = net.Listen("tcp4", "127.0.0.1:0")
  31. require.NoError(suite.T(), err)
  32. suite.authListener = listener
  33. suite.noAuthServer = socks5.NewServer()
  34. suite.wg.Go(func() {
  35. suite.noAuthServer.Serve(suite.noAuthListener) //nolint: errcheck
  36. })
  37. suite.authServer = socks5.NewServer(
  38. socks5.WithAuthMethods([]socks5.Authenticator{
  39. socks5.UserPassAuthenticator{
  40. Credentials: socks5.StaticCredentials{
  41. "user": "pass",
  42. },
  43. },
  44. }))
  45. suite.wg.Go(func() {
  46. suite.authServer.Serve(suite.authListener) //nolint: errcheck
  47. })
  48. parsed, err := url.Parse("socks5://" + suite.noAuthListener.Addr().String())
  49. require.NoError(suite.T(), err)
  50. suite.noAuthURL = parsed
  51. parsed, err = url.Parse("socks5://user:pass@" + suite.authListener.Addr().String())
  52. require.NoError(suite.T(), err)
  53. suite.authURL = parsed
  54. suite.baseNetwork = network.New(nil, "mtg", 0, 0, 0, network.DefaultKeepAliveConfig)
  55. }
  56. func (suite *SocksProxyTestSuite) TestIncorrectSchema() {
  57. parsed, err := url.Parse("http://hello")
  58. suite.NoError(err)
  59. _, err = network.NewProxyNetwork(suite.baseNetwork, parsed)
  60. suite.Error(err)
  61. }
  62. func (suite *SocksProxyTestSuite) TestRead() {
  63. testData := map[string][]*url.URL{
  64. "noAuth": {suite.noAuthURL},
  65. "auth": {suite.authURL},
  66. "both": {suite.noAuthURL, suite.authURL},
  67. }
  68. for name, proxies := range testData {
  69. suite.T().Run(name, func(t *testing.T) {
  70. proxyNetworks := []mtglib.Network{}
  71. for _, u := range proxies {
  72. value, err := network.NewProxyNetwork(suite.baseNetwork, u)
  73. assert.NoError(t, err)
  74. proxyNetworks = append(proxyNetworks, value)
  75. }
  76. netw, err := network.Join(proxyNetworks...)
  77. assert.NoError(t, err)
  78. conn, err := netw.Dial("tcp4", suite.EchoServerAddr())
  79. assert.NoError(t, err)
  80. data := []byte{1, 2, 3}
  81. n, err := conn.Write(data)
  82. assert.NoError(t, err)
  83. assert.Equal(t, len(data), n)
  84. toRead := []byte{1, 2, 3, 4, 5}
  85. n, err = conn.Read(toRead)
  86. assert.NoError(t, err)
  87. assert.Equal(t, len(data), n)
  88. assert.Equal(t, data, toRead[:n])
  89. assert.NotEqual(t, data, toRead)
  90. })
  91. }
  92. }
  93. func (suite *SocksProxyTestSuite) TearDownSuite() {
  94. suite.noAuthListener.Close() //nolint: errcheck
  95. suite.authListener.Close() //nolint: errcheck
  96. suite.wg.Wait()
  97. suite.EchoServerTestSuite.TearDownSuite()
  98. }
  99. func TestSocksProxy(t *testing.T) {
  100. t.Parallel()
  101. suite.Run(t, &SocksProxyTestSuite{})
  102. }