user.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package json
  2. import (
  3. "encoding/json"
  4. "math/rand"
  5. "github.com/v2ray/v2ray-core/common/uuid"
  6. "github.com/v2ray/v2ray-core/proxy/vmess"
  7. )
  8. // ConfigUser is an user account in VMess configuration.
  9. type ConfigUser struct {
  10. Id *vmess.ID
  11. Email string
  12. LevelValue vmess.UserLevel
  13. AlterIds []*vmess.ID
  14. }
  15. func (u *ConfigUser) UnmarshalJSON(data []byte) error {
  16. type rawUser struct {
  17. IdString string `json:"id"`
  18. EmailString string `json:"email"`
  19. LevelInt int `json:"level"`
  20. AlterIdCount int `json:"alterId"`
  21. }
  22. var rawUserValue rawUser
  23. if err := json.Unmarshal(data, &rawUserValue); err != nil {
  24. return err
  25. }
  26. id, err := uuid.ParseString(rawUserValue.IdString)
  27. if err != nil {
  28. return err
  29. }
  30. u.Id = vmess.NewID(id)
  31. u.Email = rawUserValue.EmailString
  32. u.LevelValue = vmess.UserLevel(rawUserValue.LevelInt)
  33. if rawUserValue.AlterIdCount > 0 {
  34. prevId := u.Id.UUID()
  35. // TODO: check duplicate
  36. u.AlterIds = make([]*vmess.ID, rawUserValue.AlterIdCount)
  37. for idx, _ := range u.AlterIds {
  38. newid := prevId.Next()
  39. u.AlterIds[idx] = vmess.NewID(newid)
  40. prevId = newid
  41. }
  42. }
  43. return nil
  44. }
  45. func (u *ConfigUser) ID() *vmess.ID {
  46. return u.Id
  47. }
  48. func (this *ConfigUser) Level() vmess.UserLevel {
  49. return this.LevelValue
  50. }
  51. func (this *ConfigUser) AlterIDs() []*vmess.ID {
  52. return this.AlterIds
  53. }
  54. func (this *ConfigUser) AnyValidID() *vmess.ID {
  55. if len(this.AlterIds) == 0 {
  56. return this.ID()
  57. }
  58. if len(this.AlterIds) == 1 {
  59. return this.AlterIds[0]
  60. }
  61. idIdx := rand.Intn(len(this.AlterIds))
  62. return this.AlterIds[idIdx]
  63. }