user.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package controller
  5. import (
  6. "errors"
  7. "github.com/miniflux/miniflux/logger"
  8. "github.com/miniflux/miniflux/model"
  9. "github.com/miniflux/miniflux/server/core"
  10. "github.com/miniflux/miniflux/server/ui/form"
  11. )
  12. // ShowUsers shows the list of users.
  13. func (c *Controller) ShowUsers(ctx *core.Context, request *core.Request, response *core.Response) {
  14. user := ctx.LoggedUser()
  15. if !user.IsAdmin {
  16. response.HTML().Forbidden()
  17. return
  18. }
  19. args, err := c.getCommonTemplateArgs(ctx)
  20. if err != nil {
  21. response.HTML().ServerError(err)
  22. return
  23. }
  24. users, err := c.store.Users()
  25. if err != nil {
  26. response.HTML().ServerError(err)
  27. return
  28. }
  29. response.HTML().Render("users", args.Merge(tplParams{
  30. "users": users,
  31. "menu": "settings",
  32. }))
  33. }
  34. // CreateUser shows the user creation form.
  35. func (c *Controller) CreateUser(ctx *core.Context, request *core.Request, response *core.Response) {
  36. user := ctx.LoggedUser()
  37. if !user.IsAdmin {
  38. response.HTML().Forbidden()
  39. return
  40. }
  41. args, err := c.getCommonTemplateArgs(ctx)
  42. if err != nil {
  43. response.HTML().ServerError(err)
  44. return
  45. }
  46. response.HTML().Render("create_user", args.Merge(tplParams{
  47. "menu": "settings",
  48. "form": &form.UserForm{},
  49. }))
  50. }
  51. // SaveUser validate and save the new user into the database.
  52. func (c *Controller) SaveUser(ctx *core.Context, request *core.Request, response *core.Response) {
  53. user := ctx.LoggedUser()
  54. if !user.IsAdmin {
  55. response.HTML().Forbidden()
  56. return
  57. }
  58. args, err := c.getCommonTemplateArgs(ctx)
  59. if err != nil {
  60. response.HTML().ServerError(err)
  61. return
  62. }
  63. userForm := form.NewUserForm(request.Request())
  64. if err := userForm.ValidateCreation(); err != nil {
  65. response.HTML().Render("create_user", args.Merge(tplParams{
  66. "menu": "settings",
  67. "form": userForm,
  68. "errorMessage": err.Error(),
  69. }))
  70. return
  71. }
  72. if c.store.UserExists(userForm.Username) {
  73. response.HTML().Render("create_user", args.Merge(tplParams{
  74. "menu": "settings",
  75. "form": userForm,
  76. "errorMessage": "This user already exists.",
  77. }))
  78. return
  79. }
  80. newUser := userForm.ToUser()
  81. if err := c.store.CreateUser(newUser); err != nil {
  82. logger.Error("[Controller:SaveUser] %v", err)
  83. response.HTML().Render("edit_user", args.Merge(tplParams{
  84. "menu": "settings",
  85. "form": userForm,
  86. "errorMessage": "Unable to create this user.",
  87. }))
  88. return
  89. }
  90. response.Redirect(ctx.Route("users"))
  91. }
  92. // EditUser shows the form to edit a user.
  93. func (c *Controller) EditUser(ctx *core.Context, request *core.Request, response *core.Response) {
  94. user := ctx.LoggedUser()
  95. if !user.IsAdmin {
  96. response.HTML().Forbidden()
  97. return
  98. }
  99. args, err := c.getCommonTemplateArgs(ctx)
  100. if err != nil {
  101. response.HTML().ServerError(err)
  102. return
  103. }
  104. selectedUser, err := c.getUserFromURL(ctx, request, response)
  105. if err != nil {
  106. return
  107. }
  108. response.HTML().Render("edit_user", args.Merge(tplParams{
  109. "menu": "settings",
  110. "selected_user": selectedUser,
  111. "form": &form.UserForm{
  112. Username: selectedUser.Username,
  113. IsAdmin: selectedUser.IsAdmin,
  114. },
  115. }))
  116. }
  117. // UpdateUser validate and update a user.
  118. func (c *Controller) UpdateUser(ctx *core.Context, request *core.Request, response *core.Response) {
  119. user := ctx.LoggedUser()
  120. if !user.IsAdmin {
  121. response.HTML().Forbidden()
  122. return
  123. }
  124. args, err := c.getCommonTemplateArgs(ctx)
  125. if err != nil {
  126. response.HTML().ServerError(err)
  127. return
  128. }
  129. selectedUser, err := c.getUserFromURL(ctx, request, response)
  130. if err != nil {
  131. return
  132. }
  133. userForm := form.NewUserForm(request.Request())
  134. if err := userForm.ValidateModification(); err != nil {
  135. response.HTML().Render("edit_user", args.Merge(tplParams{
  136. "menu": "settings",
  137. "selected_user": selectedUser,
  138. "form": userForm,
  139. "errorMessage": err.Error(),
  140. }))
  141. return
  142. }
  143. if c.store.AnotherUserExists(selectedUser.ID, userForm.Username) {
  144. response.HTML().Render("edit_user", args.Merge(tplParams{
  145. "menu": "settings",
  146. "selected_user": selectedUser,
  147. "form": userForm,
  148. "errorMessage": "This user already exists.",
  149. }))
  150. return
  151. }
  152. userForm.Merge(selectedUser)
  153. if err := c.store.UpdateUser(selectedUser); err != nil {
  154. logger.Error("[Controller:UpdateUser] %v", err)
  155. response.HTML().Render("edit_user", args.Merge(tplParams{
  156. "menu": "settings",
  157. "selected_user": selectedUser,
  158. "form": userForm,
  159. "errorMessage": "Unable to update this user.",
  160. }))
  161. return
  162. }
  163. response.Redirect(ctx.Route("users"))
  164. }
  165. // RemoveUser deletes a user from the database.
  166. func (c *Controller) RemoveUser(ctx *core.Context, request *core.Request, response *core.Response) {
  167. user := ctx.LoggedUser()
  168. if !user.IsAdmin {
  169. response.HTML().Forbidden()
  170. return
  171. }
  172. selectedUser, err := c.getUserFromURL(ctx, request, response)
  173. if err != nil {
  174. return
  175. }
  176. if err := c.store.RemoveUser(selectedUser.ID); err != nil {
  177. response.HTML().ServerError(err)
  178. return
  179. }
  180. response.Redirect(ctx.Route("users"))
  181. }
  182. func (c *Controller) getUserFromURL(ctx *core.Context, request *core.Request, response *core.Response) (*model.User, error) {
  183. userID, err := request.IntegerParam("userID")
  184. if err != nil {
  185. response.HTML().BadRequest(err)
  186. return nil, err
  187. }
  188. user, err := c.store.UserByID(userID)
  189. if err != nil {
  190. response.HTML().ServerError(err)
  191. return nil, err
  192. }
  193. if user == nil {
  194. response.HTML().NotFound()
  195. return nil, errors.New("User not found")
  196. }
  197. return user, nil
  198. }