# HG changeset patch # User Guido Berhoerster # Date 1612306657 -3600 # Node ID d14d93d011d7974ef09b3aa04df15557aecdb99f # Parent 2b799ca75d96cc48a70814dffe14f52849a56b33 Show SASL mechanisms from before authentication in info output diff -r 2b799ca75d96 -r d14d93d011d7 cmd/sievemgr/info.go --- a/cmd/sievemgr/info.go Tue Feb 02 19:04:34 2021 +0100 +++ b/cmd/sievemgr/info.go Tue Feb 02 23:57:37 2021 +0100 @@ -22,8 +22,11 @@ package main import ( + "crypto/tls" "fmt" "net" + + "go.guido-berhoerster.org/managesieve" ) func init() { @@ -53,9 +56,31 @@ return err } - c, err := dialPlainAuth(acct) + // dialPlainAuth() is not used here so that SASL mechanisms can be + // determined before authentication + c, err := managesieve.Dial(net.JoinHostPort(acct.Host, acct.Port)) if err != nil { - return err + return fmt.Errorf("failed to connect: %s", err) + } + + // switch to a TLS connection except for localhost + if acct.Host != "localhost" && acct.Host != "127.0.0.1" && + acct.Host != "::1" { + tlsConf := &tls.Config{ + ServerName: acct.Host, + InsecureSkipVerify: acct.Insecure, + } + if err := c.StartTLS(tlsConf); err != nil { + return fmt.Errorf("failed to start TLS connection: %s", + err) + } + } + saslMechs := c.SASLMechanisms() + + auth := managesieve.PlainAuth("", acct.User, acct.Password, acct.Host) + if err := c.Authenticate(auth); err != nil { + return fmt.Errorf("failed to authenticate user %s: %s", + acct.User, err) } defer c.Logout() @@ -68,7 +93,7 @@ fmt.Println("STARTTLS supported") } fmt.Printf("SASL mechanisms:\n") - for _, m := range c.SASLMechanisms() { + for _, m := range saslMechs { fmt.Printf(" %s\n", m) } fmt.Printf("Extensions:\n")