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

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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 user
  5. import (
  6. "net/url"
  7. "strings"
  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/mailer"
  13. "github.com/gogits/gogs/modules/middleware"
  14. )
  15. func SignIn(ctx *middleware.Context) {
  16. ctx.Data["Title"] = "Log In"
  17. if _, ok := ctx.Session.Get("socialId").(int64); ok {
  18. ctx.Data["IsSocialLogin"] = true
  19. ctx.HTML(200, "user/signin")
  20. return
  21. }
  22. if base.OauthService != nil {
  23. ctx.Data["OauthEnabled"] = true
  24. ctx.Data["OauthService"] = base.OauthService
  25. }
  26. // Check auto-login.
  27. userName := ctx.GetCookie(base.CookieUserName)
  28. if len(userName) == 0 {
  29. ctx.HTML(200, "user/signin")
  30. return
  31. }
  32. isSucceed := false
  33. defer func() {
  34. if !isSucceed {
  35. log.Trace("user.SignIn(auto-login cookie cleared): %s", userName)
  36. ctx.SetCookie(base.CookieUserName, "", -1)
  37. ctx.SetCookie(base.CookieRememberName, "", -1)
  38. return
  39. }
  40. }()
  41. user, err := models.GetUserByName(userName)
  42. if err != nil {
  43. ctx.HTML(500, "user/signin")
  44. return
  45. }
  46. secret := base.EncodeMd5(user.Rands + user.Passwd)
  47. value, _ := ctx.GetSecureCookie(secret, base.CookieRememberName)
  48. if value != user.Name {
  49. ctx.HTML(500, "user/signin")
  50. return
  51. }
  52. isSucceed = true
  53. ctx.Session.Set("userId", user.Id)
  54. ctx.Session.Set("userName", user.Name)
  55. if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 {
  56. ctx.SetCookie("redirect_to", "", -1)
  57. ctx.Redirect(redirectTo)
  58. return
  59. }
  60. ctx.Redirect("/")
  61. }
  62. func SignInPost(ctx *middleware.Context, form auth.LogInForm) {
  63. ctx.Data["Title"] = "Log In"
  64. sid, isOauth := ctx.Session.Get("socialId").(int64)
  65. if isOauth {
  66. ctx.Data["IsSocialLogin"] = true
  67. } else if base.OauthService != nil {
  68. ctx.Data["OauthEnabled"] = true
  69. ctx.Data["OauthService"] = base.OauthService
  70. }
  71. if ctx.HasError() {
  72. ctx.HTML(200, "user/signin")
  73. return
  74. }
  75. user, err := models.LoginUserPlain(form.UserName, form.Password)
  76. if err != nil {
  77. if err == models.ErrUserNotExist {
  78. log.Trace("%s Log in failed: %s/%s", ctx.Req.RequestURI, form.UserName, form.Password)
  79. ctx.RenderWithErr("Username or password is not correct", "user/signin", &form)
  80. return
  81. }
  82. ctx.Handle(500, "user.SignIn", err)
  83. return
  84. }
  85. if form.Remember == "on" {
  86. secret := base.EncodeMd5(user.Rands + user.Passwd)
  87. days := 86400 * base.LogInRememberDays
  88. ctx.SetCookie(base.CookieUserName, user.Name, days)
  89. ctx.SetSecureCookie(secret, base.CookieRememberName, user.Name, days)
  90. }
  91. // Bind with social account.
  92. if isOauth {
  93. if err = models.BindUserOauth2(user.Id, sid); err != nil {
  94. if err == models.ErrOauth2RecordNotExist {
  95. ctx.Handle(404, "user.SignInPost(GetOauth2ById)", err)
  96. } else {
  97. ctx.Handle(500, "user.SignInPost(GetOauth2ById)", err)
  98. }
  99. return
  100. }
  101. ctx.Session.Delete("socialId")
  102. log.Trace("%s OAuth binded: %s -> %d", ctx.Req.RequestURI, form.UserName, sid)
  103. }
  104. ctx.Session.Set("userId", user.Id)
  105. ctx.Session.Set("userName", user.Name)
  106. if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 {
  107. ctx.SetCookie("redirect_to", "", -1)
  108. ctx.Redirect(redirectTo)
  109. return
  110. }
  111. ctx.Redirect("/")
  112. }
  113. func oauthSignInPost(ctx *middleware.Context, sid int64) {
  114. ctx.Data["Title"] = "OAuth Sign Up"
  115. ctx.Data["PageIsSignUp"] = true
  116. if _, err := models.GetOauth2ById(sid); err != nil {
  117. if err == models.ErrOauth2RecordNotExist {
  118. ctx.Handle(404, "user.oauthSignUp(GetOauth2ById)", err)
  119. } else {
  120. ctx.Handle(500, "user.oauthSignUp(GetOauth2ById)", err)
  121. }
  122. return
  123. }
  124. ctx.Data["IsSocialLogin"] = true
  125. ctx.Data["username"] = ctx.Session.Get("socialName")
  126. ctx.Data["email"] = ctx.Session.Get("socialEmail")
  127. log.Trace("user.oauthSignUp(social ID): %v", ctx.Session.Get("socialId"))
  128. ctx.HTML(200, "user/signup")
  129. }
  130. func SignOut(ctx *middleware.Context) {
  131. ctx.Session.Delete("userId")
  132. ctx.Session.Delete("userName")
  133. ctx.Session.Delete("socialId")
  134. ctx.Session.Delete("socialName")
  135. ctx.Session.Delete("socialEmail")
  136. ctx.SetCookie(base.CookieUserName, "", -1)
  137. ctx.SetCookie(base.CookieRememberName, "", -1)
  138. ctx.Redirect("/")
  139. }
  140. func SignUp(ctx *middleware.Context) {
  141. ctx.Data["Title"] = "Sign Up"
  142. ctx.Data["PageIsSignUp"] = true
  143. if base.Service.DisableRegistration {
  144. ctx.Data["DisableRegistration"] = true
  145. ctx.HTML(200, "user/signup")
  146. return
  147. }
  148. if sid, ok := ctx.Session.Get("socialId").(int64); ok {
  149. oauthSignUp(ctx, sid)
  150. return
  151. }
  152. ctx.HTML(200, "user/signup")
  153. }
  154. func oauthSignUp(ctx *middleware.Context, sid int64) {
  155. ctx.Data["Title"] = "OAuth Sign Up"
  156. ctx.Data["PageIsSignUp"] = true
  157. if _, err := models.GetOauth2ById(sid); err != nil {
  158. if err == models.ErrOauth2RecordNotExist {
  159. ctx.Handle(404, "user.oauthSignUp(GetOauth2ById)", err)
  160. } else {
  161. ctx.Handle(500, "user.oauthSignUp(GetOauth2ById)", err)
  162. }
  163. return
  164. }
  165. ctx.Data["IsSocialLogin"] = true
  166. ctx.Data["username"] = strings.Replace(ctx.Session.Get("socialName").(string), " ", "", -1)
  167. ctx.Data["email"] = ctx.Session.Get("socialEmail")
  168. log.Trace("user.oauthSignUp(social ID): %v", ctx.Session.Get("socialId"))
  169. ctx.HTML(200, "user/signup")
  170. }
  171. func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) {
  172. ctx.Data["Title"] = "Sign Up"
  173. ctx.Data["PageIsSignUp"] = true
  174. if base.Service.DisableRegistration {
  175. ctx.Handle(403, "user.SignUpPost", nil)
  176. return
  177. }
  178. sid, isOauth := ctx.Session.Get("socialId").(int64)
  179. if isOauth {
  180. ctx.Data["IsSocialLogin"] = true
  181. }
  182. if form.Password != form.RetypePasswd {
  183. ctx.Data["HasError"] = true
  184. ctx.Data["Err_Password"] = true
  185. ctx.Data["Err_RetypePasswd"] = true
  186. ctx.Data["ErrorMsg"] = "Password and re-type password are not same"
  187. auth.AssignForm(form, ctx.Data)
  188. }
  189. if ctx.HasError() {
  190. ctx.HTML(200, "user/signup")
  191. return
  192. }
  193. u := &models.User{
  194. Name: form.UserName,
  195. Email: form.Email,
  196. Passwd: form.Password,
  197. IsActive: !base.Service.RegisterEmailConfirm || isOauth,
  198. }
  199. var err error
  200. if u, err = models.RegisterUser(u); err != nil {
  201. switch err {
  202. case models.ErrUserAlreadyExist:
  203. ctx.RenderWithErr("Username has been already taken", "user/signup", &form)
  204. case models.ErrEmailAlreadyUsed:
  205. ctx.RenderWithErr("E-mail address has been already used", "user/signup", &form)
  206. case models.ErrUserNameIllegal:
  207. ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), "user/signup", &form)
  208. default:
  209. ctx.Handle(500, "user.SignUp(RegisterUser)", err)
  210. }
  211. return
  212. }
  213. log.Trace("%s User created: %s", ctx.Req.RequestURI, form.UserName)
  214. // Bind social account.
  215. if isOauth {
  216. if err = models.BindUserOauth2(u.Id, sid); err != nil {
  217. ctx.Handle(500, "user.SignUp(BindUserOauth2)", err)
  218. return
  219. }
  220. ctx.Session.Delete("socialId")
  221. log.Trace("%s OAuth binded: %s -> %d", ctx.Req.RequestURI, form.UserName, sid)
  222. }
  223. // Send confirmation e-mail, no need for social account.
  224. if !isOauth && base.Service.RegisterEmailConfirm && u.Id > 1 {
  225. mailer.SendRegisterMail(ctx.Render, u)
  226. ctx.Data["IsSendRegisterMail"] = true
  227. ctx.Data["Email"] = u.Email
  228. ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
  229. ctx.HTML(200, "user/activate")
  230. if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
  231. log.Error("Set cache(MailResendLimit) fail: %v", err)
  232. }
  233. return
  234. }
  235. ctx.Redirect("/user/login")
  236. }
  237. func Delete(ctx *middleware.Context) {
  238. ctx.Data["Title"] = "Delete Account"
  239. ctx.Data["PageIsUserSetting"] = true
  240. ctx.Data["IsUserPageSettingDelete"] = true
  241. ctx.HTML(200, "user/delete")
  242. }
  243. func DeletePost(ctx *middleware.Context) {
  244. ctx.Data["Title"] = "Delete Account"
  245. ctx.Data["PageIsUserSetting"] = true
  246. ctx.Data["IsUserPageSettingDelete"] = true
  247. tmpUser := models.User{
  248. Passwd: ctx.Query("password"),
  249. Salt: ctx.User.Salt,
  250. }
  251. tmpUser.EncodePasswd()
  252. if tmpUser.Passwd != ctx.User.Passwd {
  253. ctx.Flash.Error("Password is not correct. Make sure you are owner of this account.")
  254. } else {
  255. if err := models.DeleteUser(ctx.User); err != nil {
  256. switch err {
  257. case models.ErrUserOwnRepos:
  258. ctx.Flash.Error("Your account still have ownership of repository, you have to delete or transfer them first.")
  259. default:
  260. ctx.Handle(500, "user.Delete", err)
  261. return
  262. }
  263. } else {
  264. ctx.Redirect("/")
  265. return
  266. }
  267. }
  268. ctx.Redirect("/user/delete")
  269. }
  270. func Activate(ctx *middleware.Context) {
  271. code := ctx.Query("code")
  272. if len(code) == 0 {
  273. ctx.Data["IsActivatePage"] = true
  274. if ctx.User.IsActive {
  275. ctx.Handle(404, "user.Activate", nil)
  276. return
  277. }
  278. // Resend confirmation e-mail.
  279. if base.Service.RegisterEmailConfirm {
  280. if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
  281. ctx.Data["ResendLimited"] = true
  282. } else {
  283. ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
  284. mailer.SendActiveMail(ctx.Render, ctx.User)
  285. if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
  286. log.Error("Set cache(MailResendLimit) fail: %v", err)
  287. }
  288. }
  289. } else {
  290. ctx.Data["ServiceNotEnabled"] = true
  291. }
  292. ctx.HTML(200, "user/activate")
  293. return
  294. }
  295. // Verify code.
  296. if user := models.VerifyUserActiveCode(code); user != nil {
  297. user.IsActive = true
  298. user.Rands = models.GetUserSalt()
  299. if err := models.UpdateUser(user); err != nil {
  300. ctx.Handle(404, "user.Activate", err)
  301. return
  302. }
  303. log.Trace("%s User activated: %s", ctx.Req.RequestURI, user.Name)
  304. ctx.Session.Set("userId", user.Id)
  305. ctx.Session.Set("userName", user.Name)
  306. ctx.Redirect("/")
  307. return
  308. }
  309. ctx.Data["IsActivateFailed"] = true
  310. ctx.HTML(200, "user/activate")
  311. }
  312. func ForgotPasswd(ctx *middleware.Context) {
  313. ctx.Data["Title"] = "Forgot Password"
  314. if base.MailService == nil {
  315. ctx.Data["IsResetDisable"] = true
  316. ctx.HTML(200, "user/forgot_passwd")
  317. return
  318. }
  319. ctx.Data["IsResetRequest"] = true
  320. ctx.HTML(200, "user/forgot_passwd")
  321. }
  322. func ForgotPasswdPost(ctx *middleware.Context) {
  323. ctx.Data["Title"] = "Forgot Password"
  324. if base.MailService == nil {
  325. ctx.Handle(403, "user.ForgotPasswdPost", nil)
  326. return
  327. }
  328. ctx.Data["IsResetRequest"] = true
  329. email := ctx.Query("email")
  330. u, err := models.GetUserByEmail(email)
  331. if err != nil {
  332. if err == models.ErrUserNotExist {
  333. ctx.RenderWithErr("This e-mail address does not associate to any account.", "user/forgot_passwd", nil)
  334. } else {
  335. ctx.Handle(500, "user.ResetPasswd(check existence)", err)
  336. }
  337. return
  338. }
  339. if ctx.Cache.IsExist("MailResendLimit_" + u.LowerName) {
  340. ctx.Data["ResendLimited"] = true
  341. ctx.HTML(200, "user/forgot_passwd")
  342. return
  343. }
  344. mailer.SendResetPasswdMail(ctx.Render, u)
  345. if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
  346. log.Error("Set cache(MailResendLimit) fail: %v", err)
  347. }
  348. ctx.Data["Email"] = email
  349. ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
  350. ctx.Data["IsResetSent"] = true
  351. ctx.HTML(200, "user/forgot_passwd")
  352. }
  353. func ResetPasswd(ctx *middleware.Context) {
  354. ctx.Data["Title"] = "Reset Password"
  355. code := ctx.Query("code")
  356. if len(code) == 0 {
  357. ctx.Error(404)
  358. return
  359. }
  360. ctx.Data["Code"] = code
  361. ctx.Data["IsResetForm"] = true
  362. ctx.HTML(200, "user/reset_passwd")
  363. }
  364. func ResetPasswdPost(ctx *middleware.Context) {
  365. ctx.Data["Title"] = "Reset Password"
  366. code := ctx.Query("code")
  367. if len(code) == 0 {
  368. ctx.Error(404)
  369. return
  370. }
  371. ctx.Data["Code"] = code
  372. if u := models.VerifyUserActiveCode(code); u != nil {
  373. // Validate password length.
  374. passwd := ctx.Query("passwd")
  375. if len(passwd) < 6 || len(passwd) > 30 {
  376. ctx.Data["IsResetForm"] = true
  377. ctx.RenderWithErr("Password length should be in 6 and 30.", "user/reset_passwd", nil)
  378. return
  379. }
  380. u.Passwd = passwd
  381. u.Rands = models.GetUserSalt()
  382. u.Salt = models.GetUserSalt()
  383. u.EncodePasswd()
  384. if err := models.UpdateUser(u); err != nil {
  385. ctx.Handle(500, "user.ResetPasswd(UpdateUser)", err)
  386. return
  387. }
  388. log.Trace("%s User password reset: %s", ctx.Req.RequestURI, u.Name)
  389. ctx.Redirect("/user/login")
  390. return
  391. }
  392. ctx.Data["IsResetFailed"] = true
  393. ctx.HTML(200, "user/reset_passwd")
  394. }