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
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

config.go 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package config
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/url"
  7. "github.com/9seconds/mtg/v2/mtglib"
  8. )
  9. type Optional struct {
  10. Enabled TypeBool `json:"enabled"`
  11. }
  12. type ListConfig struct {
  13. Optional
  14. DownloadConcurrency TypeConcurrency `json:"downloadConcurrency"`
  15. URLs []TypeBlocklistURI `json:"urls"`
  16. UpdateEach TypeDuration `json:"updateEach"`
  17. }
  18. type Config struct {
  19. Debug TypeBool `json:"debug"`
  20. AllowFallbackOnUnknownDC TypeBool `json:"allowFallbackOnUnknownDc"`
  21. Secret mtglib.Secret `json:"secret"`
  22. BindTo TypeHostPort `json:"bindTo"`
  23. ProxyProtocolListener TypeBool `json:"proxyProtocolListener"`
  24. PreferIP TypePreferIP `json:"preferIp"`
  25. AutoUpdate TypeBool `json:"autoUpdate"`
  26. DomainFrontingPort TypePort `json:"domainFrontingPort"`
  27. DomainFrontingIP TypeIP `json:"domainFrontingIp"`
  28. DomainFrontingProxyProtocol TypeBool `json:"domainFrontingProxyProtocol"`
  29. TolerateTimeSkewness TypeDuration `json:"tolerateTimeSkewness"`
  30. Concurrency TypeConcurrency `json:"concurrency"`
  31. PublicIPv4 TypeIP `json:"publicIpv4"`
  32. PublicIPv6 TypeIP `json:"publicIpv6"`
  33. DomainFronting struct {
  34. Host TypeHost `json:"host"`
  35. IP TypeIP `json:"ip"`
  36. Port TypePort `json:"port"`
  37. ProxyProtocol TypeBool `json:"proxyProtocol"`
  38. } `json:"domainFronting"`
  39. Defense struct {
  40. AntiReplay struct {
  41. Optional
  42. MaxSize TypeBytes `json:"maxSize"`
  43. ErrorRate TypeErrorRate `json:"errorRate"`
  44. } `json:"antiReplay"`
  45. Blocklist ListConfig `json:"blocklist"`
  46. Allowlist ListConfig `json:"allowlist"`
  47. Doppelganger struct {
  48. URLs []TypeHttpsURL `json:"urls"`
  49. Repeats TypeConcurrency `json:"repeats_per_raid"`
  50. UpdateEach TypeDuration `json:"raid_each"`
  51. DRS TypeBool `json:"drs"`
  52. } `json:"doppelganger"`
  53. } `json:"defense"`
  54. Network struct {
  55. Timeout struct {
  56. TCP TypeDuration `json:"tcp"`
  57. HTTP TypeDuration `json:"http"`
  58. Idle TypeDuration `json:"idle"`
  59. Handshake TypeDuration `json:"handshake"`
  60. } `json:"timeout"`
  61. KeepAlive struct {
  62. Disabled TypeBool `json:"disabled"`
  63. Idle TypeDuration `json:"idle"`
  64. Interval TypeDuration `json:"interval"`
  65. Count TypeConcurrency `json:"count"`
  66. } `json:"keepAlive"`
  67. DOHIP TypeIP `json:"dohIp"`
  68. DNS TypeDNSURI `json:"dns"`
  69. Proxies []TypeProxyURL `json:"proxies"`
  70. } `json:"network"`
  71. Stats struct {
  72. StatsD struct {
  73. Optional
  74. Address TypeHostPort `json:"address"`
  75. MetricPrefix TypeMetricPrefix `json:"metricPrefix"`
  76. TagFormat TypeStatsdTagFormat `json:"tagFormat"`
  77. } `json:"statsd"`
  78. Prometheus struct {
  79. Optional
  80. BindTo TypeHostPort `json:"bindTo"`
  81. HTTPPath TypeHTTPPath `json:"httpPath"`
  82. MetricPrefix TypeMetricPrefix `json:"metricPrefix"`
  83. } `json:"prometheus"`
  84. } `json:"stats"`
  85. }
  86. func (c *Config) GetConcurrency(defaultValue uint) uint {
  87. if concurrency := c.Concurrency.Get(0); concurrency != 0 {
  88. return concurrency
  89. }
  90. return c.Concurrency.Get(defaultValue)
  91. }
  92. func (c *Config) GetDNS() *url.URL {
  93. var dohURL *url.URL
  94. if dohIP := c.Network.DOHIP.Get(nil); dohIP != nil {
  95. dohURL, _ = url.Parse("https://" + dohIP.String())
  96. }
  97. return c.Network.DNS.Get(dohURL)
  98. }
  99. func (c *Config) GetDomainFrontingPort(defaultValue uint) uint {
  100. if port := c.DomainFronting.Port.Get(0); port != 0 {
  101. return port
  102. }
  103. return c.DomainFrontingPort.Get(defaultValue)
  104. }
  105. func (c *Config) GetDomainFrontingHost() string {
  106. return c.DomainFronting.Host.Get("")
  107. }
  108. func (c *Config) GetDomainFrontingProxyProtocol(defaultValue bool) bool {
  109. return c.DomainFronting.ProxyProtocol.Get(false) || c.DomainFrontingProxyProtocol.Get(defaultValue)
  110. }
  111. func (c *Config) Validate() error {
  112. if !c.Secret.Valid() {
  113. return fmt.Errorf("invalid secret %s", c.Secret.String())
  114. }
  115. if c.BindTo.Get("") == "" {
  116. return fmt.Errorf("incorrect bind-to parameter %s", c.BindTo.String())
  117. }
  118. return nil
  119. }
  120. func (c *Config) String() string {
  121. buf := &bytes.Buffer{}
  122. encoder := json.NewEncoder(buf)
  123. encoder.SetEscapeHTML(false)
  124. if err := encoder.Encode(c); err != nil {
  125. panic(err)
  126. }
  127. return buf.String()
  128. }