From 23d2b7f2d654bf1bcc1ad252b8a96f992d0fe582 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 10 Nov 2021 13:57:15 +0100 Subject: [PATCH] Migrate to golang.org/x/crypto/ssh/terminal github.com/howeyc/gopass is unmaintained. --- cmd/hydroxide/main.go | 30 ++++++++++++++++++++++++------ go.mod | 1 + go.sum | 2 ++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/cmd/hydroxide/main.go b/cmd/hydroxide/main.go index 9b7aa17..0bb78f7 100644 --- a/cmd/hydroxide/main.go +++ b/cmd/hydroxide/main.go @@ -18,7 +18,8 @@ import ( imapserver "github.com/emersion/go-imap/server" "github.com/emersion/go-mbox" "github.com/emersion/go-smtp" - "github.com/howeyc/gopass" + "github.com/mattn/go-isatty" + "golang.org/x/crypto/ssh/terminal" "github.com/emersion/hydroxide/auth" "github.com/emersion/hydroxide/carddav" @@ -41,6 +42,23 @@ func newClient() *protonmail.Client { } } +func askPass() ([]byte, error) { + f := os.Stdin + if !isatty.IsTerminal(f.Fd()) { + // TODO: this assumes Unix + var err error + if f, err = os.Open("/dev/tty"); err != nil { + return nil, err + } + defer f.Close() + } + b, err := terminal.ReadPassword(int(f.Fd())) + if err == nil { + fmt.Fprintf(os.Stderr, "\n") + } + return b, err +} + func listenAndServeSMTP(addr string, debug bool, authManager *auth.Manager, tlsConfig *tls.Config) error { be := smtpbackend.New(authManager) s := smtp.NewServer(be) @@ -240,7 +258,7 @@ func main() { var loginPassword string if a == nil { fmt.Printf("Password: ") - if pass, err := gopass.GetPasswd(); err != nil { + if pass, err := askPass(); err != nil { log.Fatal(err) } else { loginPassword = string(pass) @@ -284,7 +302,7 @@ func main() { } else { fmt.Printf("Password: ") } - if pass, err := gopass.GetPasswd(); err != nil { + if pass, err := askPass(); err != nil { log.Fatal(err) } else { mailboxPassword = string(pass) @@ -340,7 +358,7 @@ func main() { var bridgePassword string fmt.Printf("Bridge password: ") - if pass, err := gopass.GetPasswd(); err != nil { + if pass, err := askPass(); err != nil { log.Fatal(err) } else { bridgePassword = string(pass) @@ -381,7 +399,7 @@ func main() { var bridgePassword string fmt.Printf("Bridge password: ") - if pass, err := gopass.GetPasswd(); err != nil { + if pass, err := askPass(); err != nil { log.Fatal(err) } else { bridgePassword = string(pass) @@ -426,7 +444,7 @@ func main() { var bridgePassword string fmt.Fprintf(os.Stderr, "Bridge password: ") - if pass, err := gopass.GetPasswd(); err != nil { + if pass, err := askPass(); err != nil { log.Fatal(err) } else { bridgePassword = string(pass) diff --git a/go.mod b/go.mod index effe073..d934846 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/emersion/go-vcard v0.0.0-20210521075357-3445b9171995 github.com/emersion/go-webdav v0.3.0 github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c + github.com/mattn/go-isatty v0.0.14 // indirect golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect diff --git a/go.sum b/go.sum index bd1887d..ff01412 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/emersion/go-webdav v0.3.0/go.mod h1:uSM1VveeKtogBVWaYccTksToczooJ0rrV github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c h1:aY2hhxLhjEAbfXOx2nRJxCXezC6CO2V/yN+OCr1srtk= github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=