validator.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package vless
  2. import (
  3. "strings"
  4. "sync"
  5. "github.com/xtls/xray-core/common/errors"
  6. "github.com/xtls/xray-core/common/protocol"
  7. "github.com/xtls/xray-core/common/uuid"
  8. )
  9. type Validator interface {
  10. Get(id uuid.UUID) *protocol.MemoryUser
  11. Add(u *protocol.MemoryUser) error
  12. Del(email string) error
  13. GetByEmail(email string) *protocol.MemoryUser
  14. GetAll() []*protocol.MemoryUser
  15. GetCount() int64
  16. }
  17. func ProcessUUID(id [16]byte) [16]byte {
  18. id[6] = 0
  19. id[7] = 0
  20. return id
  21. }
  22. // MemoryValidator stores valid VLESS users.
  23. type MemoryValidator struct {
  24. // Considering email's usage here, map + sync.Mutex/RWMutex may have better performance.
  25. email sync.Map
  26. users sync.Map
  27. }
  28. // Add a VLESS user, Email must be empty or unique.
  29. func (v *MemoryValidator) Add(u *protocol.MemoryUser) error {
  30. if u.Email != "" {
  31. _, loaded := v.email.LoadOrStore(strings.ToLower(u.Email), u)
  32. if loaded {
  33. return errors.New("User ", u.Email, " already exists.")
  34. }
  35. }
  36. v.users.Store(ProcessUUID(u.Account.(*MemoryAccount).ID.UUID()), u)
  37. return nil
  38. }
  39. // Del a VLESS user with a non-empty Email.
  40. func (v *MemoryValidator) Del(e string) error {
  41. if e == "" {
  42. return errors.New("Email must not be empty.")
  43. }
  44. le := strings.ToLower(e)
  45. u, _ := v.email.Load(le)
  46. if u == nil {
  47. return errors.New("User ", e, " not found.")
  48. }
  49. v.email.Delete(le)
  50. v.users.Delete(ProcessUUID(u.(*protocol.MemoryUser).Account.(*MemoryAccount).ID.UUID()))
  51. return nil
  52. }
  53. // Get a VLESS user with UUID, nil if user doesn't exist.
  54. func (v *MemoryValidator) Get(id uuid.UUID) *protocol.MemoryUser {
  55. u, _ := v.users.Load(ProcessUUID(id))
  56. if u != nil {
  57. return u.(*protocol.MemoryUser)
  58. }
  59. return nil
  60. }
  61. // Get a VLESS user with email, nil if user doesn't exist.
  62. func (v *MemoryValidator) GetByEmail(email string) *protocol.MemoryUser {
  63. email = strings.ToLower(email)
  64. u, _ := v.email.Load(email)
  65. if u != nil {
  66. return u.(*protocol.MemoryUser)
  67. }
  68. return nil
  69. }
  70. // Get all users
  71. func (v *MemoryValidator) GetAll() []*protocol.MemoryUser {
  72. var u = make([]*protocol.MemoryUser, 0, 100)
  73. v.email.Range(func(key, value interface{}) bool {
  74. u = append(u, value.(*protocol.MemoryUser))
  75. return true
  76. })
  77. return u
  78. }
  79. // Get users count
  80. func (v *MemoryValidator) GetCount() int64 {
  81. var c int64 = 0
  82. v.email.Range(func(key, value interface{}) bool {
  83. c++
  84. return true
  85. })
  86. return c
  87. }