user.go 5.2 KB

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