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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

access_test.go 5.6KB

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