user.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package user
  2. import (
  3. "errors"
  4. "log"
  5. "net/http"
  6. "os"
  7. "golang.org/x/sync/syncmap"
  8. auth "imuslab.com/arozos/mod/auth"
  9. db "imuslab.com/arozos/mod/database"
  10. permission "imuslab.com/arozos/mod/permission"
  11. quota "imuslab.com/arozos/mod/quota"
  12. storage "imuslab.com/arozos/mod/storage"
  13. )
  14. var (
  15. //Create a buffer to put the pointers to created user quota managers, mapped by username
  16. //quotaManagerBuffer map[string]*quota.QuotaHandler = map[string]*quota.QuotaHandler{}
  17. quotaManagerBuffer = syncmap.Map{}
  18. )
  19. type User struct {
  20. Username string
  21. StorageQuota *quota.QuotaHandler
  22. PermissionGroup []*permission.PermissionGroup
  23. HomeDirectories *storage.StoragePool
  24. parent *UserHandler
  25. }
  26. type UserHandler struct {
  27. authAgent *auth.AuthAgent
  28. database *db.Database
  29. phandler *permission.PermissionHandler
  30. basePool *storage.StoragePool
  31. }
  32. //Initiate a new user handler
  33. func NewUserHandler(systemdb *db.Database, authAgent *auth.AuthAgent, permissionHandler *permission.PermissionHandler, baseStoragePool *storage.StoragePool) (*UserHandler, error) {
  34. return &UserHandler{
  35. authAgent: authAgent,
  36. database: systemdb,
  37. phandler: permissionHandler,
  38. basePool: baseStoragePool,
  39. }, nil
  40. }
  41. //Return the user handler's auth agent
  42. func (u *UserHandler) GetAuthAgent() *auth.AuthAgent {
  43. return u.authAgent
  44. }
  45. func (u *UserHandler) GetPermissionHandler() *permission.PermissionHandler {
  46. return u.phandler
  47. }
  48. func (u *UserHandler) GetStoragePool() *storage.StoragePool {
  49. return u.basePool
  50. }
  51. func (u *UserHandler) GetDatabase() *db.Database {
  52. return u.database
  53. }
  54. func (u *UserHandler) UpdateStoragePool(newpool *storage.StoragePool) {
  55. u.basePool = newpool
  56. }
  57. func (u *User) Parent() *UserHandler {
  58. return u.parent
  59. }
  60. //Get User object from username
  61. func (u *UserHandler) GetUserInfoFromUsername(username string) (*User, error) {
  62. //Check if user exists
  63. if !u.authAgent.UserExists(username) {
  64. return &User{}, errors.New("User not exists")
  65. }
  66. //Get the user's permission group
  67. permissionGroups, err := u.phandler.GetUsersPermissionGroup(username)
  68. if err != nil {
  69. return &User{}, err
  70. }
  71. //Create user directories in the Home Directories
  72. if u.basePool.Storages == nil {
  73. //This userhandler do not have a basepool?
  74. log.Println("USER HANDLER DO NOT HAVE BASEPOOL")
  75. } else {
  76. for _, store := range u.basePool.Storages {
  77. if store.Hierarchy == "user" {
  78. os.MkdirAll(store.Path+"/users/"+username, 0755)
  79. }
  80. }
  81. }
  82. thisUser := User{
  83. Username: username,
  84. PermissionGroup: permissionGroups,
  85. HomeDirectories: u.basePool,
  86. parent: u,
  87. }
  88. //Get the storage quota manager for thus user
  89. var thisUserQuotaManager *quota.QuotaHandler
  90. if val, ok := quotaManagerBuffer.Load(username); ok {
  91. //user quota manager exists
  92. thisUserQuotaManager = val.(*quota.QuotaHandler)
  93. } else {
  94. //Get the largest quota from the user's group
  95. maxQuota := int64(0)
  96. for _, group := range permissionGroups {
  97. if group.DefaultStorageQuota == -1 {
  98. //Admin
  99. maxQuota = -1
  100. break
  101. } else if group.DefaultStorageQuota > maxQuota {
  102. //Other groups. Get the largest one
  103. maxQuota = group.DefaultStorageQuota
  104. }
  105. }
  106. //Create a new manager for this user
  107. allFsHandlers := thisUser.GetAllFileSystemHandler()
  108. thisUserQuotaManager = quota.NewUserQuotaHandler(u.database, username, allFsHandlers, maxQuota)
  109. if !thisUserQuotaManager.IsQuotaInitialized() {
  110. //This user quota hasn't been initalized. Initalize it now to match its group
  111. userMaxDefaultStorageQuota := permission.GetLargestStorageQuotaFromGroups(permissionGroups)
  112. thisUserQuotaManager.SetUserStorageQuota(userMaxDefaultStorageQuota)
  113. }
  114. //Push the manger to buffer
  115. quotaManagerBuffer.Store(username, thisUserQuotaManager)
  116. }
  117. thisUser.StorageQuota = thisUserQuotaManager
  118. //Return the user object
  119. return &thisUser, nil
  120. }
  121. //Get user obejct from session
  122. func (u *UserHandler) GetUserInfoFromRequest(w http.ResponseWriter, r *http.Request) (*User, error) {
  123. username, err := u.authAgent.GetUserName(w, r)
  124. if err != nil {
  125. return &User{}, err
  126. }
  127. userObject, err := u.GetUserInfoFromUsername(username)
  128. if err != nil {
  129. return &User{}, err
  130. }
  131. return userObject, nil
  132. }
  133. //Remove the current user
  134. func (u *User) RemoveUser() {
  135. //Remove the user storage quota settings
  136. log.Println("Removing User Quota: ", u.Username)
  137. u.StorageQuota.RemoveUserQuota()
  138. //Remove the user authentication register
  139. u.parent.authAgent.UnregisterUser(u.Username)
  140. }
  141. //Get the current user icon
  142. func (u *User) GetUserIcon() string {
  143. var userIconpath []byte
  144. u.parent.database.Read("auth", "profilepic/"+u.Username, &userIconpath)
  145. return string(userIconpath)
  146. }
  147. //Set the current user icon
  148. func (u *User) SetUserIcon(base64data string) {
  149. u.parent.database.Write("auth", "profilepic/"+u.Username, []byte(base64data))
  150. return
  151. }