about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRay Ganardi <ray@ganardi.xyz>2020-05-19 13:06:47 +0200
committerDrew DeVault <sir@cmpwn.com>2020-05-25 09:30:20 -0400
commitc32ab765a7cfecab7a30b2c6a50d43ba69036850 (patch)
treee827cf0e08282957d508ee55946cd53c1e9cb1cd
parent58db517c8d79c7fd8897d8ab5d5cf9c2de67a071 (diff)
downloadaerc-c32ab765a7cfecab7a30b2c6a50d43ba69036850.tar.gz
feat(pgp): Add <ESC> to cancel password prompt
Previously there was no way to cancel the password prompt.
-rw-r--r--widgets/aerc.go18
-rw-r--r--widgets/getpasswd.go11
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 <ESC> 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)
 		}