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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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. }