user.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. "imuslab.com/arozos/mod/share/shareEntry"
  13. storage "imuslab.com/arozos/mod/storage"
  14. )
  15. var (
  16. //Create a buffer to put the pointers to created user quota managers, mapped by username
  17. //quotaManagerBuffer map[string]*quota.QuotaHandler = map[string]*quota.QuotaHandler{}
  18. quotaManagerBuffer = syncmap.Map{}
  19. )
  20. type User struct {
  21. Username string
  22. StorageQuota *quota.QuotaHandler
  23. PermissionGroup []*permission.PermissionGroup
  24. HomeDirectories *storage.StoragePool
  25. parent *UserHandler
  26. }
  27. type UserHandler struct {
  28. UniversalModules []string //Modules where all user can access
  29. authAgent *auth.AuthAgent
  30. database *db.Database
  31. phandler *permission.PermissionHandler
  32. basePool *storage.StoragePool
  33. shareEntryTable **shareEntry.ShareEntryTable
  34. }
  35. //Initiate a new user handler
  36. func NewUserHandler(systemdb *db.Database, authAgent *auth.AuthAgent, permissionHandler *permission.PermissionHandler, baseStoragePool *storage.StoragePool, shareEntryTable **shareEntry.ShareEntryTable) (*UserHandler, error) {
  37. return &UserHandler{
  38. authAgent: authAgent,
  39. database: systemdb,
  40. phandler: permissionHandler,
  41. basePool: baseStoragePool,
  42. shareEntryTable: shareEntryTable,
  43. }, nil
  44. }
  45. //Return the user handler's auth agent
  46. func (u *UserHandler) GetAuthAgent() *auth.AuthAgent {
  47. return u.authAgent
  48. }
  49. func (u *UserHandler) GetPermissionHandler() *permission.PermissionHandler {
  50. return u.phandler
  51. }
  52. //Get the user's base storage pool, in most case it is the system pool
  53. func (u *UserHandler) GetStoragePool() *storage.StoragePool {
  54. return u.basePool
  55. }
  56. func (u *UserHandler) GetDatabase() *db.Database {
  57. return u.database
  58. }
  59. func (u *UserHandler) UpdateStoragePool(newpool *storage.StoragePool) {
  60. u.basePool = newpool
  61. }
  62. //Get User object from username
  63. func (u *UserHandler) GetUserInfoFromUsername(username string) (*User, error) {
  64. //Check if user exists
  65. if !u.authAgent.UserExists(username) {
  66. return &User{}, errors.New("User not exists")
  67. }
  68. //Get the user's permission group
  69. permissionGroups, err := u.phandler.GetUsersPermissionGroup(username)
  70. if err != nil {
  71. return &User{}, err
  72. }
  73. //Create user directories in the Home Directories
  74. if u.basePool.Storages == nil {
  75. //This userhandler do not have a basepool?
  76. log.Println("USER HANDLER DO NOT HAVE BASEPOOL")
  77. } else {
  78. for _, store := range u.basePool.Storages {
  79. if store.Hierarchy == "user" {
  80. os.MkdirAll(store.Path+"/users/"+username, 0755)
  81. }
  82. }
  83. }
  84. thisUser := User{
  85. Username: username,
  86. PermissionGroup: permissionGroups,
  87. HomeDirectories: u.basePool,
  88. parent: u,
  89. }
  90. //Get the storage quota manager for thus user
  91. var thisUserQuotaManager *quota.QuotaHandler
  92. if val, ok := quotaManagerBuffer.Load(username); ok {
  93. //user quota manager exists
  94. thisUserQuotaManager = val.(*quota.QuotaHandler)
  95. } else {
  96. //Get the largest quota from the user's group
  97. maxQuota := int64(0)
  98. for _, group := range permissionGroups {
  99. if group.DefaultStorageQuota == -1 {
  100. //Admin
  101. maxQuota = -1
  102. break
  103. } else if group.DefaultStorageQuota > maxQuota {
  104. //Other groups. Get the largest one
  105. maxQuota = group.DefaultStorageQuota
  106. }
  107. }
  108. //Create a new manager for this user
  109. allFsHandlers := thisUser.GetAllFileSystemHandler()
  110. thisUserQuotaManager = quota.NewUserQuotaHandler(u.database, username, allFsHandlers, maxQuota)
  111. if !thisUserQuotaManager.IsQuotaInitialized() {
  112. //This user quota hasn't been initalized. Initalize it now to match its group
  113. userMaxDefaultStorageQuota := permission.GetLargestStorageQuotaFromGroups(permissionGroups)
  114. thisUserQuotaManager.SetUserStorageQuota(userMaxDefaultStorageQuota)
  115. }
  116. //Push the manger to buffer
  117. quotaManagerBuffer.Store(username, thisUserQuotaManager)
  118. }
  119. thisUser.StorageQuota = thisUserQuotaManager
  120. //Return the user object
  121. return &thisUser, nil
  122. }
  123. //Get user obejct from session
  124. func (u *UserHandler) GetUserInfoFromRequest(w http.ResponseWriter, r *http.Request) (*User, error) {
  125. username, err := u.authAgent.GetUserName(w, r)
  126. if err != nil {
  127. return &User{}, err
  128. }
  129. userObject, err := u.GetUserInfoFromUsername(username)
  130. if err != nil {
  131. return &User{}, err
  132. }
  133. return userObject, nil
  134. }
  135. //Get all the users given the permission group name, super IO heavy operation
  136. func (u *UserHandler) GetUsersInPermissionGroup(permissionGroupName string) ([]*User, error) {
  137. results := []*User{}
  138. //Check if the given group exists
  139. if u.phandler.GetPermissionGroupByName(permissionGroupName) == nil {
  140. //Permission group with given name not exists
  141. return results, errors.New("Permission group not exists")
  142. }
  143. AllRegisteredUsers := u.authAgent.ListUsers()
  144. for _, thisUser := range AllRegisteredUsers {
  145. thisUserInfo, err := u.GetUserInfoFromUsername(thisUser)
  146. if err != nil {
  147. continue
  148. }
  149. //Check if the user is in the given permission group
  150. if thisUserInfo.UserIsInOneOfTheGroupOf([]string{permissionGroupName}) {
  151. results = append(results, thisUserInfo)
  152. }
  153. }
  154. return results, nil
  155. }