Mercurial > projects > sievemgr
annotate cmd/sievemgr/put.go @ 5:4dff4c3f0fbb
Introduce configuration file where account information is specified
Introduce a configuration file where account information must be specified
instead of passing it with each invocation on the command line. Each account
has a name by which it can be selected and one may be specified as the default
account. This is intended to improve usability for productive usage.
Enforce strict permissions since passwords may be specified for non-interactive
usage.
Remove command-line flags for passing account information.
author | Guido Berhoerster <guido+sievemgr@berhoerster.name> |
---|---|
date | Tue, 03 Nov 2020 23:44:45 +0100 |
parents | f925f15d8ce5 |
children | fc5e6970a0d5 |
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 "fmt" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
26 "io" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
27 "os" |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
28 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
29 "go.guido-berhoerster.org/managesieve" |
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:
4
diff
changeset
|
33 cmdPut.Flag.StringVar(&acctName, "a", "", "Select the account") |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
34 cmdCheck.Flag.StringVar(&acctName, "a", "", "Select the account") |
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 cmdPut = &command{ |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
38 UsageLine: "put [options] name [file]", |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
39 Run: runPut, |
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 |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
42 var cmdCheck = &command{ |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
43 UsageLine: "check [options] [file]", |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
44 Run: runPut, |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
45 } |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
46 |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
47 func runPut(cmd *command, args []string) error { |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
48 var err error |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
49 acct, err := getAccount(&conf, acctName) |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
50 if err != nil { |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
51 return err |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
52 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
53 |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
54 var scriptName string |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
55 var r io.Reader = os.Stdin |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
56 if cmd.Name() == "put" { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
57 switch len(args) { |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
58 case 2: // name and filename |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
59 scriptFile, err := os.Open(args[1]) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
60 if err != nil { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
61 return fmt.Errorf("failed to open script file: %s\n", |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
62 err) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
63 } |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
64 defer scriptFile.Close() |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
65 r = scriptFile |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
66 fallthrough |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
67 case 1: // only name |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
68 scriptName = args[0] |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
69 default: |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
70 return usageError("invalid number of arguments") |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
71 } |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
72 } else if cmd.Name() == "check" { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
73 switch len(args) { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
74 case 1: // filename |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
75 scriptFile, err := os.Open(args[0]) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
76 if err != nil { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
77 return fmt.Errorf("failed to open script file: %s\n", |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
78 err) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
79 } |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
80 defer scriptFile.Close() |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
81 r = scriptFile |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
82 case 0: |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
83 default: |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
84 return usageError("invalid number of arguments") |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
85 } |
0
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 script, err := readLimitedString(r, managesieve.ReadLimit) |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
89 if err != nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
90 return fmt.Errorf("failed to read script: %s\n", err) |
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 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
93 if err := lookupHostPort(acct); err != nil { |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
94 return err |
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 |
5
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
97 if err := readPassword(acct); err != nil { |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
98 return err |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
99 } |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
100 |
4dff4c3f0fbb
Introduce configuration file where account information is specified
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
4
diff
changeset
|
101 c, err := dialPlainAuth(acct) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
102 if err != nil { |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
103 return err |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
104 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
105 defer c.Logout() |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
106 |
4
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
107 var warnings string |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
108 if cmd.Name() == "put" { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
109 warnings, err = c.PutScript(scriptName, script) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
110 } else if cmd.Name() == "check" { |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
111 warnings, err = c.CheckScript(script) |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
112 } |
f925f15d8ce5
Add check subcommand for checking the script validity
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
3
diff
changeset
|
113 if err != nil { |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
114 return err |
3
3cd182bff992
Show warning messages in put output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
1
diff
changeset
|
115 } else if warnings != "" { |
3cd182bff992
Show warning messages in put output
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
1
diff
changeset
|
116 fmt.Fprintln(os.Stderr, warnings) |
0
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
117 } |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
118 |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
119 return nil |
b00673734e58
Initial revision
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
120 } |