From d5d0e2945b2cfae0ced30c362eefc9d6731103c3 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 17 Mar 2017 01:10:08 +0100 Subject: [PATCH 1/9] Rework SSH key management UI to add GPG --- modules/auth/user_form.go | 7 +- routers/repo/setting.go | 2 +- routers/routes/routes.go | 8 +- routers/user/setting.go | 109 +++++++++++------- .../user/settings/{sshkeys.tmpl => keys.tmpl} | 62 +++++++++- templates/user/settings/navbar.tmpl | 2 +- 6 files changed, 140 insertions(+), 50 deletions(-) rename templates/user/settings/{sshkeys.tmpl => keys.tmpl} (56%) diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 2f767d4c8cf58..9e19c78a456fb 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -163,14 +163,15 @@ func (f *AddOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) bind return validate(errs, ctx.Data, f, ctx.Locale) } -// AddSSHKeyForm form for adding SSH key -type AddSSHKeyForm struct { +// AddKeyForm form for adding SSH/GPG key +type AddKeyForm struct { + Type string `binding:"OmitEmpty"` Title string `binding:"Required;MaxSize(50)"` Content string `binding:"Required"` } // Validate validates the fields -func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { +func (f *AddKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } diff --git a/routers/repo/setting.go b/routers/repo/setting.go index ed7254fe1b544..b2cb73cf98fbe 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -664,7 +664,7 @@ func DeployKeys(ctx *context.Context) { } // DeployKeysPost response for adding a deploy key of a repository -func DeployKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { +func DeployKeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") ctx.Data["PageIsSettingsKeys"] = true diff --git a/routers/routes/routes.go b/routers/routes/routes.go index a28473c0e473f..0920ef03b2368 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -214,9 +214,9 @@ func RegisterRoutes(m *macaron.Macaron) { }) } - m.Combo("/ssh").Get(user.SettingsSSHKeys). - Post(bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost) - m.Post("/ssh/delete", user.DeleteSSHKey) + m.Combo("/keys").Get(user.SettingsKeys). + Post(bindIgnErr(auth.AddKeyForm{}), user.SettingsKeysPost) + m.Post("/keys/delete", user.DeleteKey) m.Combo("/applications").Get(user.SettingsApplications). Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) m.Post("/applications/delete", user.SettingsDeleteApplication) @@ -438,7 +438,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/keys", func() { m.Combo("").Get(repo.DeployKeys). - Post(bindIgnErr(auth.AddSSHKeyForm{}), repo.DeployKeysPost) + Post(bindIgnErr(auth.AddKeyForm{}), repo.DeployKeysPost) m.Post("/delete", repo.DeleteDeployKey) }) diff --git a/routers/user/setting.go b/routers/user/setting.go index 622f45f2c6881..45345007ca862 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -32,7 +32,7 @@ const ( tplSettingsAvatar base.TplName = "user/settings/avatar" tplSettingsPassword base.TplName = "user/settings/password" tplSettingsEmails base.TplName = "user/settings/email" - tplSettingsSSHKeys base.TplName = "user/settings/sshkeys" + tplSettingsKeys base.TplName = "user/settings/keys" tplSettingsSocial base.TplName = "user/settings/social" tplSettingsApplications base.TplName = "user/settings/applications" tplSettingsTwofa base.TplName = "user/settings/twofa" @@ -320,10 +320,10 @@ func DeleteEmail(ctx *context.Context) { }) } -// SettingsSSHKeys render user's SSH public keys page -func SettingsSSHKeys(ctx *context.Context) { +// SettingsKeys render user's SSH/GPG public keys page +func SettingsKeys(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") - ctx.Data["PageIsSettingsSSHKeys"] = true + ctx.Data["PageIsSettingsKeys"] = true keys, err := models.ListPublicKeys(ctx.User.ID) if err != nil { @@ -332,13 +332,20 @@ func SettingsSSHKeys(ctx *context.Context) { } ctx.Data["Keys"] = keys - ctx.HTML(200, tplSettingsSSHKeys) + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.Handle(500, "ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys + + ctx.HTML(200, tplSettingsKeys) } -// SettingsSSHKeysPost response for change user's SSH keys -func SettingsSSHKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { +// SettingsKeysPost response for change user's SSH/GPG keys +func SettingsKeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("settings") - ctx.Data["PageIsSettingsSSHKeys"] = true + ctx.Data["PageIsSettingsKeys"] = true keys, err := models.ListPublicKeys(ctx.User.ID) if err != nil { @@ -347,51 +354,73 @@ func SettingsSSHKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { } ctx.Data["Keys"] = keys + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.Handle(500, "ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys + if ctx.HasError() { - ctx.HTML(200, tplSettingsSSHKeys) + ctx.HTML(200, tplSettingsKeys) return } + switch form.Type { + case "gpg": + //TODO + ctx.Flash.Warning("Function not implemented") + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + case "ssh": + content, err := models.CheckPublicKeyString(form.Content) + if err != nil { + if models.IsErrKeyUnableVerify(err) { + ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) + } else { + ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + return + } + } - content, err := models.CheckPublicKeyString(form.Content) - if err != nil { - if models.IsErrKeyUnableVerify(err) { - ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) - } else { - ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) - ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") + if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content); err != nil { + ctx.Data["HasError"] = true + switch { + case models.IsErrKeyAlreadyExist(err): + ctx.Data["Err_Content"] = true + ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form) + case models.IsErrKeyNameAlreadyUsed(err): + ctx.Data["Err_Title"] = true + ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form) + default: + ctx.Handle(500, "AddPublicKey", err) + } return } - } + ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") - if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content); err != nil { - ctx.Data["HasError"] = true - switch { - case models.IsErrKeyAlreadyExist(err): - ctx.Data["Err_Content"] = true - ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsSSHKeys, &form) - case models.IsErrKeyNameAlreadyUsed(err): - ctx.Data["Err_Title"] = true - ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsSSHKeys, &form) - default: - ctx.Handle(500, "AddPublicKey", err) - } - return + default: + ctx.Flash.Warning("Function not implemented") + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") } - ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) - ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") } -// DeleteSSHKey response for delete user's SSH key -func DeleteSSHKey(ctx *context.Context) { - if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil { - ctx.Flash.Error("DeletePublicKey: " + err.Error()) - } else { - ctx.Flash.Success(ctx.Tr("settings.ssh_key_deletion_success")) - } +// DeleteKey response for delete user's SSH/GPG key +func DeleteKey(ctx *context.Context) { + switch ctx.Query("type") { + case "gpg": + //TODO + case "ssh": + if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil { + ctx.Flash.Error("DeletePublicKey: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.ssh_key_deletion_success")) + } + } ctx.JSON(200, map[string]interface{}{ - "redirect": setting.AppSubURL + "/user/settings/ssh", + "redirect": setting.AppSubURL + "/user/settings/keys", }) } diff --git a/templates/user/settings/sshkeys.tmpl b/templates/user/settings/keys.tmpl similarity index 56% rename from templates/user/settings/sshkeys.tmpl rename to templates/user/settings/keys.tmpl index 7942afde41b02..1de1f6ee35103 100644 --- a/templates/user/settings/sshkeys.tmpl +++ b/templates/user/settings/keys.tmpl @@ -17,7 +17,7 @@ {{range .Keys}}
-
@@ -52,6 +52,66 @@
+ + + + + +
+

+ Manage GPG Keys +
+
{{.i18n.Tr "settings.add_key"}}
+
+

+
+
+
+ This is a list of GPG keys associated with your account. Because these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them. +
+ {{range .GPGKeys}} +
+
+ +
+
+ +
+
+ {{range .Emails}}{{.Email}} {{end}} +
+ {{.KeyID}} +
+
+ {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} +
+
+
+ +
+
+ {{end}} +
+
+
+

TODO

+
+

+ Add GPG Key +

+ {{range .GPGKeys}} -
-
- -
-
- -
-
- {{range .Emails}}{{.Email}} {{end}} -
- {{.KeyID}} -
-
- {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} +
+
+ +
+ +
+ {{range .Emails}}{{.Email}} {{end}} +
+ {{$.i18n.Tr "settings.key_id"}}: {{.KeyID}} + {{$.i18n.Tr "settings.subkeys"}}: {{range .SubsKey}} {{.KeyID}} {{end}} +
+
+ {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} + - + {{$.i18n.Tr "settings.end_on"}} {{DateFmtShort .Expired}} +
-
-
- -
{{end}}
From 106738b6d45bfda11a244b33c793c9337f87f1d8 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 4 Apr 2017 17:24:15 +0200 Subject: [PATCH 3/9] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13d5302945969..0ff4b3c01ed8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * BREAKING * Password reset URL changed from `/user/forget_password` to `/user/forgot_password` + * SSH keys management URL changed from `/user/settings/ssh` to `/user/settings/keys` + ## [1.1.0](https://github.com/go-gitea/gitea/releases/tag/v1.1.0) - 2017-03-09 From f9f4607dc7c328bc85a4b1540557ca9ddb60ba6a Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 19 Apr 2017 02:50:27 +0200 Subject: [PATCH 4/9] Implement deletion UI --- public/js/index.js | 6 +++++- routers/user/setting.go | 6 +++++- templates/user/settings/keys.tmpl | 20 ++++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/public/js/index.js b/public/js/index.js index e139d16748a94..9b48c24cd3daa 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1408,7 +1408,11 @@ $(document).ready(function () { // Helpers. $('.delete-button').click(function () { var $this = $(this); - $('.delete.modal').modal({ + var filter = ""; + if ($this.attr("id")) { + filter += "#"+$this.attr("id") + } + $('.delete.modal'+filter).modal({ closable: false, onApprove: function () { if ($this.data('type') == "form") { diff --git a/routers/user/setting.go b/routers/user/setting.go index 45345007ca862..c0a78b216f42c 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -411,7 +411,11 @@ func DeleteKey(ctx *context.Context) { switch ctx.Query("type") { case "gpg": - //TODO + if err := models.DeleteGPGKey(ctx.User, ctx.QueryInt64("id")); err != nil { + ctx.Flash.Error("DeleteGPGKey: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.gpg_key_deletion_success")) + } case "ssh": if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil { ctx.Flash.Error("DeletePublicKey: " + err.Error()) diff --git a/templates/user/settings/keys.tmpl b/templates/user/settings/keys.tmpl index b606a97678fcc..7e14f3a4fb235 100644 --- a/templates/user/settings/keys.tmpl +++ b/templates/user/settings/keys.tmpl @@ -17,7 +17,7 @@ {{range .Keys}}
-
@@ -74,7 +74,7 @@ {{range .GPGKeys}}
-
@@ -96,7 +96,7 @@

-

TODO

+

{{.i18n.Tr "settings.gpg_helper" "https://help.github.com/articles/about-gpg/" | Str2html}}

Add GPG Key @@ -119,7 +119,7 @@

-

{{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}

-
+

{{.i18n.Tr "settings.add_new_key"}}

@@ -97,7 +97,7 @@

{{.i18n.Tr "settings.gpg_helper" "https://help.github.com/articles/about-gpg/" | Str2html}}

-
+

Add GPG Key

diff --git a/templates/user/settings/navbar.tmpl b/templates/user/settings/navbar.tmpl index 444afbbd1b400..4aac9effb5fa6 100644 --- a/templates/user/settings/navbar.tmpl +++ b/templates/user/settings/navbar.tmpl @@ -17,7 +17,7 @@ {{end}} - {{.i18n.Tr "settings.ssh_keys"}} + {{.i18n.Tr "settings.ssh_gpg_keys"}} {{.i18n.Tr "settings.applications"}} From 68a553384b478ed822c261ce3a5cbc256af5e82c Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 19 Apr 2017 04:42:25 +0200 Subject: [PATCH 6/9] Various fixes - Fix duplicate entry in locale - Re-generate hash before verification since they are consumed --- models/gpg_key.go | 29 +++++++++++++++++++---------- options/locale/locale_en-US.ini | 1 - 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/models/gpg_key.go b/models/gpg_key.go index 447ebee7f81d0..586da47dd5872 100644 --- a/models/gpg_key.go +++ b/models/gpg_key.go @@ -400,17 +400,16 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification { } } - //Generating hash of commit - hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload)) - if err != nil { //Skipping ailed to generate hash - log.Error(3, "PopulateHash: %v", err) - return &CommitVerification{ - Verified: false, - Reason: "gpg.error.generate_hash", - } - } - for _, k := range keys { + //Generating hash of commit + hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload)) + if err != nil { //Skipping ailed to generate hash + log.Error(3, "PopulateHash: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.generate_hash", + } + } //We get PK if err := verifySign(sig, hash, k); err == nil { return &CommitVerification{ //Everything is ok @@ -422,6 +421,16 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification { } //And test also SubsKey for _, sk := range k.SubsKey { + + //Generating hash of commit + hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload)) + if err != nil { //Skipping ailed to generate hash + log.Error(3, "PopulateHash: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.generate_hash", + } + } if err := verifySign(sig, hash, sk); err == nil { return &CommitVerification{ //Everything is ok Verified: true, diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 0204335ba10aa..48ec17258d614 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1373,7 +1373,6 @@ mark_as_unread = Mark as unread error.extract_sign = Failed to extract signature error.generate_hash = Failed to generate hash of commit error.no_committer_account = No account linked to committer email -error.no_gpg_keys_found = "Failed to retrieve publics keys of committer" error.no_gpg_keys_found = "No known key found for this signature in database" error.not_signed_commit = "Not a signed commit" error.failed_retrieval_gpg_keys = "Failed to retrieve any key attached to the commiter account" From 6801a414de5becf72bbbb21e7b014a68290eb7fd Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 19 Apr 2017 05:02:02 +0200 Subject: [PATCH 7/9] Add missing translation --- options/locale/locale_en-US.ini | 4 ++++ templates/user/settings/keys.tmpl | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 48ec17258d614..2e20abcfedfee 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -350,11 +350,14 @@ keep_email_private_popup = Your email address will be hidden from other users if openid_desc = Your OpenID addresses will let you delegate authentication to your provider of choice manage_ssh_keys = Manage SSH Keys +manage_gpg_keys = Manage GPG Keys add_key = Add Key ssh_desc = This is a list of SSH keys associated with your account. Because these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them. +gpg_desc = This is a list of GPG keys associated with your account. Because these keys allow verification of commit, it is highly important that you keep safe the corresponding private key. ssh_helper = Don't know how? Check out GitHub's guide to create your own SSH keys or solve common problems you might encounter using SSH. gpg_helper = Don't know how? Check out GitHub's guide about GPG. add_new_key = Add SSH Key +add_new_gpg_key = Add GPG Key ssh_key_been_used = Public key content has already been used. ssh_key_name_used = Public key with same name already exists. gpg_key_id_used = Public GPG key with same id already exists. @@ -372,6 +375,7 @@ gpg_key_deletion_desc = Delete this GPG key will disable all commit verification ssh_key_deletion_success = SSH key has been deleted successfully! gpg_key_deletion_success = GPG key has been deleted successfully! add_on = Added on +valid_until = Valid until last_used = Last used on no_activity = No recent activity key_state_desc = This key is used in last 7 days diff --git a/templates/user/settings/keys.tmpl b/templates/user/settings/keys.tmpl index 614e0edeff9db..e37f1a058e036 100644 --- a/templates/user/settings/keys.tmpl +++ b/templates/user/settings/keys.tmpl @@ -61,7 +61,7 @@

- Manage GPG Keys + {{.i18n.Tr "settings.manage_gpg_keys"}}
{{.i18n.Tr "settings.add_key"}}
@@ -69,7 +69,7 @@
- This is a list of GPG keys associated with your account. Because these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them. + {{.i18n.Tr "settings.gpg_desc"}}
{{range .GPGKeys}}
@@ -88,7 +88,7 @@
{{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} - - {{$.i18n.Tr "settings.end_on"}} {{DateFmtShort .Expired}} + {{$.i18n.Tr "settings.valid_until"}} {{DateFmtShort .Expired}}
@@ -99,7 +99,7 @@

{{.i18n.Tr "settings.gpg_helper" "https://help.github.com/articles/about-gpg/" | Str2html}}

- Add GPG Key + {{.i18n.Tr "settings.add_new_gpg_key"}}

From 47eb429f3d54eff1bce995e7aeeff2c416648fd8 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 21 Apr 2017 01:31:13 +0200 Subject: [PATCH 8/9] Split template --- templates/user/settings/keys.tmpl | 136 +------------------------- templates/user/settings/keys_gpg.tmpl | 67 +++++++++++++ templates/user/settings/keys_ssh.tmpl | 67 +++++++++++++ 3 files changed, 136 insertions(+), 134 deletions(-) create mode 100644 templates/user/settings/keys_gpg.tmpl create mode 100644 templates/user/settings/keys_ssh.tmpl diff --git a/templates/user/settings/keys.tmpl b/templates/user/settings/keys.tmpl index e37f1a058e036..86d2204eb1690 100644 --- a/templates/user/settings/keys.tmpl +++ b/templates/user/settings/keys.tmpl @@ -3,142 +3,10 @@ {{template "user/settings/navbar" .}}
{{template "base/alert" .}} -

- {{.i18n.Tr "settings.manage_ssh_keys"}} -
-
{{.i18n.Tr "settings.add_key"}}
-
-

-
-
-
- {{.i18n.Tr "settings.ssh_desc"}} -
- {{range .Keys}} -
-
- -
- -
- {{.Name}} -
- {{.Fingerprint}} -
-
- {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Created}} {{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFmtShort .Updated}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}} -
-
-
- {{end}} -
-
+ {{template "user/settings/keys_ssh" .}}
-

{{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}

-
-

- {{.i18n.Tr "settings.add_new_key"}} -

-
- - {{.CsrfTokenHtml}} -
- - -
-
- - -
- - - -
-
-
-

- {{.i18n.Tr "settings.manage_gpg_keys"}} -
-
{{.i18n.Tr "settings.add_key"}}
-
-

-
-
-
- {{.i18n.Tr "settings.gpg_desc"}} -
- {{range .GPGKeys}} -
-
- -
- -
- {{range .Emails}}{{.Email}} {{end}} -
- {{$.i18n.Tr "settings.key_id"}}: {{.KeyID}} - {{$.i18n.Tr "settings.subkeys"}}: {{range .SubsKey}} {{.KeyID}} {{end}} -
-
- {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} - - - {{$.i18n.Tr "settings.valid_until"}} {{DateFmtShort .Expired}} -
-
-
- {{end}} -
-
-
-

{{.i18n.Tr "settings.gpg_helper" "https://help.github.com/articles/about-gpg/" | Str2html}}

-
-

- {{.i18n.Tr "settings.add_new_gpg_key"}} -

-
-
- {{.CsrfTokenHtml}} - -
- - -
- - -
-
-
-
-
- - - - {{template "base/footer" .}} diff --git a/templates/user/settings/keys_gpg.tmpl b/templates/user/settings/keys_gpg.tmpl new file mode 100644 index 0000000000000..b0c3e1bda71d8 --- /dev/null +++ b/templates/user/settings/keys_gpg.tmpl @@ -0,0 +1,67 @@ +

+ {{.i18n.Tr "settings.manage_gpg_keys"}} +
+
{{.i18n.Tr "settings.add_key"}}
+
+

+
+
+
+ {{.i18n.Tr "settings.gpg_desc"}} +
+ {{range .GPGKeys}} +
+
+ +
+ +
+ {{range .Emails}}{{.Email}} {{end}} +
+ {{$.i18n.Tr "settings.key_id"}}: {{.KeyID}} + {{$.i18n.Tr "settings.subkeys"}}: {{range .SubsKey}} {{.KeyID}} {{end}} +
+
+ {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Added}} + - + {{$.i18n.Tr "settings.valid_until"}} {{DateFmtShort .Expired}} +
+
+
+ {{end}} +
+
+
+

{{.i18n.Tr "settings.gpg_helper" "https://help.github.com/articles/about-gpg/" | Str2html}}

+
+

+ {{.i18n.Tr "settings.add_new_gpg_key"}} +

+
+
+ {{.CsrfTokenHtml}} + +
+ + +
+ + +
+
+
+ + diff --git a/templates/user/settings/keys_ssh.tmpl b/templates/user/settings/keys_ssh.tmpl new file mode 100644 index 0000000000000..1bdf0b15b19cc --- /dev/null +++ b/templates/user/settings/keys_ssh.tmpl @@ -0,0 +1,67 @@ +

+ {{.i18n.Tr "settings.manage_ssh_keys"}} +
+
{{.i18n.Tr "settings.add_key"}}
+
+

+
+
+
+ {{.i18n.Tr "settings.ssh_desc"}} +
+ {{range .Keys}} +
+
+ +
+ +
+ {{.Name}} +
+ {{.Fingerprint}} +
+
+ {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Created}} {{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFmtShort .Updated}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}} +
+
+
+ {{end}} +
+
+
+

{{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}

+
+

+ {{.i18n.Tr "settings.add_new_key"}} +

+
+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+ + +
+
+
+ + From 8b63db49fbd9b1a7e03a19231f841e5e173987be Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 21 Apr 2017 01:53:59 +0200 Subject: [PATCH 9/9] Catch not found/verified email error --- models/error.go | 15 +++++++++++++++ models/gpg_key.go | 2 +- options/locale/locale_en-US.ini | 1 + routers/user/setting.go | 3 +++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/models/error.go b/models/error.go index 04bec8043e744..404939c58a9ff 100644 --- a/models/error.go +++ b/models/error.go @@ -260,6 +260,21 @@ func (err ErrKeyNameAlreadyUsed) Error() string { return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name) } +// ErrGPGEmailNotFound represents a "ErrGPGEmailNotFound" kind of error. +type ErrGPGEmailNotFound struct { + Email string +} + +// IsErrGPGEmailNotFound checks if an error is a ErrGPGEmailNotFound. +func IsErrGPGEmailNotFound(err error) bool { + _, ok := err.(ErrGPGEmailNotFound) + return ok +} + +func (err ErrGPGEmailNotFound) Error() string { + return fmt.Sprintf("failed to found email or is not confirmed : %s", err.Email) +} + // ErrGPGKeyParsing represents a "ErrGPGKeyParsing" kind of error. type ErrGPGKeyParsing struct { ParseError error diff --git a/models/gpg_key.go b/models/gpg_key.go index 586da47dd5872..862bd88596433 100644 --- a/models/gpg_key.go +++ b/models/gpg_key.go @@ -219,7 +219,7 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) { } } if emails[n] == nil { - return nil, fmt.Errorf("Failed to found email or is not confirmed : %s", ident.UserId.Email) + return nil, ErrGPGEmailNotFound{ident.UserId.Email} } n++ } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 2e20abcfedfee..160f8e7ab1041 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -361,6 +361,7 @@ add_new_gpg_key = Add GPG Key ssh_key_been_used = Public key content has already been used. ssh_key_name_used = Public key with same name already exists. gpg_key_id_used = Public GPG key with same id already exists. +gpg_key_email_not_found = The email attached to the GPG key couldn't be found or is not yet confirmed: %s subkeys = Subkeys key_id = Key ID key_name = Key Name diff --git a/routers/user/setting.go b/routers/user/setting.go index 718eeeea6290b..4fff19ef630c7 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -377,6 +377,9 @@ func SettingsKeysPost(ctx *context.Context, form auth.AddKeyForm) { case models.IsErrGPGKeyIDAlreadyUsed(err): ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form) + case models.IsErrGPGEmailNotFound(err): + ctx.Data["Err_Content"] = true + ctx.RenderWithErr(ctx.Tr("settings.gpg_key_email_not_found", err.(models.ErrGPGEmailNotFound).Email), tplSettingsKeys, &form) default: ctx.Handle(500, "AddPublicKey", err) }