user.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. "github.com/go-martini/martini"
  8. "github.com/gogits/gogs/models"
  9. "github.com/gogits/gogs/modules/auth"
  10. "github.com/gogits/gogs/modules/base"
  11. "github.com/gogits/gogs/modules/log"
  12. "github.com/gogits/gogs/modules/middleware"
  13. )
  14. const (
  15. USER_NEW base.TplName = "admin/user/new"
  16. USER_EDIT base.TplName = "admin/user/edit"
  17. )
  18. func NewUser(ctx *middleware.Context) {
  19. ctx.Data["Title"] = "New Account"
  20. ctx.Data["PageIsUsers"] = true
  21. auths, err := models.GetAuths()
  22. if err != nil {
  23. ctx.Handle(500, "admin.user.NewUser(GetAuths)", err)
  24. return
  25. }
  26. ctx.Data["LoginSources"] = auths
  27. ctx.HTML(200, USER_NEW)
  28. }
  29. func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) {
  30. ctx.Data["Title"] = "New Account"
  31. ctx.Data["PageIsUsers"] = true
  32. if ctx.HasError() {
  33. ctx.HTML(200, USER_NEW)
  34. return
  35. }
  36. if form.Password != form.RetypePasswd {
  37. ctx.Data["Err_Password"] = true
  38. ctx.Data["Err_RetypePasswd"] = true
  39. ctx.RenderWithErr("Password and re-type password are not same.", "admin/users/new", &form)
  40. return
  41. }
  42. u := &models.User{
  43. Name: form.UserName,
  44. Email: form.Email,
  45. Passwd: form.Password,
  46. IsActive: true,
  47. LoginType: models.PLAIN,
  48. }
  49. if len(form.LoginType) > 0 {
  50. // NOTE: need rewrite.
  51. fields := strings.Split(form.LoginType, "-")
  52. tp, _ := base.StrTo(fields[0]).Int()
  53. u.LoginType = models.LoginType(tp)
  54. u.LoginSource, _ = base.StrTo(fields[1]).Int64()
  55. u.LoginName = form.LoginName
  56. }
  57. var err error
  58. if u, err = models.CreateUser(u); err != nil {
  59. switch err {
  60. case models.ErrUserAlreadyExist:
  61. ctx.RenderWithErr("Username has been already taken", USER_NEW, &form)
  62. case models.ErrEmailAlreadyUsed:
  63. ctx.RenderWithErr("E-mail address has been already used", USER_NEW, &form)
  64. case models.ErrUserNameIllegal:
  65. ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), USER_NEW, &form)
  66. default:
  67. ctx.Handle(500, "admin.user.NewUser(CreateUser)", err)
  68. }
  69. return
  70. }
  71. log.Trace("%s User created by admin(%s): %s", ctx.Req.RequestURI,
  72. ctx.User.LowerName, strings.ToLower(form.UserName))
  73. ctx.Redirect("/admin/users")
  74. }
  75. func EditUser(ctx *middleware.Context, params martini.Params) {
  76. ctx.Data["Title"] = "Edit Account"
  77. ctx.Data["PageIsUsers"] = true
  78. uid, err := base.StrTo(params["userid"]).Int()
  79. if err != nil {
  80. ctx.Handle(404, "admin.user.EditUser", err)
  81. return
  82. }
  83. u, err := models.GetUserById(int64(uid))
  84. if err != nil {
  85. ctx.Handle(500, "admin.user.EditUser(GetUserById)", err)
  86. return
  87. }
  88. ctx.Data["User"] = u
  89. auths, err := models.GetAuths()
  90. if err != nil {
  91. ctx.Handle(500, "admin.user.NewUser(GetAuths)", err)
  92. return
  93. }
  94. ctx.Data["LoginSources"] = auths
  95. ctx.HTML(200, USER_EDIT)
  96. }
  97. func EditUserPost(ctx *middleware.Context, params martini.Params, form auth.AdminEditUserForm) {
  98. ctx.Data["Title"] = "Edit Account"
  99. ctx.Data["PageIsUsers"] = true
  100. uid, err := base.StrTo(params["userid"]).Int()
  101. if err != nil {
  102. ctx.Handle(404, "admin.user.EditUserPost", err)
  103. return
  104. }
  105. u, err := models.GetUserById(int64(uid))
  106. if err != nil {
  107. ctx.Handle(500, "admin.user.EditUserPost(GetUserById)", err)
  108. return
  109. }
  110. if ctx.HasError() {
  111. ctx.HTML(200, USER_EDIT)
  112. return
  113. }
  114. if (form.Passwd != "") {
  115. u.Passwd = form.Passwd
  116. u.Rands = models.GetUserSalt()
  117. u.Salt = models.GetUserSalt()
  118. u.EncodePasswd()
  119. }
  120. u.Email = form.Email
  121. u.Website = form.Website
  122. u.Location = form.Location
  123. u.Avatar = base.EncodeMd5(form.Avatar)
  124. u.AvatarEmail = form.Avatar
  125. u.IsActive = form.Active
  126. u.IsAdmin = form.Admin
  127. if err := models.UpdateUser(u); err != nil {
  128. ctx.Handle(500, "admin.user.EditUserPost(UpdateUser)", err)
  129. return
  130. }
  131. log.Trace("%s User profile updated by admin(%s): %s", ctx.Req.RequestURI,
  132. ctx.User.LowerName, ctx.User.LowerName)
  133. ctx.Data["User"] = u
  134. ctx.Flash.Success("Account profile has been successfully updated.")
  135. ctx.Redirect("/admin/users/" + params["userid"])
  136. }
  137. func DeleteUser(ctx *middleware.Context, params martini.Params) {
  138. ctx.Data["Title"] = "Delete Account"
  139. ctx.Data["PageIsUsers"] = true
  140. //log.Info("delete")
  141. uid, err := base.StrTo(params["userid"]).Int()
  142. if err != nil {
  143. ctx.Handle(404, "admin.user.DeleteUser", err)
  144. return
  145. }
  146. u, err := models.GetUserById(int64(uid))
  147. if err != nil {
  148. ctx.Handle(500, "admin.user.DeleteUser(GetUserById)", err)
  149. return
  150. }
  151. if err = models.DeleteUser(u); err != nil {
  152. switch err {
  153. case models.ErrUserOwnRepos:
  154. ctx.Flash.Error("This account still has ownership of repository, owner has to delete or transfer them first.")
  155. ctx.Redirect("/admin/users/" + params["userid"])
  156. default:
  157. ctx.Handle(500, "admin.user.DeleteUser", err)
  158. }
  159. return
  160. }
  161. log.Trace("%s User deleted by admin(%s): %s", ctx.Req.RequestURI,
  162. ctx.User.LowerName, ctx.User.LowerName)
  163. ctx.Redirect("/admin/users")
  164. }