permission.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. permission "imuslab.com/arozos/mod/permission"
  6. prout "imuslab.com/arozos/mod/prouter"
  7. "imuslab.com/arozos/mod/utils"
  8. )
  9. // handleGroupDeleteWithUserHandling handles group deletion with user migration options.
  10. // POST params:
  11. // - groupname: name of the group to delete
  12. // - action: one of "reassign" | "removeonly" | "deleteusers"
  13. // - targetgroup: (required when action=="reassign") the group users are moved to
  14. func handleGroupDeleteWithUserHandling(w http.ResponseWriter, r *http.Request) {
  15. groupname, err := utils.PostPara(r, "groupname")
  16. if err != nil {
  17. utils.SendErrorResponse(w, "groupname not defined")
  18. return
  19. }
  20. if !permissionHandler.GroupExists(groupname) {
  21. utils.SendErrorResponse(w, "Group not exists")
  22. return
  23. }
  24. if groupname == "administrator" {
  25. utils.SendErrorResponse(w, "You cannot remove the Administrator group")
  26. return
  27. }
  28. action, err := utils.PostPara(r, "action")
  29. if err != nil {
  30. utils.SendErrorResponse(w, "action not defined")
  31. return
  32. }
  33. allUsernames := authAgent.ListUsers()
  34. switch action {
  35. case "reassign":
  36. targetgroup, err := utils.PostPara(r, "targetgroup")
  37. if err != nil || targetgroup == "" {
  38. utils.SendErrorResponse(w, "targetgroup not defined")
  39. return
  40. }
  41. if !permissionHandler.GroupExists(targetgroup) {
  42. utils.SendErrorResponse(w, "Target group not exists: "+targetgroup)
  43. return
  44. }
  45. for _, username := range allUsernames {
  46. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  47. if err != nil {
  48. continue
  49. }
  50. if !userinfo.UserIsInOneOfTheGroupOf([]string{groupname}) {
  51. continue
  52. }
  53. currentGroups := userinfo.GetUserPermissionGroupNames()
  54. newGroups := []string{}
  55. alreadyHasTarget := false
  56. for _, g := range currentGroups {
  57. if g == targetgroup {
  58. alreadyHasTarget = true
  59. }
  60. if g == groupname {
  61. // Will be replaced below
  62. continue
  63. }
  64. newGroups = append(newGroups, g)
  65. }
  66. if !alreadyHasTarget {
  67. newGroups = append(newGroups, targetgroup)
  68. }
  69. if len(newGroups) == 0 {
  70. newGroups = []string{targetgroup}
  71. }
  72. newPermGroups := permissionHandler.GetPermissionGroupByNameList(newGroups)
  73. userinfo.SetUserPermissionGroup(newPermGroups)
  74. }
  75. case "removeonly":
  76. for _, username := range allUsernames {
  77. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  78. if err != nil {
  79. continue
  80. }
  81. if !userinfo.UserIsInOneOfTheGroupOf([]string{groupname}) {
  82. continue
  83. }
  84. currentGroups := userinfo.GetUserPermissionGroupNames()
  85. newGroups := []string{}
  86. for _, g := range currentGroups {
  87. if g != groupname {
  88. newGroups = append(newGroups, g)
  89. }
  90. }
  91. // Allow empty group list (user will see "Invalid interface module" warning on login)
  92. newPermGroups := permissionHandler.GetPermissionGroupByNameList(newGroups)
  93. userinfo.SetUserPermissionGroup(newPermGroups)
  94. }
  95. case "deleteusers":
  96. // Identify the caller so we never delete the account making this request.
  97. // If the admin is in the target group, we remove the group from their account
  98. // instead of deleting it — preventing an immediate session/system crash.
  99. callerUsername, _ := authAgent.GetUserName(w, r)
  100. for _, username := range allUsernames {
  101. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  102. if err != nil {
  103. continue
  104. }
  105. if !userinfo.UserIsInOneOfTheGroupOf([]string{groupname}) {
  106. continue
  107. }
  108. if username == callerUsername {
  109. // Safety: only remove the group from the caller's own account.
  110. currentGroups := userinfo.GetUserPermissionGroupNames()
  111. newGroups := []string{}
  112. for _, g := range currentGroups {
  113. if g != groupname {
  114. newGroups = append(newGroups, g)
  115. }
  116. }
  117. newPermGroups := permissionHandler.GetPermissionGroupByNameList(newGroups)
  118. userinfo.SetUserPermissionGroup(newPermGroups)
  119. continue
  120. }
  121. userinfo.RemoveUser()
  122. }
  123. default:
  124. utils.SendErrorResponse(w, "Invalid action: "+action)
  125. return
  126. }
  127. // Remove the permission group itself
  128. group := permissionHandler.GetPermissionGroupByName(groupname)
  129. if group != nil {
  130. group.Remove()
  131. }
  132. newGroupList := []*permission.PermissionGroup{}
  133. for _, pg := range permissionHandler.PermissionGroups {
  134. if pg.Name != groupname {
  135. newGroupList = append(newGroupList, pg)
  136. }
  137. }
  138. permissionHandler.PermissionGroups = newGroupList
  139. utils.SendOK(w)
  140. }
  141. // handleGroupListUsers returns a JSON list of users in a group and whether each user
  142. // has more than one group (used for warning in the delete UI).
  143. // GET params:
  144. // - groupname: name of the group to inspect
  145. type groupUserPreview struct {
  146. Username string `json:"username"`
  147. GroupCount int `json:"groupCount"`
  148. }
  149. func handleGroupListUsers(w http.ResponseWriter, r *http.Request) {
  150. groupname, err := utils.GetPara(r, "groupname")
  151. if err != nil {
  152. utils.SendErrorResponse(w, "groupname not defined")
  153. return
  154. }
  155. if !permissionHandler.GroupExists(groupname) {
  156. utils.SendErrorResponse(w, "Group not exists")
  157. return
  158. }
  159. allUsernames := authAgent.ListUsers()
  160. results := []groupUserPreview{}
  161. for _, username := range allUsernames {
  162. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  163. if err != nil {
  164. continue
  165. }
  166. if userinfo.UserIsInOneOfTheGroupOf([]string{groupname}) {
  167. results = append(results, groupUserPreview{
  168. Username: username,
  169. GroupCount: len(userinfo.GetUserPermissionGroupNames()),
  170. })
  171. }
  172. }
  173. jsonString, _ := json.Marshal(results)
  174. utils.SendJSONResponse(w, string(jsonString))
  175. }
  176. func permissionNewHandler() {
  177. ph, err := permission.NewPermissionHandler(sysdb)
  178. if err != nil {
  179. systemWideLogger.PrintAndLog("Permission", "Permission Handler creation failed.", err)
  180. panic(err)
  181. }
  182. permissionHandler = ph
  183. permissionHandler.LoadPermissionGroupsFromDatabase()
  184. }
  185. func permissionInit() {
  186. //Register the permission handler, require authentication except listgroup
  187. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  188. ModuleName: "System Setting",
  189. AdminOnly: true,
  190. UserHandler: userHandler,
  191. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  192. utils.SendErrorResponse(w, "Permission Denied")
  193. },
  194. })
  195. //Must be handled by default router
  196. http.HandleFunc("/system/permission/listgroup", func(w http.ResponseWriter, r *http.Request) {
  197. if authAgent.GetUserCounts() == 0 {
  198. //There is no user within the system. Only allow register of admin account
  199. js, _ := json.Marshal([]string{"administrator"})
  200. utils.SendJSONResponse(w, string(js))
  201. //permissionHandler.HandleListGroup(w, r)
  202. } else {
  203. //There are already users in the system. Only allow authorized users
  204. if authAgent.CheckAuth(r) {
  205. requestingUser, _ := userHandler.GetUserInfoFromRequest(w, r)
  206. if requestingUser != nil && requestingUser.IsAdmin() {
  207. permissionHandler.HandleListGroup(w, r)
  208. } else {
  209. errorHandlePermissionDenied(w, r)
  210. }
  211. } else {
  212. errorHandlePermissionDenied(w, r)
  213. return
  214. }
  215. }
  216. })
  217. adminRouter.HandleFunc("/system/permission/newgroup", permissionHandler.HandleGroupCreate)
  218. adminRouter.HandleFunc("/system/permission/editgroup", permissionHandler.HandleGroupEdit)
  219. adminRouter.HandleFunc("/system/permission/delgroup", permissionHandler.HandleGroupRemove)
  220. adminRouter.HandleFunc("/system/permission/delgroupwithhandling", handleGroupDeleteWithUserHandling)
  221. adminRouter.HandleFunc("/system/permission/listgroupusers", handleGroupListUsers)
  222. registerSetting(settingModule{
  223. Name: "Permission Groups",
  224. Desc: "Handle the permission of access in groups",
  225. IconPath: "SystemAO/users/img/small_icon.png",
  226. Group: "Users",
  227. StartDir: "SystemAO/users/group.html",
  228. RequireAdmin: true,
  229. })
  230. }