From c32ab765a7cfecab7a30b2c6a50d43ba69036850 Mon Sep 17 00:00:00 2001 From: Ray Ganardi Date: Tue, 19 May 2020 13:06:47 +0200 Subject: [PATCH] feat(pgp): Add to cancel password prompt Previously there was no way to cancel the password prompt. --- widgets/aerc.go | 18 +++++++++++------- widgets/getpasswd.go | 11 ++++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/widgets/aerc.go b/widgets/aerc.go index 23b8901..273777b 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -537,11 +537,11 @@ func (aerc *Aerc) CloseBackends() error { return returnErr } -func (aerc *Aerc) GetPassword(title string, prompt string, cb func(string)) { - aerc.getpasswd = NewGetPasswd(title, prompt, func(pw string) { +func (aerc *Aerc) GetPassword(title string, prompt string, cb func(string, error)) { + aerc.getpasswd = NewGetPasswd(title, prompt, func(pw string, err error) { aerc.getpasswd = nil aerc.Invalidate() - cb(pw) + cb(pw, err) }) aerc.getpasswd.OnInvalidate(func(_ ui.Drawable) { aerc.Invalidate() @@ -553,7 +553,7 @@ func (aerc *Aerc) Initialize(ui *ui.UI) { aerc.ui = ui } -func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) ([]byte, error) { +func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) (b []byte, err error) { // HACK HACK HACK for _, key := range keys { var ident *openpgp.Identity @@ -561,14 +561,18 @@ func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) ([]byte, error break } aerc.GetPassword("Decrypt PGP private key", - fmt.Sprintf("Enter password for %s (%8X)", + fmt.Sprintf("Enter password for %s (%8X)\nPress to cancel", ident.Name, key.PublicKey.KeyId), - func(pass string) { + func(pass string, e error) { + if e != nil { + err = e + return + } key.PrivateKey.Decrypt([]byte(pass)) }) for aerc.getpasswd != nil { aerc.ui.Tick() } } - return nil, nil + return nil, err } diff --git a/widgets/getpasswd.go b/widgets/getpasswd.go index 08702c5..34f8b1f 100644 --- a/widgets/getpasswd.go +++ b/widgets/getpasswd.go @@ -1,6 +1,8 @@ package widgets import ( + "fmt" + "github.com/gdamore/tcell" "git.sr.ht/~sircmpwn/aerc/lib/ui" @@ -8,13 +10,13 @@ import ( type GetPasswd struct { ui.Invalidatable - callback func(string) + callback func(string, error) title string prompt string input *ui.TextInput } -func NewGetPasswd(title string, prompt string, cb func(string)) *GetPasswd { +func NewGetPasswd(title string, prompt string, cb func(string, error)) *GetPasswd { getpasswd := &GetPasswd{ callback: cb, title: title, @@ -46,7 +48,10 @@ func (gp *GetPasswd) Event(event tcell.Event) bool { switch event.Key() { case tcell.KeyEnter: gp.input.Focus(false) - gp.callback(gp.input.String()) + gp.callback(gp.input.String(), nil) + case tcell.KeyEsc: + gp.input.Focus(false) + gp.callback("", fmt.Errorf("no password provided")) default: gp.input.Event(event) }