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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

config.go 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package config
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "net"
  6. "strconv"
  7. "time"
  8. "github.com/juju/errors"
  9. )
  10. type Config struct {
  11. Debug bool
  12. Verbose bool
  13. BindIP net.IP
  14. BindPort uint16
  15. PublicIPv4 net.IP
  16. PublicIPv4Port uint16
  17. PublicIPv6 net.IP
  18. PublicIPv6Port uint16
  19. StatsIP net.IP
  20. StatsPort uint16
  21. TimeoutRead time.Duration
  22. TimeoutWrite time.Duration
  23. Secret []byte
  24. }
  25. type URLs struct {
  26. TG string `json:"tg_url"`
  27. TMe string `json:"tme_url"`
  28. TGQRCode string `json:"tg_qrcode"`
  29. TMeQRCode string `json:"tme_qrcode"`
  30. }
  31. type IPURLs struct {
  32. IPv4 URLs `json:"ipv4"`
  33. IPv6 URLs `json:"ipv6"`
  34. }
  35. func (c *Config) BindAddr() string {
  36. return getAddr(c.BindIP, c.BindPort)
  37. }
  38. func (c *Config) IPv4Addr() string {
  39. return getAddr(c.PublicIPv4, c.PublicIPv4Port)
  40. }
  41. func (c *Config) IPv6Addr() string {
  42. return getAddr(c.PublicIPv6, c.PublicIPv6Port)
  43. }
  44. func (c *Config) StatAddr() string {
  45. return getAddr(c.StatsIP, c.StatsPort)
  46. }
  47. func (c *Config) GetURLs() IPURLs {
  48. return IPURLs{
  49. IPv4: getURLs(c.PublicIPv4, c.PublicIPv4Port, c.Secret),
  50. IPv6: getURLs(c.PublicIPv6, c.PublicIPv6Port, c.Secret),
  51. }
  52. }
  53. func getAddr(host fmt.Stringer, port uint16) string {
  54. return net.JoinHostPort(host.String(), strconv.Itoa(int(port)))
  55. }
  56. func NewConfig(debug, verbose bool,
  57. bindIP net.IP, bindPort uint16,
  58. publicIPv4 net.IP, PublicIPv4Port uint16,
  59. publicIPv6 net.IP, publicIPv6Port uint16,
  60. statsIP net.IP, statsPort uint16,
  61. timeoutRead, timeoutWrite time.Duration,
  62. secret string) (*Config, error) {
  63. secretBytes, err := hex.DecodeString(secret)
  64. if err != nil {
  65. return nil, errors.Annotate(err, "Cannot create config")
  66. }
  67. if publicIPv4 == nil {
  68. publicIPv4, err = getGlobalIPv4()
  69. if err != nil {
  70. return nil, errors.Errorf("Cannot get public IP")
  71. }
  72. }
  73. if publicIPv4.To4() == nil {
  74. return nil, errors.Errorf("IP %s is not IPv4", publicIPv4.String())
  75. }
  76. if PublicIPv4Port == 0 {
  77. PublicIPv4Port = bindPort
  78. }
  79. if publicIPv6 == nil {
  80. publicIPv6, err = getGlobalIPv6()
  81. if err != nil {
  82. publicIPv6 = publicIPv4
  83. }
  84. }
  85. if publicIPv6.To16() == nil {
  86. return nil, errors.Errorf("IP %s is not IPv6", publicIPv6.String())
  87. }
  88. if publicIPv6Port == 0 {
  89. publicIPv6Port = bindPort
  90. }
  91. if statsIP == nil {
  92. statsIP = publicIPv4
  93. }
  94. conf := &Config{
  95. Debug: debug,
  96. Verbose: verbose,
  97. BindIP: bindIP,
  98. BindPort: bindPort,
  99. PublicIPv4: publicIPv4,
  100. PublicIPv4Port: PublicIPv4Port,
  101. PublicIPv6: publicIPv6,
  102. PublicIPv6Port: publicIPv6Port,
  103. TimeoutRead: timeoutRead,
  104. TimeoutWrite: timeoutWrite,
  105. Secret: secretBytes,
  106. }
  107. return conf, nil
  108. }