annotate cmd/sievemgr/info.go @ 19:854167f55839

Fix SRV record lookup Do not use a configuration file default value for port in order to detect when it is not set by the user so that SRV record lookup is triggered. Depend on version 0.8.1 of go.guido-berhoerster.org/managesieve which contains an additional necessary fix.
author Guido Berhoerster <guido+sievemgr@berhoerster.name>
date Wed, 03 Feb 2021 13:34:44 +0100
parents d14d93d011d7
children fc5e6970a0d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
0cd5a454dfb4 Add README file
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 0
diff changeset
1 // Copyright (C) 2020 Guido Berhoerster <guido+sievemgr@berhoerster.name>
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
2 //
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
3 // Permission is hereby granted, free of charge, to any person obtaining
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
4 // a copy of this software and associated documentation files (the
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
5 // "Software"), to deal in the Software without restriction, including
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
6 // without limitation the rights to use, copy, modify, merge, publish,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
7 // distribute, sublicense, and/or sell copies of the Software, and to
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
8 // permit persons to whom the Software is furnished to do so, subject to
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
9 // the following conditions:
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
10 //
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
11 // The above copyright notice and this permission notice shall be included
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
12 // in all copies or substantial portions of the Software.
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
13 //
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
17 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
18 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
19 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
20 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
21
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
22 package main
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
23
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
24 import (
18
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
25 "crypto/tls"
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
26 "fmt"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
27 "net"
18
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
28
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
29 "go.guido-berhoerster.org/managesieve"
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
30 )
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
31
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
32 func init() {
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
33 cmdInfo.Flag.StringVar(&acctName, "a", "", "Select the account")
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
34 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
35
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
36 var cmdInfo = &command{
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
37 UsageLine: "info [options]",
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
38 Run: runInfo,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
39 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
40
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
41 func runInfo(cmd *command, args []string) error {
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
42 if len(args) != 0 {
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
43 return usageError("invalid number of arguments")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
44 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
45
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
46 acct, err := getAccount(&conf, acctName)
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
47 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
48 return err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
49 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
50
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
51 if err := lookupHostPort(acct); err != nil {
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
52 return err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
53 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
54
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
55 if err := readPassword(acct); err != nil {
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
56 return err
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
57 }
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
58
18
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
59 // dialPlainAuth() is not used here so that SASL mechanisms can be
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
60 // determined before authentication
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
61 c, err := managesieve.Dial(net.JoinHostPort(acct.Host, acct.Port))
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
62 if err != nil {
18
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
63 return fmt.Errorf("failed to connect: %s", err)
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
64 }
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
65
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
66 // switch to a TLS connection except for localhost
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
67 if acct.Host != "localhost" && acct.Host != "127.0.0.1" &&
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
68 acct.Host != "::1" {
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
69 tlsConf := &tls.Config{
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
70 ServerName: acct.Host,
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
71 InsecureSkipVerify: acct.Insecure,
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
72 }
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
73 if err := c.StartTLS(tlsConf); err != nil {
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
74 return fmt.Errorf("failed to start TLS connection: %s",
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
75 err)
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
76 }
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
77 }
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
78 saslMechs := c.SASLMechanisms()
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
79
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
80 auth := managesieve.PlainAuth("", acct.User, acct.Password, acct.Host)
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
81 if err := c.Authenticate(auth); err != nil {
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
82 return fmt.Errorf("failed to authenticate user %s: %s",
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
83 acct.User, err)
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
84 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
85 defer c.Logout()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
86
5
4dff4c3f0fbb Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 2
diff changeset
87 fmt.Printf("%s (%s)\n", net.JoinHostPort(acct.Host, acct.Port),
2
6db34a5344b8 Show server implementation in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 1
diff changeset
88 c.Implementation())
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
89 if c.SupportsRFC5804() {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
90 fmt.Println("RFC5804 supported")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
91 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
92 if c.SupportsTLS() {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
93 fmt.Println("STARTTLS supported")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
94 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
95 fmt.Printf("SASL mechanisms:\n")
18
d14d93d011d7 Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 5
diff changeset
96 for _, m := range saslMechs {
0
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
97 fmt.Printf(" %s\n", m)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
98 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
99 fmt.Printf("Extensions:\n")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
100 for _, e := range c.Extensions() {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
101 fmt.Printf(" %s\n", e)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
102 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
103 fmt.Printf("Notification methods:\n")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
104 for _, m := range c.NotifyMethods() {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
105 fmt.Printf(" %s\n", m)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
106 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
107
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
108 return nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
109 }