request.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package permission
  2. /*
  3. This is the handler to handle the permission request endpoints
  4. Group information are stored in database as follows
  5. group/{groupname} = module permissions
  6. isadmin/{groupname} = isAdmin
  7. quota/{groupname} = default quota in bytes
  8. */
  9. import (
  10. "encoding/json"
  11. "log"
  12. "net/http"
  13. "strconv"
  14. "imuslab.com/arozos/mod/utils"
  15. )
  16. //Handle group editing operations
  17. func (h *PermissionHandler) HandleListGroup(w http.ResponseWriter, r *http.Request) {
  18. listPermission, _ := utils.Mv(r, "showper", false)
  19. if listPermission == "" {
  20. //Only show the user group name
  21. results := []string{}
  22. for _, gp := range h.PermissionGroups {
  23. results = append(results, gp.Name)
  24. }
  25. jsonString, _ := json.Marshal(results)
  26. utils.SendJSONResponse(w, string(jsonString))
  27. } else {
  28. //Show user group and its module permissions
  29. results := make(map[string][]interface{})
  30. for _, gp := range h.PermissionGroups {
  31. var thisGroupInfo []interface{}
  32. thisGroupInfo = append(thisGroupInfo, gp.AccessibleModules)
  33. thisGroupInfo = append(thisGroupInfo, gp.IsAdmin)
  34. thisGroupInfo = append(thisGroupInfo, gp.DefaultStorageQuota)
  35. results[gp.Name] = thisGroupInfo
  36. }
  37. jsonString, _ := json.Marshal(results)
  38. utils.SendJSONResponse(w, string(jsonString))
  39. }
  40. }
  41. //Listing a group's detail for editing or updating the group content
  42. func (h *PermissionHandler) HandleGroupEdit(w http.ResponseWriter, r *http.Request) {
  43. groupname, err := utils.Mv(r, "groupname", true)
  44. if err != nil {
  45. utils.SendErrorResponse(w, "Group name not defined")
  46. return
  47. }
  48. listmode, _ := utils.Mv(r, "list", false)
  49. if listmode == "" {
  50. //Edit update mode
  51. permission, err := utils.Mv(r, "permission", true)
  52. if err != nil {
  53. utils.SendErrorResponse(w, "Group name not defined")
  54. return
  55. }
  56. permissionSlice := []string{}
  57. err = json.Unmarshal([]byte(permission), &permissionSlice)
  58. if err != nil {
  59. utils.SendErrorResponse(w, "Failed to parse module list")
  60. return
  61. }
  62. isAdmin, err := utils.Mv(r, "isAdmin", true)
  63. if err != nil {
  64. utils.SendErrorResponse(w, "Admin permission not defined")
  65. return
  66. }
  67. //Do not allow removal of admin permission from administrator group
  68. if isAdmin == "false" && groupname == "administrator" {
  69. utils.SendErrorResponse(w, "You cannot unset admin permission from administrator group")
  70. return
  71. }
  72. quota, err := utils.Mv(r, "defaultQuota", true)
  73. if err != nil {
  74. utils.SendErrorResponse(w, "Default Quota not defined")
  75. return
  76. }
  77. interfaceModule, err := utils.Mv(r, "interfaceModule", true)
  78. if err != nil {
  79. utils.SendErrorResponse(w, "Default Interface Module not defined")
  80. return
  81. }
  82. //Check if the group name already exists
  83. if !h.GroupExists(groupname) {
  84. utils.SendErrorResponse(w, "Group not exists")
  85. return
  86. }
  87. quotaInt, err := strconv.Atoi(quota)
  88. if err != nil {
  89. utils.SendErrorResponse(w, "Invalid Quota.")
  90. return
  91. }
  92. h.UpdatePermissionGroup(groupname, isAdmin == "true", int64(quotaInt), permissionSlice, interfaceModule)
  93. utils.SendOK(w)
  94. } else {
  95. //Listing mode
  96. //Check if the group exists
  97. if !h.GroupExists(groupname) {
  98. utils.SendErrorResponse(w, "Group not exists")
  99. return
  100. }
  101. //OK. Get the group information
  102. pg := h.GetPermissionGroupByName(groupname)
  103. //pg will not be nil because group exists has checked it availbilty
  104. jsonString, _ := json.Marshal(pg)
  105. utils.SendJSONResponse(w, string(jsonString))
  106. }
  107. }
  108. func (h *PermissionHandler) HandleGroupCreate(w http.ResponseWriter, r *http.Request) {
  109. groupname, err := utils.Mv(r, "groupname", true)
  110. if err != nil {
  111. utils.SendErrorResponse(w, "Group name not defined")
  112. return
  113. }
  114. permission, err := utils.Mv(r, "permission", true)
  115. if err != nil {
  116. utils.SendErrorResponse(w, "Group name not defined")
  117. return
  118. }
  119. permissionSlice := []string{}
  120. err = json.Unmarshal([]byte(permission), &permissionSlice)
  121. if err != nil {
  122. utils.SendErrorResponse(w, "Failed to parse module list")
  123. return
  124. }
  125. isAdmin, err := utils.Mv(r, "isAdmin", true)
  126. if err != nil {
  127. utils.SendErrorResponse(w, "Admin permission not defined")
  128. return
  129. }
  130. quota, err := utils.Mv(r, "defaultQuota", true)
  131. if err != nil {
  132. utils.SendErrorResponse(w, "Default Quota not defined")
  133. return
  134. }
  135. interfaceModule, err := utils.Mv(r, "interfaceModule", true)
  136. if err != nil {
  137. utils.SendErrorResponse(w, "Default Interface Module not defined")
  138. return
  139. }
  140. //Check if the group name already exists
  141. if h.GroupExists(groupname) {
  142. utils.SendErrorResponse(w, "Group already exists")
  143. return
  144. }
  145. quotaInt, err := strconv.Atoi(quota)
  146. if err != nil {
  147. utils.SendErrorResponse(w, "Invalid Quota.")
  148. return
  149. }
  150. if quotaInt < -1 {
  151. utils.SendErrorResponse(w, "Quota cannot be smaller than -1. (Set to -1 for unlimited quota)")
  152. return
  153. }
  154. //Migrated the creation process to a seperated function
  155. h.NewPermissionGroup(groupname, isAdmin == "true", int64(quotaInt), permissionSlice, interfaceModule)
  156. /*
  157. //OK. Write the results into database
  158. h.database.Write("permission", "group/" + groupname, permission)
  159. h.database.Write("permission", "isadmin/" + groupname, isAdmin)
  160. h.database.Write("permission", "quota/" + groupname, int64(quotaInt))
  161. h.database.Write("permission", "interfaceModule/" + groupname, interfaceModule)
  162. //Update the current cached permission group table
  163. h.LoadPermissionGroupsFromDatabase()
  164. */
  165. utils.SendOK(w)
  166. log.Println("Creating New Permission Group:", groupname, permission, isAdmin, quota)
  167. }
  168. func (h *PermissionHandler) HandleGroupRemove(w http.ResponseWriter, r *http.Request) {
  169. groupname, err := utils.Mv(r, "groupname", true)
  170. if err != nil {
  171. utils.SendErrorResponse(w, "Group name not defined")
  172. return
  173. }
  174. //Check if the group name exists
  175. if !h.GroupExists(groupname) {
  176. utils.SendErrorResponse(w, "Group not exists")
  177. return
  178. }
  179. //Check if this is administrator group
  180. if groupname == "administrator" {
  181. utils.SendErrorResponse(w, "You cannot remove Administrator group.")
  182. return
  183. }
  184. //Get the group by its name
  185. group := h.GetPermissionGroupByName(groupname)
  186. //Remove the group
  187. group.Remove()
  188. //Update the current cached permission group table
  189. newGroupList := []*PermissionGroup{}
  190. for _, pg := range h.PermissionGroups {
  191. if pg.Name != groupname {
  192. newGroupList = append(newGroupList, pg)
  193. }
  194. }
  195. h.PermissionGroups = newGroupList
  196. //Update 27-12-2020: Replaced database reload with new group list creation
  197. //h.LoadPermissionGroupsFromDatabase()
  198. utils.SendOK(w)
  199. }