annotate cmd/sievemgr/common.go @ 3:3cd182bff992

Show warning messages in put output
author Guido Berhoerster <guido+sievemgr@berhoerster.name>
date Tue, 27 Oct 2020 17:54:58 +0100
parents 0cd5a454dfb4
children 4dff4c3f0fbb
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 (
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
25 "bufio"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
26 "crypto/tls"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
27 "errors"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
28 "fmt"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
29 "io"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
30 "io/ioutil"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
31 "net"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
32 "os"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
33 "os/user"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
34 "runtime"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
35 "strings"
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 "go.guido-berhoerster.org/managesieve"
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
38 "golang.org/x/crypto/ssh/terminal"
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 var errTooBig = errors.New("too big")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
42
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
43 func parseHostPort(s string) (string, string, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
44 var host string
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
45 host, port, err := net.SplitHostPort(s)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
46 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
47 // error may be due to a missing port but there is no usable
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
48 // error value to test for, thus try again with a port added
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
49 var tmpErr error
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
50 host, _, tmpErr = net.SplitHostPort(s + ":4190")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
51 if tmpErr != nil {
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 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
55 if port == "" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
56 // no port given, try to look up a SRV record for given domain
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
57 // and fall back to the domain and port 4190
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
58 services, err := managesieve.LookupService(host)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
59 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
60 return "", "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
61 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
62 host, port, err = net.SplitHostPort(services[0])
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
63 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
64 return "", "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
65 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
66 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
67 return host, port, nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
68 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
69
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
70 func readPassword() (string, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
71 var tty *os.File
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
72 var fd int
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
73 var w io.Writer
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
74 if runtime.GOOS == "windows" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
75 fd = int(os.Stdin.Fd())
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
76 w = os.Stdout
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
77 } else {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
78 var err error
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
79 tty, err = os.OpenFile("/dev/tty", os.O_RDWR, 0666)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
80 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
81 return "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
82 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
83 defer tty.Close()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
84 fd = int(tty.Fd())
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
85 w = tty
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
86 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
87
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
88 io.WriteString(w, "Password: ")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
89 rawPassword, err := terminal.ReadPassword(fd)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
90 io.WriteString(w, "\n")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
91 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
92 return "", fmt.Errorf("failed to read password: %s", err)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
93 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
94 password := string(rawPassword)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
95 if password == "" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
96 return "", fmt.Errorf("invalid password")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
97 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
98 return password, nil
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
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
101 func readPasswordFile(filename string) (string, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
102 f, err := os.Open(filename)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
103 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
104 return "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
105 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
106 defer f.Close()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
107 scanner := bufio.NewScanner(f)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
108 if !scanner.Scan() {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
109 err := scanner.Err()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
110 if err == nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
111 err = fmt.Errorf("failed to read from %q: unexpected EOF",
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
112 filename)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
113 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
114 return "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
115 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
116 password := scanner.Text()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
117 if password == "" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
118 return "", fmt.Errorf("invalid password")
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
119 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
120 return password, nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
121 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
122
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
123 func usernamePassword(host, port, username, passwordFile string) (string, string, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
124 // fall back to the system username
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
125 if username == "" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
126 u, err := user.Current()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
127 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
128 return "", "",
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
129 fmt.Errorf("failed to obtain username: %s", err)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
130 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
131 username = u.Username
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
132 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
133
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
134 var password string
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
135 var err error
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
136 if passwordFile != "" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
137 password, err = readPasswordFile(passwordFilename)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
138 } else {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
139 password, err = readPassword()
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
140 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
141 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
142 return "", "", err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
143 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
144
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
145 return username, password, nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
146 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
147
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
148 func dialPlainAuth(hostport, username, password string) (*managesieve.Client, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
149 c, err := managesieve.Dial(hostport)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
150 if err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
151 return nil, fmt.Errorf("failed to connect: %s", err)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
152 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
153
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
154 host, _, _ := net.SplitHostPort(hostport)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
155 // switch to a TLS connection except for localhost
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
156 if host != "localhost" && host != "127.0.0.1" && host != "::1" {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
157 tlsConf := &tls.Config{
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
158 ServerName: host,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
159 InsecureSkipVerify: skipCertVerify,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
160 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
161 if err := c.StartTLS(tlsConf); err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
162 return nil,
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
163 fmt.Errorf("failed to start TLS connection: %s",
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
164 err)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
165 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
166 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
167
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
168 auth := managesieve.PlainAuth("", username, password, host)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
169 if err := c.Authenticate(auth); err != nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
170 return nil, fmt.Errorf("failed to authenticate user %s: %s",
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
171 username, err)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
172 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
173
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
174 return c, nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
175 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
176
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
177 func readLimitedString(r io.Reader, n int64) (string, error) {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
178 var s strings.Builder
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
179 _, err := io.CopyN(&s, r, n)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
180 if err == nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
181 // check for EOF
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
182 _, err = io.CopyN(ioutil.Discard, r, 1)
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
183 if err == nil {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
184 return s.String(), errTooBig
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
185 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
186 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
187 if err != io.EOF {
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
188 return s.String(), err
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
189 }
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
190
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
191 return s.String(), nil
b00673734e58 Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
192 }