forked from aquasecurity/trivy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathremote_flags.go
142 lines (123 loc) · 3.24 KB
/
remote_flags.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package flag
import (
"net/http"
"strings"
"github.com/aquasecurity/trivy/pkg/log"
)
const (
DefaultTokenHeader = "Trivy-Token"
)
var (
ServerTokenFlag = Flag{
Name: "token",
ConfigName: "server.token",
Value: "",
Usage: "for authentication in client/server mode",
}
ServerTokenHeaderFlag = Flag{
Name: "token-header",
ConfigName: "server.token-header",
Value: DefaultTokenHeader,
Usage: "specify a header name for token in client/server mode",
}
ServerAddrFlag = Flag{
Name: "server",
ConfigName: "server.addr",
Value: "",
Usage: "server address in client mode",
}
ServerCustomHeadersFlag = Flag{
Name: "custom-headers",
ConfigName: "server.custom-headers",
Value: []string{},
Usage: "custom headers in client mode",
}
ServerListenFlag = Flag{
Name: "listen",
ConfigName: "server.listen",
Value: "localhost:4954",
Usage: "listen address in server mode",
}
)
// RemoteFlagGroup composes common printer flag structs
// used for commands requiring reporting logic.
type RemoteFlagGroup struct {
// for client/server
Token *Flag
TokenHeader *Flag
// for client
ServerAddr *Flag
CustomHeaders *Flag
// for server
Listen *Flag
}
type RemoteOptions struct {
Token string
TokenHeader string
ServerAddr string
Listen string
CustomHeaders http.Header
}
func NewClientFlags() *RemoteFlagGroup {
return &RemoteFlagGroup{
Token: &ServerTokenFlag,
TokenHeader: &ServerTokenHeaderFlag,
ServerAddr: &ServerAddrFlag,
CustomHeaders: &ServerCustomHeadersFlag,
}
}
func NewServerFlags() *RemoteFlagGroup {
return &RemoteFlagGroup{
Token: &ServerTokenFlag,
TokenHeader: &ServerTokenHeaderFlag,
Listen: &ServerListenFlag,
}
}
func (f *RemoteFlagGroup) Name() string {
return "Client/Server"
}
func (f *RemoteFlagGroup) Flags() []*Flag {
return []*Flag{f.Token, f.TokenHeader, f.ServerAddr, f.CustomHeaders, f.Listen}
}
func (f *RemoteFlagGroup) ToOptions() RemoteOptions {
serverAddr := getString(f.ServerAddr)
customHeaders := splitCustomHeaders(getStringSlice(f.CustomHeaders))
listen := getString(f.Listen)
token := getString(f.Token)
tokenHeader := getString(f.TokenHeader)
if serverAddr == "" && listen == "" {
switch {
case len(customHeaders) > 0:
log.Logger.Warn(`"--custom-header" can be used only with "--server"`)
case token != "":
log.Logger.Warn(`"--token" can be used only with "--server"`)
case tokenHeader != "" && tokenHeader != DefaultTokenHeader:
log.Logger.Warn(`"--token-header" can be used only with "--server"`)
}
}
if token == "" && tokenHeader != DefaultTokenHeader {
log.Logger.Warn(`"--token-header" should be used with "--token"`)
}
if token != "" && tokenHeader != "" {
customHeaders.Set(tokenHeader, token)
}
return RemoteOptions{
Token: token,
TokenHeader: tokenHeader,
ServerAddr: serverAddr,
CustomHeaders: customHeaders,
Listen: listen,
}
}
func splitCustomHeaders(headers []string) http.Header {
result := make(http.Header)
for _, header := range headers {
// e.g. x-api-token:XXX
s := strings.SplitN(header, ":", 2)
if len(s) != 2 {
continue
}
result.Set(s[0], s[1])
}
return result
}