Mercurial > projects > sievemgr
annotate cmd/sievemgr/info.go @ 22:fc5e6970a0d5 default tip
Add support for specifying an authorization identity on the command line
author | Guido Berhoerster <guido+sievemgr@berhoerster.name> |
---|---|
date | Wed, 17 Feb 2021 07:50:55 +0100 |
parents | d14d93d011d7 |
children |
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") |
22
fc5e6970a0d5
Add support for specifying an authorization identity on the command line
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
18
diff
changeset
|
34 cmdInfo.Flag.StringVar(&authzID, "A", "", "Specify the authorization identity") |
0
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 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
37 var cmdInfo = &command{ |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
38 UsageLine: "info [options]", |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
39 Run: runInfo, |
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 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
42 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
|
43 if len(args) != 0 { |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
44 return usageError("invalid number of arguments") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
45 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
46 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
47 acct, err := getAccount(&conf, acctName) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
48 if err != nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
49 return err |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
50 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
51 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
52 if err := lookupHostPort(acct); err != nil { |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
53 return err |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
54 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
55 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
56 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
|
57 return err |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
58 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
59 |
18
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
60 // 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
|
61 // determined before authentication |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
62 c, err := managesieve.Dial(net.JoinHostPort(acct.Host, acct.Port)) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
63 if err != nil { |
18
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
64 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
|
65 } |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
66 |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
67 // 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
|
68 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
|
69 acct.Host != "::1" { |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
70 tlsConf := &tls.Config{ |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
71 ServerName: acct.Host, |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
72 InsecureSkipVerify: acct.Insecure, |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
73 } |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
74 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
|
75 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
|
76 err) |
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 } |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
79 saslMechs := c.SASLMechanisms() |
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
80 |
22
fc5e6970a0d5
Add support for specifying an authorization identity on the command line
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
18
diff
changeset
|
81 auth := managesieve.PlainAuth(authzID, acct.User, acct.Password, acct.Host) |
18
d14d93d011d7
Show SASL mechanisms from before authentication in info output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
5
diff
changeset
|
82 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
|
83 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
|
84 acct.User, err) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
85 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
86 defer c.Logout() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
87 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
2
diff
changeset
|
88 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
|
89 c.Implementation()) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
90 if c.SupportsRFC5804() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
91 fmt.Println("RFC5804 supported") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
92 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
93 if c.SupportsTLS() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
94 fmt.Println("STARTTLS supported") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
95 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
96 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
|
97 for _, m := range saslMechs { |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
98 fmt.Printf(" %s\n", m) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
99 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
100 fmt.Printf("Extensions:\n") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
101 for _, e := range c.Extensions() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
102 fmt.Printf(" %s\n", e) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
103 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
104 fmt.Printf("Notification methods:\n") |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
105 for _, m := range c.NotifyMethods() { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
106 fmt.Printf(" %s\n", m) |
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 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
109 return nil |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
110 } |