Compare commits

...

21 Commits

Author SHA1 Message Date
Zane Dufour 2e500a7277
Merge b34a3b489a into 15fced74e9 2024-04-24 23:02:50 -04:00
Zane Dufour b34a3b489a
Revert "simplify askBridgePass"
This reverts commit 58c4f7ccdf.

fix askBridgePass
2024-04-24 23:01:47 -04:00
Zane Dufour 58c4f7ccdf
simplify askBridgePass 2024-04-24 22:59:55 -04:00
Zane Dufour 6c42a4b880
remove standalone askPass 2024-04-24 22:59:21 -04:00
Zane Dufour c94f85fe81
remove pre-commit and unnecessary loginPassword = string(...) 2024-04-24 22:56:18 -04:00
Zane Dufour b3646b68af
replace auth env vars with stdin pipes 2024-04-24 22:51:51 -04:00
Zane Dufour 55e62c0f81
Merge branch 'master' into add-auth-options 2024-04-24 22:38:25 -04:00
Zane Dufour a22c706ebb
implement `hydroxide auth` environment variables 2024-04-05 13:52:22 -04:00
Zane Dufour b423ac8046
revert go version changes 2024-04-05 11:21:08 -04:00
Zane Dufour cc9ae54f26
remove outdated go versions from test matrix 2024-04-05 10:56:35 -04:00
Zane Dufour aac7b6fbd7
bump go to 1.17 (older versions no longer build anyways) 2024-04-05 10:55:51 -04:00
Zane Dufour 6cde350cfd
fail-fast: false 2024-04-05 10:52:32 -04:00
Zane Dufour f2cea97508
test with up to 1.21 2024-04-05 10:48:57 -04:00
Zane Dufour 14a9f55857
switch go build order to put 1.18 at the top 2024-04-05 10:48:37 -04:00
Zane Dufour 64eb6ab154
fix go build invocation 2024-04-05 10:44:55 -04:00
Zane Dufour 649b3e8cba
runs-on ubuntu-latest 2024-04-05 10:44:05 -04:00
Zane Dufour 4829d10cc4
add run name to try to trigger build 2024-04-05 10:42:25 -04:00
Zane Dufour 0f87464470
fix build.yml schema 2024-04-05 10:40:38 -04:00
Zane Dufour a1ed722160
add github workflow to test with old go versions 2024-04-05 10:31:52 -04:00
Zane Dufour 49ba8e0745
add gofumpt 2024-04-05 03:03:22 -04:00
Zane Dufour 0f9867c905
add -password and -2fa-auth to hydroxide auth, and pre-commit hooks for golangci-lint 2024-04-05 02:49:28 -04:00
1 changed files with 56 additions and 42 deletions

View File

@ -48,31 +48,47 @@ func newClient() *protonmail.Client {
}
}
func askPass(prompt string) ([]byte, error) {
f := os.Stdin
if !term.IsTerminal(int(f.Fd())) {
// This can happen if stdin is used for piping data
// TODO: the following assumes Unix
var err error
if f, err = os.Open("/dev/tty"); err != nil {
return nil, err
type Prompter struct {
scanner *bufio.Scanner
}
func newPrompter() *Prompter {
if !term.IsTerminal(int(os.Stdin.Fd())) {
return &Prompter{
scanner: bufio.NewScanner(os.Stdin),
}
defer f.Close()
}
return &Prompter{}
}
func (r *Prompter) askPass(prompt string) (string, error) {
if r.scanner != nil {
fmt.Fprintf(os.Stderr, "Warning: Reading password from stdin.\nk")
if !r.scanner.Scan() {
if err := r.scanner.Err(); err != nil {
return "", err
}
return "", io.ErrUnexpectedEOF
}
password := r.scanner.Text()
if len(password) == 0 {
return password, fmt.Errorf("zero length password")
}
return password, nil
}
fmt.Fprintf(os.Stderr, "%v: ", prompt)
b, err := term.ReadPassword(int(f.Fd()))
b, err := term.ReadPassword(int(os.Stdin.Fd()))
if err == nil {
fmt.Fprintf(os.Stderr, "\n")
}
return b, err
return string(b), err
}
func askBridgePass() (string, error) {
if v := os.Getenv("HYDROXIDE_BRIDGE_PASS"); v != "" {
return v, nil
}
b, err := askPass("Bridge password")
return string(b), err
return newPrompter().askPass("Bridge password")
}
func listenAndServeSMTP(addr string, debug bool, authManager *auth.Manager, tlsConfig *tls.Config) error {
@ -262,7 +278,9 @@ func main() {
cmd := flag.Arg(0)
switch cmd {
case "auth":
authCmd.Parse(flag.Args()[1:])
if err := authCmd.Parse(flag.Args()[1:]); err != nil {
log.Fatal(err)
}
username := authCmd.Arg(0)
if username == "" {
log.Fatal("usage: hydroxide auth <username>")
@ -279,41 +297,37 @@ func main() {
log.Fatal(err)
}
}*/
prompter := newPrompter()
loginPassword, err := prompter.askPass("Password")
if err != nil {
log.Fatal(err)
}
var loginPassword string
if a == nil {
if pass, err := askPass("Password"); err != nil {
log.Fatal(err)
} else {
loginPassword = string(pass)
authInfo, err := c.AuthInfo(username)
if err != nil {
log.Fatal(err)
}
a, err = c.Auth(username, loginPassword, authInfo)
if err != nil {
log.Fatal(err)
}
if a.TwoFactor.Enabled != 0 {
if a.TwoFactor.TOTP != 1 {
log.Fatal("Only TOTP is supported as a 2FA method")
}
authInfo, err := c.AuthInfo(username)
code, err := prompter.askPass("2FA TOTP code")
if err != nil {
log.Fatal(err)
}
a, err = c.Auth(username, loginPassword, authInfo)
scope, err := c.AuthTOTP(code)
if err != nil {
log.Fatal(err)
}
if a.TwoFactor.Enabled != 0 {
if a.TwoFactor.TOTP != 1 {
log.Fatal("Only TOTP is supported as a 2FA method")
}
scanner := bufio.NewScanner(os.Stdin)
fmt.Printf("2FA TOTP code: ")
scanner.Scan()
code := scanner.Text()
scope, err := c.AuthTOTP(code)
if err != nil {
log.Fatal(err)
}
a.Scope = scope
}
a.Scope = scope
}
var mailboxPassword string
@ -325,10 +339,10 @@ func main() {
if a.PasswordMode == protonmail.PasswordTwo {
prompt = "Mailbox password"
}
if pass, err := askPass(prompt); err != nil {
mailboxPassword, err = prompter.askPass(prompt)
if err != nil {
log.Fatal(err)
} else {
mailboxPassword = string(pass)
}
}