mtproto.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package conf
  2. import (
  3. "encoding/hex"
  4. "encoding/json"
  5. "github.com/golang/protobuf/proto"
  6. "github.com/xtls/xray-core/common/protocol"
  7. "github.com/xtls/xray-core/common/serial"
  8. "github.com/xtls/xray-core/proxy/mtproto"
  9. )
  10. type MTProtoAccount struct {
  11. Secret string `json:"secret"`
  12. }
  13. // Build implements Buildable
  14. func (a *MTProtoAccount) Build() (*mtproto.Account, error) {
  15. if len(a.Secret) != 32 {
  16. return nil, newError("MTProto secret must have 32 chars")
  17. }
  18. secret, err := hex.DecodeString(a.Secret)
  19. if err != nil {
  20. return nil, newError("failed to decode secret: ", a.Secret).Base(err)
  21. }
  22. return &mtproto.Account{
  23. Secret: secret,
  24. }, nil
  25. }
  26. type MTProtoServerConfig struct {
  27. Users []json.RawMessage `json:"users"`
  28. }
  29. func (c *MTProtoServerConfig) Build() (proto.Message, error) {
  30. config := &mtproto.ServerConfig{}
  31. if len(c.Users) == 0 {
  32. return nil, newError("zero MTProto users configured.")
  33. }
  34. config.User = make([]*protocol.User, len(c.Users))
  35. for idx, rawData := range c.Users {
  36. user := new(protocol.User)
  37. if err := json.Unmarshal(rawData, user); err != nil {
  38. return nil, newError("invalid MTProto user").Base(err)
  39. }
  40. account := new(MTProtoAccount)
  41. if err := json.Unmarshal(rawData, account); err != nil {
  42. return nil, newError("invalid MTProto user").Base(err)
  43. }
  44. accountProto, err := account.Build()
  45. if err != nil {
  46. return nil, newError("failed to parse MTProto user").Base(err)
  47. }
  48. user.Account = serial.ToTypedMessage(accountProto)
  49. config.User[idx] = user
  50. }
  51. return config, nil
  52. }
  53. type MTProtoClientConfig struct {
  54. }
  55. func (c *MTProtoClientConfig) Build() (proto.Message, error) {
  56. config := new(mtproto.ClientConfig)
  57. return config, nil
  58. }