permission.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package permission
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "log"
  6. "strings"
  7. db "imuslab.com/arozos/mod/database"
  8. fs "imuslab.com/arozos/mod/filesystem"
  9. storage "imuslab.com/arozos/mod/storage"
  10. "imuslab.com/arozos/mod/utils"
  11. )
  12. type PermissionGroup struct {
  13. Name string
  14. IsAdmin bool
  15. DefaultInterfaceModule string
  16. DefaultStorageQuota int64
  17. AccessibleModules []string
  18. StoragePool *storage.StoragePool
  19. parent *PermissionHandler
  20. }
  21. type PermissionHandler struct {
  22. database *db.Database
  23. PermissionGroups []*PermissionGroup
  24. }
  25. func NewPermissionHandler(database *db.Database) (*PermissionHandler, error) {
  26. //Create the permission table if it is not exists
  27. err := database.NewTable("permission")
  28. if err != nil {
  29. return &PermissionHandler{}, err
  30. }
  31. //Check if administrator permission group exists. If not, create one
  32. if !database.KeyExists("permission", "group/administrator") {
  33. database.Write("permission", "group/administrator", "[\"*\"]")
  34. database.Write("permission", "isadmin/administrator", "true")
  35. database.Write("permission", "quota/administrator", int64(-1))
  36. }
  37. return &PermissionHandler{
  38. database: database,
  39. PermissionGroups: []*PermissionGroup{},
  40. }, nil
  41. }
  42. func (h *PermissionHandler) GroupExists(groupName string) bool {
  43. exists := false
  44. for _, gp := range h.PermissionGroups {
  45. if strings.ToLower(groupName) == strings.ToLower(gp.Name) {
  46. exists = true
  47. }
  48. }
  49. return exists
  50. }
  51. func (h *PermissionHandler) LoadPermissionGroupsFromDatabase() error {
  52. entries, err := h.database.ListTable("permission")
  53. if err != nil {
  54. return err
  55. }
  56. results := []*PermissionGroup{}
  57. for _, keypairs := range entries {
  58. if strings.Contains(string(keypairs[0]), "group/") {
  59. groupname := strings.Split(string(keypairs[0]), "/")[1]
  60. groupPermission := []string{}
  61. originalJSONString := ""
  62. json.Unmarshal(keypairs[1], &originalJSONString)
  63. err := json.Unmarshal([]byte(originalJSONString), &groupPermission)
  64. if err != nil {
  65. log.Println(err)
  66. }
  67. //IsAdmin
  68. isAdmin := "false"
  69. h.database.Read("permission", "isadmin/"+groupname, &isAdmin)
  70. //DefaultStorageQuota
  71. defaultStorageQuota := int64(0)
  72. h.database.Read("permission", "quota/"+groupname, &defaultStorageQuota)
  73. //Get the default interface module
  74. interfaceModule := "Desktop"
  75. h.database.Read("permission", "interfaceModule/"+groupname, &interfaceModule)
  76. results = append(results, &PermissionGroup{
  77. Name: groupname,
  78. IsAdmin: (isAdmin == "true"),
  79. DefaultInterfaceModule: interfaceModule,
  80. AccessibleModules: groupPermission,
  81. DefaultStorageQuota: defaultStorageQuota,
  82. StoragePool: &storage.StoragePool{},
  83. parent: h,
  84. })
  85. }
  86. }
  87. h.PermissionGroups = results
  88. return nil
  89. }
  90. //Get the user permission groups
  91. func (h *PermissionHandler) GetUsersPermissionGroup(username string) ([]*PermissionGroup, error) {
  92. //Get user permission group name from database
  93. targetUserGroup := []string{}
  94. err := h.database.Read("auth", "group/"+username, &targetUserGroup)
  95. if err != nil {
  96. return []*PermissionGroup{}, err
  97. }
  98. //Parse the results
  99. permissionGroupNames := targetUserGroup
  100. //Look for all the avaible permission groups
  101. results := []*PermissionGroup{}
  102. for _, gp := range h.PermissionGroups {
  103. if utils.StringInArray(permissionGroupNames, gp.Name) {
  104. //Change the pointer to a new varable to it won't get overwritten by the range function
  105. newPointer := gp
  106. results = append(results, newPointer)
  107. }
  108. }
  109. return results, nil
  110. }
  111. func (h *PermissionHandler) UpdatePermissionGroup(name string, isadmin bool, storageQuota int64, moduleNames []string, interfaceModule string) error {
  112. if !h.GroupExists(name) {
  113. return errors.New("Permission group not exists or not loaded")
  114. }
  115. //Group exists. Update the values
  116. for _, thisPG := range h.PermissionGroups {
  117. if thisPG.Name == name {
  118. //Update the permission group values in memeory
  119. thisPG.IsAdmin = isadmin
  120. thisPG.DefaultStorageQuota = storageQuota
  121. thisPG.AccessibleModules = moduleNames
  122. thisPG.DefaultInterfaceModule = interfaceModule
  123. break
  124. }
  125. }
  126. //Write it to database
  127. isAdminString := "false"
  128. if isadmin {
  129. isAdminString = "true"
  130. }
  131. moduleJson, _ := json.Marshal(moduleNames)
  132. //Update the database values
  133. h.database.Write("permission", "group/"+name, string(moduleJson))
  134. h.database.Write("permission", "isadmin/"+name, isAdminString)
  135. h.database.Write("permission", "quota/"+name, storageQuota)
  136. h.database.Write("permission", "interfaceModule/"+name, interfaceModule)
  137. return nil
  138. }
  139. func (h *PermissionHandler) NewPermissionGroup(name string, isadmin bool, storageQuota int64, moduleNames []string, interfaceModule string) *PermissionGroup {
  140. //Create a new storage pool for this permission group
  141. newPool, err := storage.NewStoragePool([]*fs.FileSystemHandler{}, name)
  142. if err != nil {
  143. newPool = &storage.StoragePool{}
  144. }
  145. //Create a new permission group
  146. newGroup := PermissionGroup{
  147. Name: name,
  148. IsAdmin: isadmin,
  149. AccessibleModules: moduleNames,
  150. DefaultInterfaceModule: interfaceModule,
  151. DefaultStorageQuota: storageQuota,
  152. StoragePool: newPool,
  153. parent: h,
  154. }
  155. //Write it to database
  156. isAdminString := "false"
  157. if isadmin {
  158. isAdminString = "true"
  159. }
  160. moduleJson, _ := json.Marshal(moduleNames)
  161. h.database.Write("permission", "group/"+name, string(moduleJson))
  162. h.database.Write("permission", "isadmin/"+name, isAdminString)
  163. h.database.Write("permission", "quota/"+name, storageQuota)
  164. h.database.Write("permission", "interfaceModule/"+name, interfaceModule)
  165. h.PermissionGroups = append(h.PermissionGroups, &newGroup)
  166. //Return the newly created group
  167. return &newGroup
  168. }
  169. func (h *PermissionHandler) GetPermissionGroupByNameList(namelist []string) []*PermissionGroup {
  170. results := []*PermissionGroup{}
  171. for _, gp := range h.PermissionGroups {
  172. if utils.StringInArray(namelist, gp.Name) {
  173. thisPointer := gp
  174. results = append(results, thisPointer)
  175. }
  176. }
  177. return results
  178. }
  179. func (h *PermissionHandler) GetPermissionGroupByName(name string) *PermissionGroup {
  180. for _, gp := range h.PermissionGroups {
  181. if name == gp.Name {
  182. return gp
  183. }
  184. }
  185. return nil
  186. }