Files

93 lines
2.2 KiB
Go
Raw Permalink Normal View History

2020-11-25 19:01:53 +08:00
package vless
import (
"strings"
2024-06-29 14:32:57 -04:00
"github.com/xtls/xray-core/common/errors"
2020-12-04 09:36:16 +08:00
"github.com/xtls/xray-core/common/protocol"
2025-07-26 12:05:21 +00:00
"github.com/xtls/xray-core/common/utils"
2020-12-04 09:36:16 +08:00
"github.com/xtls/xray-core/common/uuid"
2020-11-25 19:01:53 +08:00
)
type Validator interface {
Get(id uuid.UUID) *protocol.MemoryUser
Add(u *protocol.MemoryUser) error
Del(email string) error
2024-11-03 00:25:23 -04:00
GetByEmail(email string) *protocol.MemoryUser
GetAll() []*protocol.MemoryUser
GetCount() int64
}
// MemoryValidator stores valid VLESS users.
type MemoryValidator struct {
2020-11-25 19:01:53 +08:00
// Considering email's usage here, map + sync.Mutex/RWMutex may have better performance.
2025-07-26 12:05:21 +00:00
email utils.TypedSyncMap[string, *protocol.MemoryUser]
users utils.TypedSyncMap[uuid.UUID, *protocol.MemoryUser]
2020-11-25 19:01:53 +08:00
}
// Add a VLESS user, Email must be empty or unique.
func (v *MemoryValidator) Add(u *protocol.MemoryUser) error {
2020-11-25 19:01:53 +08:00
if u.Email != "" {
_, loaded := v.email.LoadOrStore(strings.ToLower(u.Email), u)
if loaded {
2024-06-29 14:32:57 -04:00
return errors.New("User ", u.Email, " already exists.")
2020-11-25 19:01:53 +08:00
}
}
v.users.Store(u.Account.(*MemoryAccount).ID.UUID(), u)
return nil
}
// Del a VLESS user with a non-empty Email.
func (v *MemoryValidator) Del(e string) error {
2020-11-25 19:01:53 +08:00
if e == "" {
2024-06-29 14:32:57 -04:00
return errors.New("Email must not be empty.")
2020-11-25 19:01:53 +08:00
}
le := strings.ToLower(e)
u, _ := v.email.Load(le)
if u == nil {
2024-06-29 14:32:57 -04:00
return errors.New("User ", e, " not found.")
2020-11-25 19:01:53 +08:00
}
v.email.Delete(le)
2025-07-26 12:05:21 +00:00
v.users.Delete(u.Account.(*MemoryAccount).ID.UUID())
2020-11-25 19:01:53 +08:00
return nil
}
// Get a VLESS user with UUID, nil if user doesn't exist.
func (v *MemoryValidator) Get(id uuid.UUID) *protocol.MemoryUser {
2020-11-25 19:01:53 +08:00
u, _ := v.users.Load(id)
if u != nil {
2025-07-26 12:05:21 +00:00
return u
2020-11-25 19:01:53 +08:00
}
return nil
}
2024-11-03 00:25:23 -04:00
// Get a VLESS user with email, nil if user doesn't exist.
func (v *MemoryValidator) GetByEmail(email string) *protocol.MemoryUser {
email = strings.ToLower(email)
2024-11-03 00:25:23 -04:00
u, _ := v.email.Load(email)
if u != nil {
2025-07-26 12:05:21 +00:00
return u
2024-11-03 00:25:23 -04:00
}
return nil
}
// Get all users
func (v *MemoryValidator) GetAll() []*protocol.MemoryUser {
var u = make([]*protocol.MemoryUser, 0, 100)
2025-07-26 12:05:21 +00:00
v.email.Range(func(key string, value *protocol.MemoryUser) bool {
u = append(u, value)
2024-11-03 00:25:23 -04:00
return true
})
return u
}
// Get users count
func (v *MemoryValidator) GetCount() int64 {
var c int64 = 0
2025-07-26 12:05:21 +00:00
v.email.Range(func(key string, value *protocol.MemoryUser) bool {
2024-11-03 00:25:23 -04:00
c++
return true
})
return c
}