user.go 1.9 KB

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