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 8.1 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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.LoginNoType || u.LoginType == models.LoginPlain {
  81. if len(form.Password) < setting.MinPasswordLength {
  82. ctx.Data["Err_Password"] = true
  83. ctx.RenderWithErr(ctx.Tr("auth.password_too_short", setting.MinPasswordLength), tplUserNew, &form)
  84. return
  85. }
  86. if !password.IsComplexEnough(form.Password) {
  87. ctx.Data["Err_Password"] = true
  88. ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserNew, &form)
  89. return
  90. }
  91. u.MustChangePassword = form.MustChangePassword
  92. }
  93. if err := models.CreateUser(u); err != nil {
  94. switch {
  95. case models.IsErrUserAlreadyExist(err):
  96. ctx.Data["Err_UserName"] = true
  97. ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplUserNew, &form)
  98. case models.IsErrEmailAlreadyUsed(err):
  99. ctx.Data["Err_Email"] = true
  100. ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserNew, &form)
  101. case models.IsErrNameReserved(err):
  102. ctx.Data["Err_UserName"] = true
  103. ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), tplUserNew, &form)
  104. case models.IsErrNamePatternNotAllowed(err):
  105. ctx.Data["Err_UserName"] = true
  106. ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tplUserNew, &form)
  107. default:
  108. ctx.ServerError("CreateUser", err)
  109. }
  110. return
  111. }
  112. log.Trace("Account created by admin (%s): %s", ctx.User.Name, u.Name)
  113. // Send email notification.
  114. if form.SendNotify {
  115. mailer.SendRegisterNotifyMail(ctx.Locale, u)
  116. }
  117. ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name))
  118. ctx.Redirect(setting.AppSubURL + "/admin/users/" + com.ToStr(u.ID))
  119. }
  120. func prepareUserInfo(ctx *context.Context) *models.User {
  121. u, err := models.GetUserByID(ctx.ParamsInt64(":userid"))
  122. if err != nil {
  123. ctx.ServerError("GetUserByID", err)
  124. return nil
  125. }
  126. ctx.Data["User"] = u
  127. if u.LoginSource > 0 {
  128. ctx.Data["LoginSource"], err = models.GetLoginSourceByID(u.LoginSource)
  129. if err != nil {
  130. ctx.ServerError("GetLoginSourceByID", err)
  131. return nil
  132. }
  133. } else {
  134. ctx.Data["LoginSource"] = &models.LoginSource{}
  135. }
  136. sources, err := models.LoginSources()
  137. if err != nil {
  138. ctx.ServerError("LoginSources", err)
  139. return nil
  140. }
  141. ctx.Data["Sources"] = sources
  142. return u
  143. }
  144. // EditUser show editting user page
  145. func EditUser(ctx *context.Context) {
  146. ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
  147. ctx.Data["PageIsAdmin"] = true
  148. ctx.Data["PageIsAdminUsers"] = true
  149. ctx.Data["DisableRegularOrgCreation"] = setting.Admin.DisableRegularOrgCreation
  150. prepareUserInfo(ctx)
  151. if ctx.Written() {
  152. return
  153. }
  154. ctx.HTML(200, tplUserEdit)
  155. }
  156. // EditUserPost response for editting user
  157. func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) {
  158. ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
  159. ctx.Data["PageIsAdmin"] = true
  160. ctx.Data["PageIsAdminUsers"] = true
  161. u := prepareUserInfo(ctx)
  162. if ctx.Written() {
  163. return
  164. }
  165. if ctx.HasError() {
  166. ctx.HTML(200, tplUserEdit)
  167. return
  168. }
  169. fields := strings.Split(form.LoginType, "-")
  170. if len(fields) == 2 {
  171. loginType := models.LoginType(com.StrTo(fields[0]).MustInt())
  172. loginSource := com.StrTo(fields[1]).MustInt64()
  173. if u.LoginSource != loginSource {
  174. u.LoginSource = loginSource
  175. u.LoginType = loginType
  176. }
  177. }
  178. if len(form.Password) > 0 {
  179. var err error
  180. if len(form.Password) < setting.MinPasswordLength {
  181. ctx.Data["Err_Password"] = true
  182. ctx.RenderWithErr(ctx.Tr("auth.password_too_short", setting.MinPasswordLength), tplUserEdit, &form)
  183. return
  184. }
  185. if !password.IsComplexEnough(form.Password) {
  186. ctx.RenderWithErr(password.BuildComplexityError(ctx), tplUserEdit, &form)
  187. return
  188. }
  189. if u.Salt, err = models.GetUserSalt(); err != nil {
  190. ctx.ServerError("UpdateUser", err)
  191. return
  192. }
  193. u.HashPassword(form.Password)
  194. }
  195. u.LoginName = form.LoginName
  196. u.FullName = form.FullName
  197. u.Email = form.Email
  198. u.Website = form.Website
  199. u.Location = form.Location
  200. u.MaxRepoCreation = form.MaxRepoCreation
  201. u.IsActive = form.Active
  202. u.IsAdmin = form.Admin
  203. u.AllowGitHook = form.AllowGitHook
  204. u.AllowImportLocal = form.AllowImportLocal
  205. u.AllowCreateOrganization = form.AllowCreateOrganization
  206. u.ProhibitLogin = form.ProhibitLogin
  207. if err := models.UpdateUser(u); err != nil {
  208. if models.IsErrEmailAlreadyUsed(err) {
  209. ctx.Data["Err_Email"] = true
  210. ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserEdit, &form)
  211. } else {
  212. ctx.ServerError("UpdateUser", err)
  213. }
  214. return
  215. }
  216. log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name)
  217. ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success"))
  218. ctx.Redirect(setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"))
  219. }
  220. // DeleteUser response for deleting a user
  221. func DeleteUser(ctx *context.Context) {
  222. u, err := models.GetUserByID(ctx.ParamsInt64(":userid"))
  223. if err != nil {
  224. ctx.ServerError("GetUserByID", err)
  225. return
  226. }
  227. if err = models.DeleteUser(u); err != nil {
  228. switch {
  229. case models.IsErrUserOwnRepos(err):
  230. ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo"))
  231. ctx.JSON(200, map[string]interface{}{
  232. "redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"),
  233. })
  234. case models.IsErrUserHasOrgs(err):
  235. ctx.Flash.Error(ctx.Tr("admin.users.still_has_org"))
  236. ctx.JSON(200, map[string]interface{}{
  237. "redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"),
  238. })
  239. default:
  240. ctx.ServerError("DeleteUser", err)
  241. }
  242. return
  243. }
  244. log.Trace("Account deleted by admin (%s): %s", ctx.User.Name, u.Name)
  245. ctx.Flash.Success(ctx.Tr("admin.users.deletion_success"))
  246. ctx.JSON(200, map[string]interface{}{
  247. "redirect": setting.AppSubURL + "/admin/users",
  248. })
  249. }