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