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.

security_openid.go 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright 2018 The Gitea 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 setting
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/auth"
  8. "code.gitea.io/gitea/modules/auth/openid"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. )
  13. // OpenIDPost response for change user's openid
  14. func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) {
  15. ctx.Data["Title"] = ctx.Tr("settings")
  16. ctx.Data["PageIsSettingsSecurity"] = true
  17. if ctx.HasError() {
  18. openid, err := models.GetUserOpenIDs(ctx.User.ID)
  19. if err != nil {
  20. ctx.ServerError("GetUserOpenIDs", err)
  21. return
  22. }
  23. ctx.Data["OpenIDs"] = openid
  24. ctx.HTML(200, tplSettingsSecurity)
  25. return
  26. }
  27. // WARNING: specifying a wrong OpenID here could lock
  28. // a user out of her account, would be better to
  29. // verify/confirm the new OpenID before storing it
  30. // Also, consider allowing for multiple OpenID URIs
  31. id, err := openid.Normalize(form.Openid)
  32. if err != nil {
  33. ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form)
  34. return
  35. }
  36. form.Openid = id
  37. log.Trace("Normalized id: " + id)
  38. oids, err := models.GetUserOpenIDs(ctx.User.ID)
  39. if err != nil {
  40. ctx.ServerError("GetUserOpenIDs", err)
  41. return
  42. }
  43. ctx.Data["OpenIDs"] = oids
  44. // Check that the OpenID is not already used
  45. for _, obj := range oids {
  46. if obj.URI == id {
  47. ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsSecurity, &form)
  48. return
  49. }
  50. }
  51. redirectTo := setting.AppURL + "user/settings/security"
  52. url, err := openid.RedirectURL(id, redirectTo, setting.AppURL)
  53. if err != nil {
  54. ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form)
  55. return
  56. }
  57. ctx.Redirect(url)
  58. }
  59. func settingsOpenIDVerify(ctx *context.Context) {
  60. log.Trace("Incoming call to: " + ctx.Req.Request.URL.String())
  61. fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:]
  62. log.Trace("Full URL: " + fullURL)
  63. oids, err := models.GetUserOpenIDs(ctx.User.ID)
  64. if err != nil {
  65. ctx.ServerError("GetUserOpenIDs", err)
  66. return
  67. }
  68. ctx.Data["OpenIDs"] = oids
  69. id, err := openid.Verify(fullURL)
  70. if err != nil {
  71. ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &auth.AddOpenIDForm{
  72. Openid: id,
  73. })
  74. return
  75. }
  76. log.Trace("Verified ID: " + id)
  77. oid := &models.UserOpenID{UID: ctx.User.ID, URI: id}
  78. if err = models.AddUserOpenID(oid); err != nil {
  79. if models.IsErrOpenIDAlreadyUsed(err) {
  80. ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsSecurity, &auth.AddOpenIDForm{Openid: id})
  81. return
  82. }
  83. ctx.ServerError("AddUserOpenID", err)
  84. return
  85. }
  86. log.Trace("Associated OpenID %s to user %s", id, ctx.User.Name)
  87. ctx.Flash.Success(ctx.Tr("settings.add_openid_success"))
  88. ctx.Redirect(setting.AppSubURL + "/user/settings/security")
  89. }
  90. // DeleteOpenID response for delete user's openid
  91. func DeleteOpenID(ctx *context.Context) {
  92. if err := models.DeleteUserOpenID(&models.UserOpenID{ID: ctx.QueryInt64("id"), UID: ctx.User.ID}); err != nil {
  93. ctx.ServerError("DeleteUserOpenID", err)
  94. return
  95. }
  96. log.Trace("OpenID address deleted: %s", ctx.User.Name)
  97. ctx.Flash.Success(ctx.Tr("settings.openid_deletion_success"))
  98. ctx.JSON(200, map[string]interface{}{
  99. "redirect": setting.AppSubURL + "/user/settings/security",
  100. })
  101. }
  102. // ToggleOpenIDVisibility response for toggle visibility of user's openid
  103. func ToggleOpenIDVisibility(ctx *context.Context) {
  104. if err := models.ToggleUserOpenIDVisibility(ctx.QueryInt64("id")); err != nil {
  105. ctx.ServerError("ToggleUserOpenIDVisibility", err)
  106. return
  107. }
  108. ctx.Redirect(setting.AppSubURL + "/user/settings/security")
  109. }