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 8.7 kB

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
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package admin
  6. import (
  7. "errors"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/password"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "code.gitea.io/gitea/routers/api/v1/convert"
  14. "code.gitea.io/gitea/routers/api/v1/user"
  15. "code.gitea.io/gitea/services/mailer"
  16. )
  17. func parseLoginSource(ctx *context.APIContext, u *models.User, sourceID int64, loginName string) {
  18. if sourceID == 0 {
  19. return
  20. }
  21. source, err := models.GetLoginSourceByID(sourceID)
  22. if err != nil {
  23. if models.IsErrLoginSourceNotExist(err) {
  24. ctx.Error(422, "", err)
  25. } else {
  26. ctx.Error(500, "GetLoginSourceByID", err)
  27. }
  28. return
  29. }
  30. u.LoginType = source.Type
  31. u.LoginSource = source.ID
  32. u.LoginName = loginName
  33. }
  34. // CreateUser create a user
  35. func CreateUser(ctx *context.APIContext, form api.CreateUserOption) {
  36. // swagger:operation POST /admin/users admin adminCreateUser
  37. // ---
  38. // summary: Create a user
  39. // consumes:
  40. // - application/json
  41. // produces:
  42. // - application/json
  43. // parameters:
  44. // - name: body
  45. // in: body
  46. // schema:
  47. // "$ref": "#/definitions/CreateUserOption"
  48. // responses:
  49. // "201":
  50. // "$ref": "#/responses/User"
  51. // "403":
  52. // "$ref": "#/responses/forbidden"
  53. // "422":
  54. // "$ref": "#/responses/validationError"
  55. u := &models.User{
  56. Name: form.Username,
  57. FullName: form.FullName,
  58. Email: form.Email,
  59. Passwd: form.Password,
  60. MustChangePassword: true,
  61. IsActive: true,
  62. LoginType: models.LoginPlain,
  63. }
  64. if form.MustChangePassword != nil {
  65. u.MustChangePassword = *form.MustChangePassword
  66. }
  67. parseLoginSource(ctx, u, form.SourceID, form.LoginName)
  68. if ctx.Written() {
  69. return
  70. }
  71. if !password.IsComplexEnough(form.Password) {
  72. err := errors.New("PasswordComplexity")
  73. ctx.Error(400, "PasswordComplexity", err)
  74. return
  75. }
  76. if err := models.CreateUser(u); err != nil {
  77. if models.IsErrUserAlreadyExist(err) ||
  78. models.IsErrEmailAlreadyUsed(err) ||
  79. models.IsErrNameReserved(err) ||
  80. models.IsErrNamePatternNotAllowed(err) {
  81. ctx.Error(422, "", err)
  82. } else {
  83. ctx.Error(500, "CreateUser", err)
  84. }
  85. return
  86. }
  87. log.Trace("Account created by admin (%s): %s", ctx.User.Name, u.Name)
  88. // Send email notification.
  89. if form.SendNotify {
  90. mailer.SendRegisterNotifyMail(ctx.Locale, u)
  91. }
  92. ctx.JSON(201, convert.ToUser(u, ctx.IsSigned, ctx.User.IsAdmin))
  93. }
  94. // EditUser api for modifying a user's information
  95. func EditUser(ctx *context.APIContext, form api.EditUserOption) {
  96. // swagger:operation PATCH /admin/users/{username} admin adminEditUser
  97. // ---
  98. // summary: Edit an existing user
  99. // consumes:
  100. // - application/json
  101. // produces:
  102. // - application/json
  103. // parameters:
  104. // - name: username
  105. // in: path
  106. // description: username of user to edit
  107. // type: string
  108. // required: true
  109. // - name: body
  110. // in: body
  111. // schema:
  112. // "$ref": "#/definitions/EditUserOption"
  113. // responses:
  114. // "200":
  115. // "$ref": "#/responses/User"
  116. // "403":
  117. // "$ref": "#/responses/forbidden"
  118. // "422":
  119. // "$ref": "#/responses/validationError"
  120. u := user.GetUserByParams(ctx)
  121. if ctx.Written() {
  122. return
  123. }
  124. parseLoginSource(ctx, u, form.SourceID, form.LoginName)
  125. if ctx.Written() {
  126. return
  127. }
  128. if len(form.Password) > 0 {
  129. if !password.IsComplexEnough(form.Password) {
  130. err := errors.New("PasswordComplexity")
  131. ctx.Error(400, "PasswordComplexity", err)
  132. return
  133. }
  134. var err error
  135. if u.Salt, err = models.GetUserSalt(); err != nil {
  136. ctx.Error(500, "UpdateUser", err)
  137. return
  138. }
  139. u.HashPassword(form.Password)
  140. }
  141. if form.MustChangePassword != nil {
  142. u.MustChangePassword = *form.MustChangePassword
  143. }
  144. u.LoginName = form.LoginName
  145. u.FullName = form.FullName
  146. u.Email = form.Email
  147. u.Website = form.Website
  148. u.Location = form.Location
  149. if form.Active != nil {
  150. u.IsActive = *form.Active
  151. }
  152. if form.Admin != nil {
  153. u.IsAdmin = *form.Admin
  154. }
  155. if form.AllowGitHook != nil {
  156. u.AllowGitHook = *form.AllowGitHook
  157. }
  158. if form.AllowImportLocal != nil {
  159. u.AllowImportLocal = *form.AllowImportLocal
  160. }
  161. if form.MaxRepoCreation != nil {
  162. u.MaxRepoCreation = *form.MaxRepoCreation
  163. }
  164. if form.AllowCreateOrganization != nil {
  165. u.AllowCreateOrganization = *form.AllowCreateOrganization
  166. }
  167. if form.ProhibitLogin != nil {
  168. u.ProhibitLogin = *form.ProhibitLogin
  169. }
  170. if err := models.UpdateUser(u); err != nil {
  171. if models.IsErrEmailAlreadyUsed(err) {
  172. ctx.Error(422, "", err)
  173. } else {
  174. ctx.Error(500, "UpdateUser", err)
  175. }
  176. return
  177. }
  178. log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name)
  179. ctx.JSON(200, convert.ToUser(u, ctx.IsSigned, ctx.User.IsAdmin))
  180. }
  181. // DeleteUser api for deleting a user
  182. func DeleteUser(ctx *context.APIContext) {
  183. // swagger:operation DELETE /admin/users/{username} admin adminDeleteUser
  184. // ---
  185. // summary: Delete a user
  186. // produces:
  187. // - application/json
  188. // parameters:
  189. // - name: username
  190. // in: path
  191. // description: username of user to delete
  192. // type: string
  193. // required: true
  194. // responses:
  195. // "204":
  196. // "$ref": "#/responses/empty"
  197. // "403":
  198. // "$ref": "#/responses/forbidden"
  199. // "422":
  200. // "$ref": "#/responses/validationError"
  201. u := user.GetUserByParams(ctx)
  202. if ctx.Written() {
  203. return
  204. }
  205. if err := models.DeleteUser(u); err != nil {
  206. if models.IsErrUserOwnRepos(err) ||
  207. models.IsErrUserHasOrgs(err) {
  208. ctx.Error(422, "", err)
  209. } else {
  210. ctx.Error(500, "DeleteUser", err)
  211. }
  212. return
  213. }
  214. log.Trace("Account deleted by admin(%s): %s", ctx.User.Name, u.Name)
  215. ctx.Status(204)
  216. }
  217. // CreatePublicKey api for creating a public key to a user
  218. func CreatePublicKey(ctx *context.APIContext, form api.CreateKeyOption) {
  219. // swagger:operation POST /admin/users/{username}/keys admin adminCreatePublicKey
  220. // ---
  221. // summary: Add a public key on behalf of a user
  222. // consumes:
  223. // - application/json
  224. // produces:
  225. // - application/json
  226. // parameters:
  227. // - name: username
  228. // in: path
  229. // description: username of the user
  230. // type: string
  231. // required: true
  232. // - name: key
  233. // in: body
  234. // schema:
  235. // "$ref": "#/definitions/CreateKeyOption"
  236. // responses:
  237. // "201":
  238. // "$ref": "#/responses/PublicKey"
  239. // "403":
  240. // "$ref": "#/responses/forbidden"
  241. // "422":
  242. // "$ref": "#/responses/validationError"
  243. u := user.GetUserByParams(ctx)
  244. if ctx.Written() {
  245. return
  246. }
  247. user.CreateUserPublicKey(ctx, form, u.ID)
  248. }
  249. // DeleteUserPublicKey api for deleting a user's public key
  250. func DeleteUserPublicKey(ctx *context.APIContext) {
  251. // swagger:operation DELETE /admin/users/{username}/keys/{id} admin adminDeleteUserPublicKey
  252. // ---
  253. // summary: Delete a user's public key
  254. // produces:
  255. // - application/json
  256. // parameters:
  257. // - name: username
  258. // in: path
  259. // description: username of user
  260. // type: string
  261. // required: true
  262. // - name: id
  263. // in: path
  264. // description: id of the key to delete
  265. // type: integer
  266. // format: int64
  267. // required: true
  268. // responses:
  269. // "204":
  270. // "$ref": "#/responses/empty"
  271. // "403":
  272. // "$ref": "#/responses/forbidden"
  273. // "404":
  274. // "$ref": "#/responses/notFound"
  275. u := user.GetUserByParams(ctx)
  276. if ctx.Written() {
  277. return
  278. }
  279. if err := models.DeletePublicKey(u, ctx.ParamsInt64(":id")); err != nil {
  280. if models.IsErrKeyNotExist(err) {
  281. ctx.NotFound()
  282. } else if models.IsErrKeyAccessDenied(err) {
  283. ctx.Error(403, "", "You do not have access to this key")
  284. } else {
  285. ctx.Error(500, "DeleteUserPublicKey", err)
  286. }
  287. return
  288. }
  289. log.Trace("Key deleted by admin(%s): %s", ctx.User.Name, u.Name)
  290. ctx.Status(204)
  291. }
  292. //GetAllUsers API for getting information of all the users
  293. func GetAllUsers(ctx *context.APIContext) {
  294. // swagger:operation GET /admin/users admin adminGetAllUsers
  295. // ---
  296. // summary: List all users
  297. // produces:
  298. // - application/json
  299. // responses:
  300. // "200":
  301. // "$ref": "#/responses/UserList"
  302. // "403":
  303. // "$ref": "#/responses/forbidden"
  304. users, _, err := models.SearchUsers(&models.SearchUserOptions{
  305. Type: models.UserTypeIndividual,
  306. OrderBy: models.SearchOrderByAlphabetically,
  307. PageSize: -1,
  308. })
  309. if err != nil {
  310. ctx.Error(500, "GetAllUsers", err)
  311. return
  312. }
  313. results := make([]*api.User, len(users))
  314. for i := range users {
  315. results[i] = convert.ToUser(users[i], ctx.IsSigned, ctx.User.IsAdmin)
  316. }
  317. ctx.JSON(200, &results)
  318. }