permission.go 7.7 KB

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