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.

users.go 7.6 kB

10 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
11 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. // Copyright 2014 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. "strings"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/auth"
  9. "code.gitea.io/gitea/modules/base"
  10. "code.gitea.io/gitea/modules/context"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/password"
  13. "code.gitea.io/gitea/modules/setting"
  14. "code.gitea.io/gitea/routers"
  15. "code.gitea.io/gitea/services/mailer"
  16. "github.com/unknwon/com"
  17. )
  18. const (
  19. tplUsers base.TplName = "admin/user/list"
  20. tplUserNew base.TplName = "admin/user/new"
  21. tplUserEdit base.TplName = "admin/user/edit"
  22. )
  23. // Users show all the users
  24. func Users(ctx *context.Context) {
  25. ctx.Data["Title"] = ctx.Tr("admin.users")
  26. ctx.Data["PageIsAdmin"] = true
  27. ctx.Data["PageIsAdminUsers"] = true
  28. routers.RenderUserSearch(ctx, &models.SearchUserOptions{
  29. Type: models.UserTypeIndividual,
  30. PageSize: setting.UI.Admin.UserPagingNum,
  31. SearchByEmail: true,
  32. }, tplUsers)
  33. }
  34. // NewUser render adding a new user page
  35. func NewUser(ctx *context.Context) {
  36. ctx.Data["Title"] = ctx.Tr("admin.users.new_account")
  37. ctx.Data["PageIsAdmin"] = true
  38. ctx.Data["PageIsAdminUsers"] = true
  39. ctx.Data["login_type"] = "0-0"
  40. sources, err := models.LoginSources()
  41. if err != nil {
  42. ctx.ServerError("LoginSources", err)
  43. return
  44. }
  45. ctx.Data["Sources"] = sources
  46. ctx.Data["CanSendEmail"] = setting.MailService != nil
  47. ctx.HTML(200, tplUserNew)
  48. }
  49. // NewUserPost response for adding a new user
  50. func NewUserPost(ctx *context.Context, form auth.AdminCreateUserForm) {
  51. ctx.Data["Title"] = ctx.Tr("admin.users.new_account")
  52. ctx.Data["PageIsAdmin"] = true
  53. ctx.Data["PageIsAdminUsers"] = true
  54. sources, err := models.LoginSources()
  55. if err != nil {
  56. ctx.ServerError("LoginSources", err)
  57. return
  58. }
  59. ctx.Data["Sources"] = sources
  60. ctx.Data["CanSendEmail"] = setting.MailService != nil
  61. if ctx.HasError() {
  62. ctx.HTML(200, tplUserNew)
  63. return
  64. }
  65. u := &models.User{
  66. Name: form.UserName,
  67. Email: form.Email,
  68. Passwd: form.Password,
  69. IsActive: true,
  70. LoginType: models.LoginPlain,
  71. }
  72. if len(form.LoginType) > 0 {
  73. fields := strings.Split(form.LoginType, "-")
  74. if len(fields) == 2 {
  75. u.LoginType = models.LoginType(com.StrTo(fields[0]).MustInt())
  76. u.LoginSource = com.StrTo(fields[1]).MustInt64()
  77. u.LoginName = form.LoginName
  78. }
  79. }
  80. if u.LoginType == models.LoginPlain {
  81. if !password.IsComplexEnough(form.Password) {
  82. ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserNew, &form)
  83. return
  84. }
  85. u.MustChangePassword = form.MustChangePassword
  86. }
  87. if err := models.CreateUser(u); err != nil {
  88. switch {
  89. case models.IsErrUserAlreadyExist(err):
  90. ctx.Data["Err_UserName"] = true
  91. ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplUserNew, &form)
  92. case models.IsErrEmailAlreadyUsed(err):
  93. ctx.Data["Err_Email"] = true
  94. ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserNew, &form)
  95. case models.IsErrNameReserved(err):
  96. ctx.Data["Err_UserName"] = true
  97. ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), tplUserNew, &form)
  98. case models.IsErrNamePatternNotAllowed(err):
  99. ctx.Data["Err_UserName"] = true
  100. ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tplUserNew, &form)
  101. default:
  102. ctx.ServerError("CreateUser", err)
  103. }
  104. return
  105. }
  106. log.Trace("Account created by admin (%s): %s", ctx.User.Name, u.Name)
  107. // Send email notification.
  108. if form.SendNotify {
  109. mailer.SendRegisterNotifyMail(ctx.Locale, u)
  110. }
  111. ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name))
  112. ctx.Redirect(setting.AppSubURL + "/admin/users/" + com.ToStr(u.ID))
  113. }
  114. func prepareUserInfo(ctx *context.Context) *models.User {
  115. u, err := models.GetUserByID(ctx.ParamsInt64(":userid"))
  116. if err != nil {
  117. ctx.ServerError("GetUserByID", err)
  118. return nil
  119. }
  120. ctx.Data["User"] = u
  121. if u.LoginSource > 0 {
  122. ctx.Data["LoginSource"], err = models.GetLoginSourceByID(u.LoginSource)
  123. if err != nil {
  124. ctx.ServerError("GetLoginSourceByID", err)
  125. return nil
  126. }
  127. } else {
  128. ctx.Data["LoginSource"] = &models.LoginSource{}
  129. }
  130. sources, err := models.LoginSources()
  131. if err != nil {
  132. ctx.ServerError("LoginSources", err)
  133. return nil
  134. }
  135. ctx.Data["Sources"] = sources
  136. return u
  137. }
  138. // EditUser show editting user page
  139. func EditUser(ctx *context.Context) {
  140. ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
  141. ctx.Data["PageIsAdmin"] = true
  142. ctx.Data["PageIsAdminUsers"] = true
  143. ctx.Data["DisableRegularOrgCreation"] = setting.Admin.DisableRegularOrgCreation
  144. prepareUserInfo(ctx)
  145. if ctx.Written() {
  146. return
  147. }
  148. ctx.HTML(200, tplUserEdit)
  149. }
  150. // EditUserPost response for editting user
  151. func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) {
  152. ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
  153. ctx.Data["PageIsAdmin"] = true
  154. ctx.Data["PageIsAdminUsers"] = true
  155. u := prepareUserInfo(ctx)
  156. if ctx.Written() {
  157. return
  158. }
  159. if ctx.HasError() {
  160. ctx.HTML(200, tplUserEdit)
  161. return
  162. }
  163. fields := strings.Split(form.LoginType, "-")
  164. if len(fields) == 2 {
  165. loginType := models.LoginType(com.StrTo(fields[0]).MustInt())
  166. loginSource := com.StrTo(fields[1]).MustInt64()
  167. if u.LoginSource != loginSource {
  168. u.LoginSource = loginSource
  169. u.LoginType = loginType
  170. }
  171. }
  172. if len(form.Password) > 0 {
  173. var err error
  174. if u.Salt, err = models.GetUserSalt(); err != nil {
  175. ctx.ServerError("UpdateUser", err)
  176. return
  177. }
  178. if !password.IsComplexEnough(form.Password) {
  179. ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserEdit, &form)
  180. return
  181. }
  182. u.HashPassword(form.Password)
  183. }
  184. u.LoginName = form.LoginName
  185. u.FullName = form.FullName
  186. u.Email = form.Email
  187. u.Website = form.Website
  188. u.Location = form.Location
  189. u.MaxRepoCreation = form.MaxRepoCreation
  190. u.IsActive = form.Active
  191. u.IsAdmin = form.Admin
  192. u.AllowGitHook = form.AllowGitHook
  193. u.AllowImportLocal = form.AllowImportLocal
  194. u.AllowCreateOrganization = form.AllowCreateOrganization
  195. u.ProhibitLogin = form.ProhibitLogin
  196. if err := models.UpdateUser(u); err != nil {
  197. if models.IsErrEmailAlreadyUsed(err) {
  198. ctx.Data["Err_Email"] = true
  199. ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserEdit, &form)
  200. } else {
  201. ctx.ServerError("UpdateUser", err)
  202. }
  203. return
  204. }
  205. log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name)
  206. ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success"))
  207. ctx.Redirect(setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"))
  208. }
  209. // DeleteUser response for deleting a user
  210. func DeleteUser(ctx *context.Context) {
  211. u, err := models.GetUserByID(ctx.ParamsInt64(":userid"))
  212. if err != nil {
  213. ctx.ServerError("GetUserByID", err)
  214. return
  215. }
  216. if err = models.DeleteUser(u); err != nil {
  217. switch {
  218. case models.IsErrUserOwnRepos(err):
  219. ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo"))
  220. ctx.JSON(200, map[string]interface{}{
  221. "redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"),
  222. })
  223. case models.IsErrUserHasOrgs(err):
  224. ctx.Flash.Error(ctx.Tr("admin.users.still_has_org"))
  225. ctx.JSON(200, map[string]interface{}{
  226. "redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"),
  227. })
  228. default:
  229. ctx.ServerError("DeleteUser", err)
  230. }
  231. return
  232. }
  233. log.Trace("Account deleted by admin (%s): %s", ctx.User.Name, u.Name)
  234. ctx.Flash.Success(ctx.Tr("admin.users.deletion_success"))
  235. ctx.JSON(200, map[string]interface{}{
  236. "redirect": setting.AppSubURL + "/admin/users",
  237. })
  238. }