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.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package mtglib
  2. import (
  3. "encoding/base64"
  4. "encoding/hex"
  5. "errors"
  6. "fmt"
  7. "strings"
  8. )
  9. type Secret struct {
  10. Key []byte
  11. Host string
  12. }
  13. func (s *Secret) MarshalText() ([]byte, error) {
  14. if s == nil {
  15. return nil, nil
  16. }
  17. return []byte(s.String()), nil
  18. }
  19. func (s *Secret) UnmarshalText(text []byte) error {
  20. sc, err := ParseSecret(string(text))
  21. if err != nil {
  22. return err
  23. }
  24. *s = sc
  25. return nil
  26. }
  27. func (s Secret) Base64() string {
  28. return s.String()
  29. }
  30. func (s Secret) EE() string {
  31. return "ee" + hex.EncodeToString(append(s.Key, s.Host...))
  32. }
  33. func (s Secret) String() string {
  34. return base64.StdEncoding.EncodeToString(append(s.Key, s.Host...))
  35. }
  36. func ParseSecret(secret string) (Secret, error) {
  37. rv := Secret{}
  38. if secret == "" {
  39. return rv, errors.New("secret cannot be empty")
  40. }
  41. decoded, err := base64.RawStdEncoding.DecodeString(secret)
  42. if err != nil && strings.HasPrefix(secret, "ee") {
  43. decoded, err = hex.DecodeString(strings.TrimPrefix(secret, "ee"))
  44. }
  45. if err != nil {
  46. return rv, fmt.Errorf("incorrect secret format: %w", err)
  47. }
  48. if len(decoded) < 33 {
  49. return rv, fmt.Errorf("secret %s has incorrect length", secret)
  50. }
  51. rv.Key = decoded[:32]
  52. rv.Host = string(decoded[32:])
  53. return rv, nil
  54. }