user.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package ssmapi
  2. import (
  3. "sync"
  4. "github.com/sagernet/sing-box/adapter"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. )
  7. type UserManager struct {
  8. access sync.Mutex
  9. usersMap map[string]string
  10. server adapter.ManagedSSMServer
  11. trafficManager *TrafficManager
  12. }
  13. func NewUserManager(inbound adapter.ManagedSSMServer, trafficManager *TrafficManager) *UserManager {
  14. return &UserManager{
  15. usersMap: make(map[string]string),
  16. server: inbound,
  17. trafficManager: trafficManager,
  18. }
  19. }
  20. func (m *UserManager) postUpdate(updated bool) error {
  21. users := make([]string, 0, len(m.usersMap))
  22. uPSKs := make([]string, 0, len(m.usersMap))
  23. for username, password := range m.usersMap {
  24. users = append(users, username)
  25. uPSKs = append(uPSKs, password)
  26. }
  27. err := m.server.UpdateUsers(users, uPSKs)
  28. if err != nil {
  29. return err
  30. }
  31. if updated {
  32. m.trafficManager.UpdateUsers(users)
  33. }
  34. return nil
  35. }
  36. func (m *UserManager) List() []*UserObject {
  37. m.access.Lock()
  38. defer m.access.Unlock()
  39. users := make([]*UserObject, 0, len(m.usersMap))
  40. for username, password := range m.usersMap {
  41. users = append(users, &UserObject{
  42. UserName: username,
  43. Password: password,
  44. })
  45. }
  46. return users
  47. }
  48. func (m *UserManager) Add(username string, password string) error {
  49. m.access.Lock()
  50. defer m.access.Unlock()
  51. if _, found := m.usersMap[username]; found {
  52. return E.New("user ", username, " already exists")
  53. }
  54. m.usersMap[username] = password
  55. return m.postUpdate(true)
  56. }
  57. func (m *UserManager) Get(username string) (string, bool) {
  58. m.access.Lock()
  59. defer m.access.Unlock()
  60. if password, found := m.usersMap[username]; found {
  61. return password, true
  62. }
  63. return "", false
  64. }
  65. func (m *UserManager) Update(username string, password string) error {
  66. m.access.Lock()
  67. defer m.access.Unlock()
  68. m.usersMap[username] = password
  69. return m.postUpdate(true)
  70. }
  71. func (m *UserManager) Delete(username string) error {
  72. m.access.Lock()
  73. defer m.access.Unlock()
  74. delete(m.usersMap, username)
  75. return m.postUpdate(true)
  76. }