user.go 5.6 KB

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