| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | 
							- package trojan
 
- import (
 
- 	"strings"
 
- 	"sync"
 
- 	"github.com/xtls/xray-core/common/protocol"
 
- )
 
- // Validator stores valid trojan users.
 
- type Validator struct {
 
- 	// Considering email's usage here, map + sync.Mutex/RWMutex may have better performance.
 
- 	email sync.Map
 
- 	users sync.Map
 
- }
 
- // Add a trojan user, Email must be empty or unique.
 
- func (v *Validator) Add(u *protocol.MemoryUser) error {
 
- 	if u.Email != "" {
 
- 		_, loaded := v.email.LoadOrStore(strings.ToLower(u.Email), u)
 
- 		if loaded {
 
- 			return newError("User ", u.Email, " already exists.")
 
- 		}
 
- 	}
 
- 	v.users.Store(hexString(u.Account.(*MemoryAccount).Key), u)
 
- 	return nil
 
- }
 
- // Del a trojan user with a non-empty Email.
 
- func (v *Validator) Del(e string) error {
 
- 	if e == "" {
 
- 		return newError("Email must not be empty.")
 
- 	}
 
- 	le := strings.ToLower(e)
 
- 	u, _ := v.email.Load(le)
 
- 	if u == nil {
 
- 		return newError("User ", e, " not found.")
 
- 	}
 
- 	v.email.Delete(le)
 
- 	v.users.Delete(hexString(u.(*protocol.MemoryUser).Account.(*MemoryAccount).Key))
 
- 	return nil
 
- }
 
- // Get a trojan user with hashed key, nil if user doesn't exist.
 
- func (v *Validator) Get(hash string) *protocol.MemoryUser {
 
- 	u, _ := v.users.Load(hash)
 
- 	if u != nil {
 
- 		return u.(*protocol.MemoryUser)
 
- 	}
 
- 	return nil
 
- }
 
 
  |