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

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