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

access_test.go 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package cli_test
  2. import (
  3. "net"
  4. "net/http"
  5. "testing"
  6. "github.com/9seconds/mtg/v2/config"
  7. "github.com/9seconds/mtg/v2/mtglib"
  8. "github.com/jarcoal/httpmock"
  9. "github.com/stretchr/testify/suite"
  10. "github.com/xeipuuv/gojsonschema"
  11. )
  12. var accressResponseJSONSchema = func() *gojsonschema.Schema {
  13. schema, err := gojsonschema.NewSchema(gojsonschema.NewStringLoader(`
  14. {
  15. "type": "object",
  16. "required": ["secret"],
  17. "additionalProperties": true,
  18. "properties": {
  19. "secret": {
  20. "type": "object",
  21. "required": [
  22. "hex",
  23. "base64"
  24. ],
  25. "additionalProperties": false,
  26. "properties": {
  27. "hex": {
  28. "type": "string",
  29. "minLength": 34
  30. },
  31. "base64": {
  32. "type": "string",
  33. "minLength": 10
  34. }
  35. }
  36. },
  37. "ipv4": {
  38. "$ref": "#/definitions/ip"
  39. },
  40. "ipv6": {
  41. "$ref": "#/definitions/ip"
  42. }
  43. },
  44. "definitions": {
  45. "ip": {
  46. "type": "object",
  47. "required": [
  48. "ip",
  49. "port",
  50. "tg_url",
  51. "tg_qrcode",
  52. "tme_url",
  53. "tme_qrcode"
  54. ],
  55. "additionalProperties": false,
  56. "properties": {
  57. "ip": {
  58. "type": "string",
  59. "minLength": 1,
  60. "anyOf": [
  61. {
  62. "format": "ipv4"
  63. },
  64. {
  65. "format": "ipv6"
  66. }
  67. ]
  68. },
  69. "port": {
  70. "type": "integer",
  71. "multipleOf": 1.0,
  72. "exclusiveMinimum": 0,
  73. "exclusiveMaximum": 65536
  74. },
  75. "tg_url": {
  76. "type": "string",
  77. "minLength": 1,
  78. "format": "uri"
  79. },
  80. "tg_qrcode": {
  81. "type": "string",
  82. "minLength": 1,
  83. "format": "uri"
  84. },
  85. "tme_url": {
  86. "type": "string",
  87. "minLength": 1,
  88. "format": "uri"
  89. },
  90. "tme_qrcode": {
  91. "type": "string",
  92. "minLength": 1,
  93. "format": "uri"
  94. }
  95. }
  96. }
  97. }
  98. }
  99. `))
  100. if err != nil {
  101. panic(err)
  102. }
  103. return schema
  104. }()
  105. type AccessTestSuite struct {
  106. CommonTestSuite
  107. }
  108. func (suite *AccessTestSuite) SetupTest() {
  109. suite.CommonTestSuite.SetupTest()
  110. suite.cli.Access.Config = &config.Config{}
  111. suite.cli.Access.Config.Secret = mtglib.GenerateSecret("google.com")
  112. suite.cli.Access.Network = suite.networkMock
  113. suite.NoError(
  114. suite.cli.Access.Config.BindTo.UnmarshalText([]byte("0.0.0.0:80")))
  115. }
  116. func (suite *AccessTestSuite) TestGenerateNoCalls() {
  117. suite.cli.Access.PublicIPv4 = net.ParseIP("10.0.0.10")
  118. suite.cli.Access.PublicIPv6 = net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
  119. output := suite.CaptureStdout(func() {
  120. suite.NoError(suite.cli.Access.Execute(suite.cli))
  121. })
  122. validated, err := accressResponseJSONSchema.Validate(
  123. gojsonschema.NewStringLoader(output))
  124. suite.NoError(err)
  125. suite.Empty(validated.Errors())
  126. suite.True(validated.Valid())
  127. suite.Contains(output, "10.0.0.10")
  128. suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
  129. suite.Contains(output, "ipv4")
  130. suite.Contains(output, "ipv6")
  131. suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
  132. suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
  133. }
  134. func (suite *AccessTestSuite) TestGenerateIPv4Call() {
  135. suite.cli.Access.PublicIPv6 = net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
  136. httpmock.RegisterResponder(http.MethodGet, "https://ifconfig.co",
  137. httpmock.NewStringResponder(http.StatusOK, "10.11.12.13"))
  138. output := suite.CaptureStdout(func() {
  139. suite.NoError(suite.cli.Access.Execute(suite.cli))
  140. })
  141. validated, err := accressResponseJSONSchema.Validate(
  142. gojsonschema.NewStringLoader(output))
  143. suite.NoError(err)
  144. suite.Empty(validated.Errors())
  145. suite.True(validated.Valid())
  146. suite.Contains(output, "10.11.12.13")
  147. suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
  148. suite.Contains(output, "ipv4")
  149. suite.Contains(output, "ipv6")
  150. suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
  151. suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
  152. }
  153. func (suite *AccessTestSuite) TestIPv4CallFail() {
  154. suite.cli.Access.PublicIPv6 = net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
  155. httpmock.RegisterResponder(http.MethodGet, "https://ifconfig.co",
  156. httpmock.NewStringResponder(http.StatusForbidden, ""))
  157. output := suite.CaptureStdout(func() {
  158. suite.NoError(suite.cli.Access.Execute(suite.cli))
  159. })
  160. validated, err := accressResponseJSONSchema.Validate(
  161. gojsonschema.NewStringLoader(output))
  162. suite.NoError(err)
  163. suite.Empty(validated.Errors())
  164. suite.True(validated.Valid())
  165. suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
  166. suite.NotContains(output, "ipv4")
  167. suite.Contains(output, "ipv6")
  168. suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
  169. suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
  170. }
  171. func TestAccess(t *testing.T) {
  172. t.Parallel()
  173. suite.Run(t, &AccessTestSuite{})
  174. }