user.go 3.4 KB

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