You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

user.go 5.7 kB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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 file.
  4. package admin
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/context"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/setting"
  10. "code.gitea.io/gitea/routers/api/v1/user"
  11. api "code.gitea.io/sdk/gitea"
  12. )
  13. func parseLoginSource(ctx *context.APIContext, u *models.User, sourceID int64, loginName string) {
  14. if sourceID == 0 {
  15. return
  16. }
  17. source, err := models.GetLoginSourceByID(sourceID)
  18. if err != nil {
  19. if models.IsErrLoginSourceNotExist(err) {
  20. ctx.Error(422, "", err)
  21. } else {
  22. ctx.Error(500, "GetLoginSourceByID", err)
  23. }
  24. return
  25. }
  26. u.LoginType = source.Type
  27. u.LoginSource = source.ID
  28. u.LoginName = loginName
  29. }
  30. // CreateUser create a user
  31. func CreateUser(ctx *context.APIContext, form api.CreateUserOption) {
  32. // swagger:operation POST /admin/users admin adminCreateUser
  33. // ---
  34. // summary: Create a user
  35. // consumes:
  36. // - application/json
  37. // produces:
  38. // - application/json
  39. // parameters:
  40. // - name: body
  41. // in: body
  42. // schema:
  43. // "$ref": "#/definitions/CreateUserOption"
  44. // responses:
  45. // "201":
  46. // "$ref": "#/responses/User"
  47. // "403":
  48. // "$ref": "#/responses/forbidden"
  49. // "422":
  50. // "$ref": "#/responses/validationError"
  51. u := &models.User{
  52. Name: form.Username,
  53. FullName: form.FullName,
  54. Email: form.Email,
  55. Passwd: form.Password,
  56. IsActive: true,
  57. LoginType: models.LoginPlain,
  58. }
  59. parseLoginSource(ctx, u, form.SourceID, form.LoginName)
  60. if ctx.Written() {
  61. return
  62. }
  63. if err := models.CreateUser(u); err != nil {
  64. if models.IsErrUserAlreadyExist(err) ||
  65. models.IsErrEmailAlreadyUsed(err) ||
  66. models.IsErrNameReserved(err) ||
  67. models.IsErrNamePatternNotAllowed(err) {
  68. ctx.Error(422, "", err)
  69. } else {
  70. ctx.Error(500, "CreateUser", err)
  71. }
  72. return
  73. }
  74. log.Trace("Account created by admin (%s): %s", ctx.User.Name, u.Name)
  75. // Send email notification.
  76. if form.SendNotify && setting.MailService != nil {
  77. models.SendRegisterNotifyMail(ctx.Context.Context, u)
  78. }
  79. ctx.JSON(201, u.APIFormat())
  80. }
  81. // EditUser api for modifying a user's information
  82. func EditUser(ctx *context.APIContext, form api.EditUserOption) {
  83. // swagger:operation PATCH /admin/users/{username} admin adminEditUser
  84. // ---
  85. // summary: Edit an existing user
  86. // consumes:
  87. // - application/json
  88. // produces:
  89. // - application/json
  90. // parameters:
  91. // - name: username
  92. // in: path
  93. // description: username of user to edit
  94. // type: string
  95. // required: true
  96. // - name: body
  97. // in: body
  98. // schema:
  99. // "$ref": "#/definitions/EditUserOption"
  100. // responses:
  101. // "200":
  102. // "$ref": "#/responses/User"
  103. // "403":
  104. // "$ref": "#/responses/forbidden"
  105. // "422":
  106. // "$ref": "#/responses/validationError"
  107. u := user.GetUserByParams(ctx)
  108. if ctx.Written() {
  109. return
  110. }
  111. parseLoginSource(ctx, u, form.SourceID, form.LoginName)
  112. if ctx.Written() {
  113. return
  114. }
  115. if len(form.Password) > 0 {
  116. u.Passwd = form.Password
  117. var err error
  118. if u.Salt, err = models.GetUserSalt(); err != nil {
  119. ctx.Error(500, "UpdateUser", err)
  120. return
  121. }
  122. u.EncodePasswd()
  123. }
  124. u.LoginName = form.LoginName
  125. u.FullName = form.FullName
  126. u.Email = form.Email
  127. u.Website = form.Website
  128. u.Location = form.Location
  129. if form.Active != nil {
  130. u.IsActive = *form.Active
  131. }
  132. if form.Admin != nil {
  133. u.IsAdmin = *form.Admin
  134. }
  135. if form.AllowGitHook != nil {
  136. u.AllowGitHook = *form.AllowGitHook
  137. }
  138. if form.AllowImportLocal != nil {
  139. u.AllowImportLocal = *form.AllowImportLocal
  140. }
  141. if form.MaxRepoCreation != nil {
  142. u.MaxRepoCreation = *form.MaxRepoCreation
  143. }
  144. if err := models.UpdateUser(u); err != nil {
  145. if models.IsErrEmailAlreadyUsed(err) {
  146. ctx.Error(422, "", err)
  147. } else {
  148. ctx.Error(500, "UpdateUser", err)
  149. }
  150. return
  151. }
  152. log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name)
  153. ctx.JSON(200, u.APIFormat())
  154. }
  155. // DeleteUser api for deleting a user
  156. func DeleteUser(ctx *context.APIContext) {
  157. // swagger:operation DELETE /admin/users/{username} admin adminDeleteUser
  158. // ---
  159. // summary: Delete a user
  160. // produces:
  161. // - application/json
  162. // parameters:
  163. // - name: username
  164. // in: path
  165. // description: username of user to delete
  166. // type: string
  167. // required: true
  168. // responses:
  169. // "204":
  170. // "$ref": "#/responses/empty"
  171. // "403":
  172. // "$ref": "#/responses/forbidden"
  173. // "422":
  174. // "$ref": "#/responses/validationError"
  175. u := user.GetUserByParams(ctx)
  176. if ctx.Written() {
  177. return
  178. }
  179. if err := models.DeleteUser(u); err != nil {
  180. if models.IsErrUserOwnRepos(err) ||
  181. models.IsErrUserHasOrgs(err) {
  182. ctx.Error(422, "", err)
  183. } else {
  184. ctx.Error(500, "DeleteUser", err)
  185. }
  186. return
  187. }
  188. log.Trace("Account deleted by admin(%s): %s", ctx.User.Name, u.Name)
  189. ctx.Status(204)
  190. }
  191. // CreatePublicKey api for creating a public key to a user
  192. func CreatePublicKey(ctx *context.APIContext, form api.CreateKeyOption) {
  193. // swagger:operation POST /admin/users/{username}/keys admin adminCreatePublicKey
  194. // ---
  195. // summary: Add a public key on behalf of a user
  196. // consumes:
  197. // - application/json
  198. // produces:
  199. // - application/json
  200. // parameters:
  201. // - name: username
  202. // in: path
  203. // description: username of the user
  204. // type: string
  205. // required: true
  206. // responses:
  207. // "201":
  208. // "$ref": "#/responses/PublicKey"
  209. // "403":
  210. // "$ref": "#/responses/forbidden"
  211. // "422":
  212. // "$ref": "#/responses/validationError"
  213. u := user.GetUserByParams(ctx)
  214. if ctx.Written() {
  215. return
  216. }
  217. user.CreateUserPublicKey(ctx, form, u.ID)
  218. }