user.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 api // import "miniflux.app/api"
  5. import (
  6. "errors"
  7. "net/http"
  8. "miniflux.app/http/request"
  9. "miniflux.app/http/response/json"
  10. "miniflux.app/model"
  11. )
  12. func (h *handler) currentUser(w http.ResponseWriter, r *http.Request) {
  13. user, err := h.store.UserByID(request.UserID(r))
  14. if err != nil {
  15. json.ServerError(w, r, err)
  16. return
  17. }
  18. json.OK(w, r, user)
  19. }
  20. func (h *handler) createUser(w http.ResponseWriter, r *http.Request) {
  21. if !request.IsAdminUser(r) {
  22. json.Forbidden(w, r)
  23. return
  24. }
  25. userCreationRequest, err := decodeUserCreationRequest(r.Body)
  26. if err != nil {
  27. json.BadRequest(w, r, err)
  28. return
  29. }
  30. user := model.NewUser()
  31. user.Username = userCreationRequest.Username
  32. user.Password = userCreationRequest.Password
  33. user.IsAdmin = userCreationRequest.IsAdmin
  34. user.GoogleID = userCreationRequest.GoogleID
  35. user.OpenIDConnectID = userCreationRequest.OpenIDConnectID
  36. if err := user.ValidateUserCreation(); err != nil {
  37. json.BadRequest(w, r, err)
  38. return
  39. }
  40. if h.store.UserExists(user.Username) {
  41. json.BadRequest(w, r, errors.New("This user already exists"))
  42. return
  43. }
  44. err = h.store.CreateUser(user)
  45. if err != nil {
  46. json.ServerError(w, r, err)
  47. return
  48. }
  49. user.Password = ""
  50. json.Created(w, r, user)
  51. }
  52. func (h *handler) updateUser(w http.ResponseWriter, r *http.Request) {
  53. userID := request.RouteInt64Param(r, "userID")
  54. userChanges, err := decodeUserModificationRequest(r.Body)
  55. if err != nil {
  56. json.BadRequest(w, r, err)
  57. return
  58. }
  59. originalUser, err := h.store.UserByID(userID)
  60. if err != nil {
  61. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  62. return
  63. }
  64. if originalUser == nil {
  65. json.NotFound(w, r)
  66. return
  67. }
  68. if !request.IsAdminUser(r) {
  69. if originalUser.ID != request.UserID(r) {
  70. json.Forbidden(w, r)
  71. return
  72. }
  73. if userChanges.IsAdmin != nil && *userChanges.IsAdmin {
  74. json.BadRequest(w, r, errors.New("Only administrators can change permissions of standard users"))
  75. return
  76. }
  77. }
  78. userChanges.Update(originalUser)
  79. if err := originalUser.ValidateUserModification(); err != nil {
  80. json.BadRequest(w, r, err)
  81. return
  82. }
  83. if err = h.store.UpdateUser(originalUser); err != nil {
  84. json.ServerError(w, r, err)
  85. return
  86. }
  87. json.Created(w, r, originalUser)
  88. }
  89. func (h *handler) markUserAsRead(w http.ResponseWriter, r *http.Request) {
  90. userID := request.RouteInt64Param(r, "userID")
  91. if userID != request.UserID(r) {
  92. json.Forbidden(w, r)
  93. return
  94. }
  95. if _, err := h.store.UserByID(userID); err != nil {
  96. json.NotFound(w, r)
  97. return
  98. }
  99. if err := h.store.MarkAllAsRead(userID); err != nil {
  100. json.ServerError(w, r, err)
  101. return
  102. }
  103. json.NoContent(w, r)
  104. }
  105. func (h *handler) users(w http.ResponseWriter, r *http.Request) {
  106. if !request.IsAdminUser(r) {
  107. json.Forbidden(w, r)
  108. return
  109. }
  110. users, err := h.store.Users()
  111. if err != nil {
  112. json.ServerError(w, r, err)
  113. return
  114. }
  115. users.UseTimezone(request.UserTimezone(r))
  116. json.OK(w, r, users)
  117. }
  118. func (h *handler) userByID(w http.ResponseWriter, r *http.Request) {
  119. if !request.IsAdminUser(r) {
  120. json.Forbidden(w, r)
  121. return
  122. }
  123. userID := request.RouteInt64Param(r, "userID")
  124. user, err := h.store.UserByID(userID)
  125. if err != nil {
  126. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  127. return
  128. }
  129. if user == nil {
  130. json.NotFound(w, r)
  131. return
  132. }
  133. user.UseTimezone(request.UserTimezone(r))
  134. json.OK(w, r, user)
  135. }
  136. func (h *handler) userByUsername(w http.ResponseWriter, r *http.Request) {
  137. if !request.IsAdminUser(r) {
  138. json.Forbidden(w, r)
  139. return
  140. }
  141. username := request.RouteStringParam(r, "username")
  142. user, err := h.store.UserByUsername(username)
  143. if err != nil {
  144. json.BadRequest(w, r, errors.New("Unable to fetch this user from the database"))
  145. return
  146. }
  147. if user == nil {
  148. json.NotFound(w, r)
  149. return
  150. }
  151. json.OK(w, r, user)
  152. }
  153. func (h *handler) removeUser(w http.ResponseWriter, r *http.Request) {
  154. if !request.IsAdminUser(r) {
  155. json.Forbidden(w, r)
  156. return
  157. }
  158. userID := request.RouteInt64Param(r, "userID")
  159. user, err := h.store.UserByID(userID)
  160. if err != nil {
  161. json.ServerError(w, r, err)
  162. return
  163. }
  164. if user == nil {
  165. json.NotFound(w, r)
  166. return
  167. }
  168. if user.ID == request.UserID(r) {
  169. json.BadRequest(w, r, errors.New("You cannot remove yourself"))
  170. return
  171. }
  172. h.store.RemoveUserAsync(user.ID)
  173. json.NoContent(w, r)
  174. }