user.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE.gogs file.
  4. package admin
  5. import (
  6. "net/http"
  7. api "github.com/gogs/go-gogs-client"
  8. log "unknwon.dev/clog/v2"
  9. "gogs.io/gogs/internal/conf"
  10. "gogs.io/gogs/internal/context"
  11. "gogs.io/gogs/internal/database"
  12. "gogs.io/gogs/internal/email"
  13. "gogs.io/gogs/internal/route/api/v1/user"
  14. )
  15. func parseLoginSource(c *context.APIContext, sourceID int64) {
  16. if sourceID == 0 {
  17. return
  18. }
  19. _, err := database.Handle.LoginSources().GetByID(c.Req.Context(), sourceID)
  20. if err != nil {
  21. if database.IsErrLoginSourceNotExist(err) {
  22. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  23. } else {
  24. c.Error(err, "get login source by ID")
  25. }
  26. return
  27. }
  28. }
  29. func CreateUser(c *context.APIContext, form api.CreateUserOption) {
  30. parseLoginSource(c, form.SourceID)
  31. if c.Written() {
  32. return
  33. }
  34. user, err := database.Handle.Users().Create(c.Req.Context(), form.Username, form.Email, database.CreateUserOptions{
  35. FullName: form.FullName,
  36. Password: form.Password,
  37. LoginSource: form.SourceID,
  38. LoginName: form.LoginName,
  39. Activated: true,
  40. })
  41. if err != nil {
  42. if database.IsErrUserAlreadyExist(err) ||
  43. database.IsErrEmailAlreadyUsed(err) ||
  44. database.IsErrNameNotAllowed(err) {
  45. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  46. } else {
  47. c.Error(err, "create user")
  48. }
  49. return
  50. }
  51. log.Trace("Account %q created by admin %q", user.Name, c.User.Name)
  52. // Send email notification.
  53. if form.SendNotify && conf.Email.Enabled {
  54. email.SendRegisterNotifyMail(c.Context.Context, database.NewMailerUser(user))
  55. }
  56. c.JSON(http.StatusCreated, user.APIFormat())
  57. }
  58. func EditUser(c *context.APIContext, form api.EditUserOption) { // TODO 代检查
  59. u := user.GetUserByParams(c)
  60. if c.Written() {
  61. return
  62. }
  63. parseLoginSource(c, form.SourceID)
  64. if c.Written() {
  65. return
  66. }
  67. opts := database.UpdateUserOptions{
  68. LoginSource: &form.SourceID,
  69. LoginName: &form.LoginName,
  70. FullName: &form.FullName,
  71. Website: &form.Website,
  72. Location: &form.Location,
  73. MaxRepoCreation: form.MaxRepoCreation,
  74. IsActivated: form.Active,
  75. IsAdmin: form.Admin,
  76. AllowGitHook: form.AllowGitHook,
  77. AllowImportLocal: form.AllowImportLocal,
  78. ProhibitLogin: nil, // TODO: Add this option to API
  79. }
  80. if form.Password != "" {
  81. opts.Password = &form.Password
  82. }
  83. if u.Email != form.Email {
  84. opts.Email = &form.Email
  85. }
  86. err := database.Handle.Users().Update(c.Req.Context(), u.ID, opts)
  87. if err != nil {
  88. if database.IsErrEmailAlreadyUsed(err) {
  89. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  90. } else {
  91. c.Error(err, "update user")
  92. }
  93. return
  94. }
  95. log.Trace("Account updated by admin %q: %s", c.User.Name, u.Name)
  96. u, err = database.Handle.Users().GetByID(c.Req.Context(), u.ID)
  97. if err != nil {
  98. c.Error(err, "get user")
  99. return
  100. }
  101. c.JSONSuccess(u.APIFormat())
  102. }
  103. func DeleteUser(c *context.APIContext) {
  104. u := user.GetUserByParams(c)
  105. if c.Written() {
  106. return
  107. }
  108. if err := database.Handle.Users().DeleteByID(c.Req.Context(), u.ID, false); err != nil {
  109. if database.IsErrUserOwnRepos(err) ||
  110. database.IsErrUserHasOrgs(err) {
  111. c.ErrorStatus(http.StatusUnprocessableEntity, err)
  112. } else {
  113. c.Error(err, "delete user")
  114. }
  115. return
  116. }
  117. log.Trace("Account deleted by admin(%s): %s", c.User.Name, u.Name)
  118. c.NoContent()
  119. }
  120. func CreatePublicKey(c *context.APIContext, form api.CreateKeyOption) {
  121. u := user.GetUserByParams(c)
  122. if c.Written() {
  123. return
  124. }
  125. user.CreateUserPublicKey(c, form, u.ID)
  126. }