You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

keys.go 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2018 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package setting
  6. import (
  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/setting"
  12. )
  13. const (
  14. tplSettingsKeys base.TplName = "user/settings/keys"
  15. )
  16. // Keys render user's SSH/GPG public keys page
  17. func Keys(ctx *context.Context) {
  18. ctx.Data["Title"] = ctx.Tr("settings")
  19. ctx.Data["PageIsSettingsKeys"] = true
  20. ctx.Data["DisableSSH"] = setting.SSH.Disabled
  21. loadKeysData(ctx)
  22. ctx.HTML(200, tplSettingsKeys)
  23. }
  24. // KeysPost response for change user's SSH/GPG keys
  25. func KeysPost(ctx *context.Context, form auth.AddKeyForm) {
  26. ctx.Data["Title"] = ctx.Tr("settings")
  27. ctx.Data["PageIsSettingsKeys"] = true
  28. if ctx.HasError() {
  29. loadKeysData(ctx)
  30. ctx.HTML(200, tplSettingsKeys)
  31. return
  32. }
  33. switch form.Type {
  34. case "gpg":
  35. key, err := models.AddGPGKey(ctx.User.ID, form.Content)
  36. if err != nil {
  37. ctx.Data["HasGPGError"] = true
  38. switch {
  39. case models.IsErrGPGKeyParsing(err):
  40. ctx.Flash.Error(ctx.Tr("form.invalid_gpg_key", err.Error()))
  41. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  42. case models.IsErrGPGKeyIDAlreadyUsed(err):
  43. loadKeysData(ctx)
  44. ctx.Data["Err_Content"] = true
  45. ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form)
  46. case models.IsErrGPGNoEmailFound(err):
  47. loadKeysData(ctx)
  48. ctx.Data["Err_Content"] = true
  49. ctx.RenderWithErr(ctx.Tr("settings.gpg_no_key_email_found"), tplSettingsKeys, &form)
  50. default:
  51. ctx.ServerError("AddPublicKey", err)
  52. }
  53. return
  54. }
  55. ctx.Flash.Success(ctx.Tr("settings.add_gpg_key_success", key.KeyID))
  56. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  57. case "ssh":
  58. content, err := models.CheckPublicKeyString(form.Content)
  59. if err != nil {
  60. if models.IsErrSSHDisabled(err) {
  61. ctx.Flash.Info(ctx.Tr("settings.ssh_disabled"))
  62. } else if models.IsErrKeyUnableVerify(err) {
  63. ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key"))
  64. } else {
  65. ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error()))
  66. }
  67. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  68. return
  69. }
  70. if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content, 0); err != nil {
  71. ctx.Data["HasSSHError"] = true
  72. switch {
  73. case models.IsErrKeyAlreadyExist(err):
  74. loadKeysData(ctx)
  75. ctx.Data["Err_Content"] = true
  76. ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form)
  77. case models.IsErrKeyNameAlreadyUsed(err):
  78. loadKeysData(ctx)
  79. ctx.Data["Err_Title"] = true
  80. ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form)
  81. default:
  82. ctx.ServerError("AddPublicKey", err)
  83. }
  84. return
  85. }
  86. ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title))
  87. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  88. default:
  89. ctx.Flash.Warning("Function not implemented")
  90. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  91. }
  92. }
  93. // DeleteKey response for delete user's SSH/GPG key
  94. func DeleteKey(ctx *context.Context) {
  95. switch ctx.Query("type") {
  96. case "gpg":
  97. if err := models.DeleteGPGKey(ctx.User, ctx.QueryInt64("id")); err != nil {
  98. ctx.Flash.Error("DeleteGPGKey: " + err.Error())
  99. } else {
  100. ctx.Flash.Success(ctx.Tr("settings.gpg_key_deletion_success"))
  101. }
  102. case "ssh":
  103. if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil {
  104. ctx.Flash.Error("DeletePublicKey: " + err.Error())
  105. } else {
  106. ctx.Flash.Success(ctx.Tr("settings.ssh_key_deletion_success"))
  107. }
  108. default:
  109. ctx.Flash.Warning("Function not implemented")
  110. ctx.Redirect(setting.AppSubURL + "/user/settings/keys")
  111. }
  112. ctx.JSON(200, map[string]interface{}{
  113. "redirect": setting.AppSubURL + "/user/settings/keys",
  114. })
  115. }
  116. func loadKeysData(ctx *context.Context) {
  117. keys, err := models.ListPublicKeys(ctx.User.ID)
  118. if err != nil {
  119. ctx.ServerError("ListPublicKeys", err)
  120. return
  121. }
  122. ctx.Data["Keys"] = keys
  123. gpgkeys, err := models.ListGPGKeys(ctx.User.ID)
  124. if err != nil {
  125. ctx.ServerError("ListGPGKeys", err)
  126. return
  127. }
  128. ctx.Data["GPGKeys"] = gpgkeys
  129. }