user.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package vmess
  2. import (
  3. "math/rand"
  4. )
  5. type UserLevel byte
  6. const (
  7. UserLevelAdmin = UserLevel(255)
  8. UserLevelUntrusted = UserLevel(0)
  9. )
  10. type User struct {
  11. ID *ID
  12. AlterIDs []*ID
  13. Level UserLevel
  14. }
  15. func NewUser(id *ID, level UserLevel, alterIdCount uint16) *User {
  16. u := &User{
  17. ID: id,
  18. Level: level,
  19. }
  20. if alterIdCount > 0 {
  21. u.AlterIDs = make([]*ID, alterIdCount)
  22. prevId := id.UUID()
  23. for idx, _ := range u.AlterIDs {
  24. newid := prevId.Next()
  25. // TODO: check duplicate
  26. u.AlterIDs[idx] = NewID(newid)
  27. prevId = newid
  28. }
  29. }
  30. return u
  31. }
  32. func (this *User) AnyValidID() *ID {
  33. if len(this.AlterIDs) == 0 {
  34. return this.ID
  35. }
  36. if len(this.AlterIDs) == 1 {
  37. return this.AlterIDs[0]
  38. }
  39. idx := rand.Intn(len(this.AlterIDs))
  40. return this.AlterIDs[idx]
  41. }
  42. type UserSettings struct {
  43. PayloadReadTimeout int
  44. }
  45. func GetUserSettings(level UserLevel) UserSettings {
  46. settings := UserSettings{
  47. PayloadReadTimeout: 120,
  48. }
  49. if level > 0 {
  50. settings.PayloadReadTimeout = 0
  51. }
  52. return settings
  53. }