user.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. package main
  2. /*
  3. User Management System
  4. Entry points for handler user functions
  5. */
  6. import (
  7. "encoding/json"
  8. "log"
  9. "net/http"
  10. "strconv"
  11. "strings"
  12. uuid "github.com/satori/go.uuid"
  13. auth "imuslab.com/arozos/mod/auth"
  14. module "imuslab.com/arozos/mod/modules"
  15. prout "imuslab.com/arozos/mod/prouter"
  16. user "imuslab.com/arozos/mod/user"
  17. )
  18. func UserSystemInit() {
  19. //Create a new User Handler
  20. uh, err := user.NewUserHandler(sysdb, authAgent, permissionHandler, baseStoragePool)
  21. if err != nil {
  22. panic(err)
  23. }
  24. userHandler = uh
  25. router := prout.NewModuleRouter(prout.RouterOption{
  26. ModuleName: "System Settings",
  27. AdminOnly: false,
  28. UserHandler: userHandler,
  29. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  30. sendErrorResponse(w, "Permission Denied")
  31. },
  32. })
  33. //Create Endpoint Listeners
  34. router.HandleFunc("/system/users/list", user_handleList)
  35. //Everyone logged in should have permission to view their profile and change their password
  36. http.HandleFunc("/system/users/userinfo", func(w http.ResponseWriter, r *http.Request) {
  37. authAgent.HandleCheckAuth(w, r, user_handleUserInfo)
  38. })
  39. //Interface info should be able to view by everyone logged in
  40. http.HandleFunc("/system/users/interfaceinfo", func(w http.ResponseWriter, r *http.Request) {
  41. authAgent.HandleCheckAuth(w, r, user_getInterfaceInfo)
  42. })
  43. //Register setting interface for module configuration
  44. registerSetting(settingModule{
  45. Name: "My Account",
  46. Desc: "Manage your account and password",
  47. IconPath: "SystemAO/users/img/small_icon.png",
  48. Group: "Users",
  49. StartDir: "SystemAO/users/account.html",
  50. RequireAdmin: false,
  51. })
  52. registerSetting(settingModule{
  53. Name: "User List",
  54. Desc: "A list of users registered on this system",
  55. IconPath: "SystemAO/users/img/small_icon.png",
  56. Group: "Users",
  57. StartDir: "SystemAO/users/userList.html",
  58. RequireAdmin: true,
  59. })
  60. //Handle db / auth / permissions related functions that requires user permission systems. See user.go
  61. user_createPostUserHandlers()
  62. }
  63. func user_createPostUserHandlers() {
  64. //Register auth management events that requires user handler
  65. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  66. ModuleName: "System Settings",
  67. AdminOnly: true,
  68. UserHandler: userHandler,
  69. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  70. sendErrorResponse(w, "Permission Denied")
  71. },
  72. })
  73. //Handle Authentication Unregister Handler
  74. adminRouter.HandleFunc("/system/auth/unregister", authAgent.HandleUnregister)
  75. adminRouter.HandleFunc("/system/users/editUser", user_handleUserEdit)
  76. adminRouter.HandleFunc("/system/users/removeUser", user_handleUserRemove)
  77. }
  78. //Remove a user from the system
  79. func user_handleUserRemove(w http.ResponseWriter, r *http.Request) {
  80. username, err := mv(r, "username", true)
  81. if err != nil {
  82. sendErrorResponse(w, "Username not defined")
  83. return
  84. }
  85. if !authAgent.UserExists(username) {
  86. sendErrorResponse(w, "User not exists")
  87. return
  88. }
  89. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  90. if err != nil {
  91. sendErrorResponse(w, err.Error())
  92. return
  93. }
  94. //Clear Core User Data
  95. userinfo.RemoveUser()
  96. //Clearn Up FileSystem preferences
  97. system_fs_removeUserPreferences(username)
  98. sendOK(w)
  99. }
  100. func user_handleUserEdit(w http.ResponseWriter, r *http.Request) {
  101. userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
  102. if err != nil {
  103. //This user has not logged in
  104. sendErrorResponse(w, "User not logged in")
  105. return
  106. }
  107. if userinfo.IsAdmin() == false {
  108. //Require admin access
  109. sendErrorResponse(w, "Permission Denied")
  110. return
  111. }
  112. opr, _ := mv(r, "opr", true)
  113. username, _ := mv(r, "username", true)
  114. if !authAgent.UserExists(username) {
  115. sendErrorResponse(w, "User not exists")
  116. return
  117. }
  118. if opr == "" {
  119. //List this user information
  120. type returnValue struct {
  121. Username string
  122. Icondata string
  123. Usergroup []string
  124. Quota int64
  125. }
  126. iconData := getUserIcon(username)
  127. userGroup, err := permissionHandler.GetUsersPermissionGroup(username)
  128. if err != nil {
  129. sendErrorResponse(w, "Unable to get user group")
  130. return
  131. }
  132. //Parse the user permission groupts
  133. userGroupNames := []string{}
  134. for _, gp := range userGroup {
  135. userGroupNames = append(userGroupNames, gp.Name)
  136. }
  137. //Get the user's storaeg quota
  138. userinfo, _ := userHandler.GetUserInfoFromUsername(username)
  139. jsonString, _ := json.Marshal(returnValue{
  140. Username: username,
  141. Icondata: iconData,
  142. Usergroup: userGroupNames,
  143. Quota: userinfo.StorageQuota.GetUserStorageQuota(),
  144. })
  145. sendJSONResponse(w, string(jsonString))
  146. } else if opr == "updateUserGroup" {
  147. //Update the target user's group
  148. newgroup, err := mv(r, "newgroup", true)
  149. if err != nil {
  150. log.Println(err.Error())
  151. sendErrorResponse(w, "New Group not defined")
  152. return
  153. }
  154. newQuota, err := mv(r, "quota", true)
  155. if err != nil {
  156. log.Println(err.Error())
  157. sendErrorResponse(w, "Quota not defined")
  158. return
  159. }
  160. quotaInt, err := strconv.Atoi(newQuota)
  161. if err != nil {
  162. log.Println(err.Error())
  163. sendErrorResponse(w, "Invalid Quota Value")
  164. return
  165. }
  166. newGroupKeys := []string{}
  167. err = json.Unmarshal([]byte(newgroup), &newGroupKeys)
  168. if err != nil {
  169. log.Println(err.Error())
  170. sendErrorResponse(w, "Unable to parse new groups")
  171. return
  172. }
  173. if len(newGroupKeys) == 0 {
  174. sendErrorResponse(w, "User must be in at least one user permission group")
  175. return
  176. }
  177. //Check if each group exists
  178. for _, thisgp := range newGroupKeys {
  179. if !permissionHandler.GroupExists(thisgp) {
  180. sendErrorResponse(w, "Group not exists, given: "+thisgp)
  181. return
  182. }
  183. }
  184. //OK to proceed
  185. userinfo, err := userHandler.GetUserInfoFromUsername(username)
  186. if err != nil {
  187. sendErrorResponse(w, err.Error())
  188. return
  189. }
  190. //Get the permission groups by their ids
  191. newPermissioGroups := userHandler.GetPermissionHandler().GetPermissionGroupByNameList(newGroupKeys)
  192. //Set the user's permission to these groups
  193. userinfo.SetUserPermissionGroup(newPermissioGroups)
  194. if err != nil {
  195. sendErrorResponse(w, err.Error())
  196. return
  197. }
  198. //Write to quota handler
  199. userinfo.StorageQuota.SetUserStorageQuota(int64(quotaInt))
  200. sendOK(w)
  201. } else if opr == "resetPassword" {
  202. //Reset password for this user
  203. //Generate a random password for this user
  204. tmppassword := uuid.NewV4().String()
  205. hashedPassword := auth.Hash(tmppassword)
  206. err := sysdb.Write("auth", "passhash/"+username, hashedPassword)
  207. if err != nil {
  208. sendErrorResponse(w, err.Error())
  209. return
  210. }
  211. //Finish. Send back the reseted password
  212. sendJSONResponse(w, "\""+tmppassword+"\"")
  213. } else {
  214. sendErrorResponse(w, "Not supported opr")
  215. return
  216. }
  217. }
  218. //Get the user interface info for the user to launch into
  219. func user_getInterfaceInfo(w http.ResponseWriter, r *http.Request) {
  220. userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
  221. if err != nil {
  222. //User not logged in
  223. errorHandleNotLoggedIn(w, r)
  224. return
  225. }
  226. interfacingModules := userinfo.GetInterfaceModules()
  227. interfaceModuleInfos := []module.ModuleInfo{}
  228. for _, im := range interfacingModules {
  229. interfaceModuleInfos = append(interfaceModuleInfos, *moduleHandler.GetModuleInfoByID(im))
  230. }
  231. jsonString, _ := json.Marshal(interfaceModuleInfos)
  232. sendJSONResponse(w, string(jsonString))
  233. }
  234. func user_handleUserInfo(w http.ResponseWriter, r *http.Request) {
  235. username, err := authAgent.GetUserName(w, r)
  236. if err != nil {
  237. sendErrorResponse(w, "User not logged in")
  238. return
  239. }
  240. opr, _ := mv(r, "opr", true)
  241. if opr == "" {
  242. //Listing mode
  243. iconData := getUserIcon(username)
  244. userGroup, err := permissionHandler.GetUsersPermissionGroup(username)
  245. if err != nil {
  246. sendErrorResponse(w, "Unable to get user group")
  247. return
  248. }
  249. userGroupNames := []string{}
  250. for _, group := range userGroup {
  251. userGroupNames = append(userGroupNames, group.Name)
  252. }
  253. type returnValue struct {
  254. Username string
  255. Icondata string
  256. Usergroup []string
  257. }
  258. jsonString, _ := json.Marshal(returnValue{
  259. Username: username,
  260. Icondata: iconData,
  261. Usergroup: userGroupNames,
  262. })
  263. sendJSONResponse(w, string(jsonString))
  264. return
  265. } else if opr == "changepw" {
  266. oldpw, _ := mv(r, "oldpw", true)
  267. newpw, _ := mv(r, "newpw", true)
  268. if oldpw == "" || newpw == "" {
  269. sendErrorResponse(w, "Password cannot be empty")
  270. return
  271. }
  272. //valid the old password
  273. hashedPassword := auth.Hash(oldpw)
  274. var passwordInDB string
  275. err = sysdb.Read("auth", "passhash/"+username, &passwordInDB)
  276. if hashedPassword != passwordInDB {
  277. //Old password entry invalid.
  278. sendErrorResponse(w, "Invalid old password.")
  279. return
  280. }
  281. //OK! Change user password
  282. newHashedPassword := auth.Hash(newpw)
  283. sysdb.Write("auth", "passhash/"+username, newHashedPassword)
  284. sendOK(w)
  285. } else if opr == "changeprofilepic" {
  286. picdata, _ := mv(r, "picdata", true)
  287. if picdata != "" {
  288. setUserIcon(username, picdata)
  289. sendOK(w)
  290. } else {
  291. sendErrorResponse(w, "Empty image data received.")
  292. return
  293. }
  294. } else {
  295. sendErrorResponse(w, "Not supported opr")
  296. return
  297. }
  298. }
  299. func user_handleList(w http.ResponseWriter, r *http.Request) {
  300. userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
  301. if err != nil {
  302. //This user has not logged in
  303. sendErrorResponse(w, "User not logged in")
  304. return
  305. }
  306. if userinfo.IsAdmin() == true {
  307. entries, _ := sysdb.ListTable("auth")
  308. var results [][]interface{}
  309. for _, keypairs := range entries {
  310. if strings.Contains(string(keypairs[0]), "group/") {
  311. username := strings.Split(string(keypairs[0]), "/")[1]
  312. group := []string{}
  313. //Get user icon if it exists in the database
  314. userIcon := getUserIcon(username)
  315. json.Unmarshal(keypairs[1], &group)
  316. var thisUserInfo []interface{}
  317. thisUserInfo = append(thisUserInfo, username)
  318. thisUserInfo = append(thisUserInfo, group)
  319. thisUserInfo = append(thisUserInfo, userIcon)
  320. thisUserInfo = append(thisUserInfo, username == userinfo.Username)
  321. results = append(results, thisUserInfo)
  322. }
  323. }
  324. jsonString, _ := json.Marshal(results)
  325. sendJSONResponse(w, string(jsonString))
  326. } else {
  327. sendErrorResponse(w, "Permission denied")
  328. return
  329. }
  330. }
  331. func getUserIcon(username string) string {
  332. var userIconpath []byte
  333. sysdb.Read("auth", "profilepic/"+username, &userIconpath)
  334. return string(userIconpath)
  335. }
  336. func setUserIcon(username string, base64data string) {
  337. sysdb.Write("auth", "profilepic/"+username, []byte(base64data))
  338. return
  339. }