@@ -12,7 +12,7 @@ import (
12
12
"github.com/mitchellh/go-homedir"
13
13
"github.com/rs/zerolog/log"
14
14
"github.com/spf13/cobra"
15
- grpc "google.golang.org/grpc"
15
+ "google.golang.org/grpc"
16
16
"google.golang.org/grpc/credentials/insecure"
17
17
18
18
zgrpcutil "github.com/authzed/zed/internal/grpcutil"
@@ -28,20 +28,17 @@ type Client interface {
28
28
}
29
29
30
30
// NewClient defines an (overridable) means of creating a new client.
31
- var NewClient = newGRPCClient
31
+ var (
32
+ NewClient = newClientForCurrentContext
33
+ NewClientForContext = newClientForContext
34
+ )
32
35
33
- func newGRPCClient (cmd * cobra.Command ) (Client , error ) {
36
+ func newClientForCurrentContext (cmd * cobra.Command ) (Client , error ) {
34
37
configStore , secretStore := DefaultStorage ()
35
- token , err := storage .DefaultToken (
36
- cobrautil .MustGetString (cmd , "endpoint" ),
37
- cobrautil .MustGetString (cmd , "token" ),
38
- configStore ,
39
- secretStore ,
40
- )
38
+ token , err := GetCurrentTokenWithCLIOverride (cmd , configStore , secretStore )
41
39
if err != nil {
42
40
return nil , err
43
41
}
44
- log .Trace ().Interface ("token" , token ).Send ()
45
42
46
43
dialOpts , err := DialOptsFromFlags (cmd , token )
47
44
if err != nil {
@@ -56,28 +53,115 @@ func newGRPCClient(cmd *cobra.Command) (Client, error) {
56
53
return client , err
57
54
}
58
55
56
+ func newClientForContext (cmd * cobra.Command , contextName string , secretStore storage.SecretStore ) (* authzed.Client , error ) {
57
+ currentToken , err := storage .GetToken (contextName , secretStore )
58
+ if err != nil {
59
+ return nil , err
60
+ }
61
+
62
+ token , err := GetTokenWithCLIOverride (cmd , currentToken )
63
+ if err != nil {
64
+ return nil , err
65
+ }
66
+
67
+ dialOpts , err := DialOptsFromFlags (cmd , token )
68
+ if err != nil {
69
+ return nil , err
70
+ }
71
+
72
+ return authzed .NewClient (token .Endpoint , dialOpts ... )
73
+ }
74
+
75
+ // GetCurrentTokenWithCLIOverride returns the current token, but overridden by any parameter specified via CLI args
76
+ func GetCurrentTokenWithCLIOverride (cmd * cobra.Command , configStore storage.ConfigStore , secretStore storage.SecretStore ) (storage.Token , error ) {
77
+ token , err := storage .CurrentToken (
78
+ configStore ,
79
+ secretStore ,
80
+ )
81
+ if err != nil {
82
+ return storage.Token {}, err
83
+ }
84
+
85
+ return GetTokenWithCLIOverride (cmd , token )
86
+ }
87
+
88
+ // GetTokenWithCLIOverride returns the provided token, but overridden by any parameter specified explicitly via command
89
+ // flags
90
+ func GetTokenWithCLIOverride (cmd * cobra.Command , token storage.Token ) (storage.Token , error ) {
91
+ overrideToken , err := tokenFromCli (cmd )
92
+ if err != nil {
93
+ return storage.Token {}, err
94
+ }
95
+
96
+ result , err := storage .TokenWithOverride (
97
+ overrideToken ,
98
+ token ,
99
+ )
100
+ if err != nil {
101
+ return storage.Token {}, err
102
+ }
103
+
104
+ log .Trace ().Bool ("context-override-via-cli" , overrideToken .AnyValue ()).Interface ("context" , result ).Send ()
105
+ return result , nil
106
+ }
107
+
108
+ func tokenFromCli (cmd * cobra.Command ) (storage.Token , error ) {
109
+ certPath := cobrautil .MustGetStringExpanded (cmd , "certificate-path" )
110
+ var certBytes []byte
111
+ var err error
112
+ if certPath != "" {
113
+ certBytes , err = os .ReadFile (certPath )
114
+ if err != nil {
115
+ return storage.Token {}, fmt .Errorf ("failed to read ceritficate: %w" , err )
116
+ }
117
+ }
118
+
119
+ explicitInsecure := cmd .Flags ().Changed ("insecure" )
120
+ var notSecure * bool
121
+ if explicitInsecure {
122
+ i := cobrautil .MustGetBool (cmd , "insecure" )
123
+ notSecure = & i
124
+ }
125
+
126
+ explicitNoVerifyCA := cmd .Flags ().Changed ("no-verify-ca" )
127
+ var notVerifyCA * bool
128
+ if explicitNoVerifyCA {
129
+ nvc := cobrautil .MustGetBool (cmd , "no-verify-ca" )
130
+ notVerifyCA = & nvc
131
+ }
132
+ overrideToken := storage.Token {
133
+ APIToken : cobrautil .MustGetString (cmd , "token" ),
134
+ Endpoint : cobrautil .MustGetString (cmd , "endpoint" ),
135
+ Insecure : notSecure ,
136
+ NoVerifyCA : notVerifyCA ,
137
+ CACert : certBytes ,
138
+ }
139
+ return overrideToken , nil
140
+ }
141
+
59
142
// DefaultStorage returns the default configured config store and secret store.
60
143
func DefaultStorage () (storage.ConfigStore , storage.SecretStore ) {
61
144
var home string
62
145
if xdg := os .Getenv ("XDG_CONFIG_HOME" ); xdg != "" {
63
146
home = filepath .Join (xdg , "zed" )
64
147
} else {
65
- homedir , _ := homedir .Dir ()
66
- home = filepath .Join (homedir , ".zed" )
148
+ hmdir , _ := homedir .Dir ()
149
+ home = filepath .Join (hmdir , ".zed" )
67
150
}
68
151
return & storage.JSONConfigStore {ConfigPath : home },
69
152
& storage.KeychainSecretStore {ConfigPath : home }
70
153
}
71
154
72
- func certOption (cmd * cobra. Command , token storage.Token ) (opt grpc.DialOption , err error ) {
155
+ func certOption (token storage.Token ) (opt grpc.DialOption , err error ) {
73
156
verification := grpcutil .VerifyCA
74
- if cobrautil . MustGetBool ( cmd , "no-verify-ca" ) || token .HasNoVerifyCA () {
157
+ if token .HasNoVerifyCA () {
75
158
verification = grpcutil .SkipVerifyCA
76
159
}
77
160
78
161
if certBytes , ok := token .Certificate (); ok {
79
162
return grpcutil .WithCustomCertBytes (verification , certBytes )
80
163
}
164
+
81
165
return grpcutil .WithSystemCerts (verification )
82
166
}
83
167
@@ -96,12 +180,12 @@ func DialOptsFromFlags(cmd *cobra.Command, token storage.Token) ([]grpc.DialOpti
96
180
grpc .WithChainStreamInterceptor (zgrpcutil .StreamLogDispatchTrailers ),
97
181
}
98
182
99
- if cobrautil . MustGetBool ( cmd , "insecure" ) || ( token .IsInsecure () ) {
183
+ if token .IsInsecure () {
100
184
opts = append (opts , grpc .WithTransportCredentials (insecure .NewCredentials ()))
101
185
opts = append (opts , grpcutil .WithInsecureBearerToken (token .APIToken ))
102
186
} else {
103
187
opts = append (opts , grpcutil .WithBearerToken (token .APIToken ))
104
- certOpt , err := certOption (cmd , token )
188
+ certOpt , err := certOption (token )
105
189
if err != nil {
106
190
return nil , fmt .Errorf ("failed to configure TLS cert: %w" , err )
107
191
}
0 commit comments