@@ -8,17 +8,18 @@ import (
8
8
"strings"
9
9
10
10
kapi "k8s.io/kubernetes/pkg/api"
11
+ "k8s.io/kubernetes/pkg/api/unversioned"
11
12
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
13
+ "k8s.io/kubernetes/pkg/client/record"
12
14
"k8s.io/kubernetes/pkg/runtime"
13
15
"k8s.io/kubernetes/pkg/serviceaccount"
16
+ "k8s.io/kubernetes/pkg/util/sets"
14
17
15
18
scopeauthorizer "github.com/openshift/origin/pkg/authorization/authorizer/scope"
16
19
osclient "github.com/openshift/origin/pkg/client"
17
20
oauthapi "github.com/openshift/origin/pkg/oauth/api"
18
21
"github.com/openshift/origin/pkg/oauth/registry/oauthclient"
19
22
routeapi "github.com/openshift/origin/pkg/route/api"
20
- "k8s.io/kubernetes/pkg/api/unversioned"
21
- "k8s.io/kubernetes/pkg/util/sets"
22
23
)
23
24
24
25
const (
@@ -57,6 +58,7 @@ var legacyRouteGroupKind = routeapi.LegacySchemeGroupVersion.WithKind(routeKind)
57
58
type saOAuthClientAdapter struct {
58
59
saClient kcoreclient.ServiceAccountsGetter
59
60
secretClient kcoreclient.SecretsGetter
61
+ eventsClient kcoreclient.EventsGetter
60
62
routeClient osclient.RoutesNamespacer
61
63
// TODO add ingress support
62
64
//ingressClient ??
@@ -183,8 +185,8 @@ func (uri *redirectURI) merge(m *model) {
183
185
184
186
var _ oauthclient.Getter = & saOAuthClientAdapter {}
185
187
186
- func NewServiceAccountOAuthClientGetter (saClient kcoreclient.ServiceAccountsGetter , secretClient kcoreclient.SecretsGetter , routeClient osclient.RoutesNamespacer , delegate oauthclient.Getter , grantMethod oauthapi.GrantHandlerType ) oauthclient.Getter {
187
- return & saOAuthClientAdapter {saClient : saClient , secretClient : secretClient , routeClient : routeClient , delegate : delegate , grantMethod : grantMethod , decoder : kapi .Codecs .UniversalDecoder ()}
188
+ func NewServiceAccountOAuthClientGetter (saClient kcoreclient.ServiceAccountsGetter , secretClient kcoreclient.SecretsGetter , eventClient kcoreclient. EventsGetter , routeClient osclient.RoutesNamespacer , delegate oauthclient.Getter , grantMethod oauthapi.GrantHandlerType ) oauthclient.Getter {
189
+ return & saOAuthClientAdapter {saClient : saClient , secretClient : secretClient , eventsClient : eventClient , routeClient : routeClient , delegate : delegate , grantMethod : grantMethod , decoder : kapi .Codecs .UniversalDecoder ()}
188
190
}
189
191
190
192
func (a * saOAuthClientAdapter ) GetClient (ctx kapi.Context , name string ) (* oauthapi.OAuthClient , error ) {
@@ -198,13 +200,16 @@ func (a *saOAuthClientAdapter) GetClient(ctx kapi.Context, name string) (*oautha
198
200
return nil , err
199
201
}
200
202
203
+ recorder := a .getEventRecorder (saNamespace )
204
+
201
205
redirectURIs := []string {}
202
- if modelsMap := parseModelsMap (sa . Annotations , a .decoder ); len (modelsMap ) > 0 {
206
+ if modelsMap := parseModelsMap (sa , a .decoder , recorder ); len (modelsMap ) > 0 {
203
207
if uris := a .extractRedirectURIs (modelsMap , saNamespace ); len (uris ) > 0 {
204
208
redirectURIs = append (redirectURIs , uris .extractValidRedirectURIStrings ()... )
205
209
}
206
210
}
207
211
if len (redirectURIs ) == 0 {
212
+ recorder .Event (sa , kapi .EventTypeWarning , "OAuthNoRedirectURIs" , "Has no redirectURIs" )
208
213
return nil , fmt .Errorf (
209
214
"%v has no redirectURIs; set %v<some-value>=<redirect> or create a dynamic URI using %v<some-value>=<reference>" ,
210
215
name , OAuthRedirectModelAnnotationURIPrefix , OAuthRedirectModelAnnotationReferencePrefix ,
@@ -234,30 +239,48 @@ func (a *saOAuthClientAdapter) GetClient(ctx kapi.Context, name string) (*oautha
234
239
RedirectURIs : sets .NewString (redirectURIs ... ).List (),
235
240
GrantMethod : a .grantMethod ,
236
241
}
242
+
243
+ // TODO: is this safe to tell - could leak Route info?
244
+ recorder .Eventf (sa , kapi .EventTypeNormal , "OAuthAllRedirectURIs" , "Has the following redirectURIs: %v" , saClient .RedirectURIs )
245
+
237
246
return saClient , nil
238
247
}
239
248
249
+ // TODO this is super naive and inefficient
250
+ func (a * saOAuthClientAdapter ) getEventRecorder (namespace string ) record.EventRecorder {
251
+ eventBroadcaster := record .NewBroadcaster ()
252
+ eventBroadcaster .StartRecordingToSink (& kcoreclient.EventSinkImpl {Interface : a .eventsClient .Events (namespace )})
253
+ return eventBroadcaster .NewRecorder (kapi.EventSource {Component : "service-account-oauth-client-getter" })
254
+ }
255
+
240
256
// parseModelsMap builds a map of model name to model using a service account's annotations.
241
257
// The model name is only used for building the map (it ties together the uri and reference annotations)
242
258
// and serves no functional purpose other than making testing easier.
243
- func parseModelsMap (annotations map [ string ] string , decoder runtime.Decoder ) map [string ]model {
259
+ func parseModelsMap (sa * kapi. ServiceAccount , decoder runtime.Decoder , recorder record. EventRecorder ) map [string ]model {
244
260
models := map [string ]model {}
245
- for key , value := range annotations {
261
+ for key , value := range sa . Annotations {
246
262
prefix , name , ok := parseModelPrefixName (key )
247
263
if ! ok {
264
+ recorder .Eventf (sa , kapi .EventTypeNormal , "OAuthAnnotationSkipped" , "Annotation key does not match an OAuth prefix: %s=%s" , key , value )
248
265
continue
249
266
}
250
267
m := models [name ]
251
268
switch prefix {
252
269
case OAuthRedirectModelAnnotationURIPrefix :
253
270
if u , err := url .Parse (value ); err == nil {
254
271
m .updateFromURI (u )
272
+ } else {
273
+ recorder .Eventf (sa , kapi .EventTypeWarning , "OAuthAnnotationSkipped" , "Annotation value is not a valid URL: %s=%s" , key , value )
255
274
}
256
275
case OAuthRedirectModelAnnotationReferencePrefix :
257
276
r := & oauthapi.OAuthRedirectReference {}
258
277
if err := runtime .DecodeInto (decoder , []byte (value ), r ); err == nil {
259
278
m .updateFromReference (& r .Reference )
279
+ } else {
280
+ recorder .Eventf (sa , kapi .EventTypeWarning , "OAuthAnnotationSkipped" , "Annotation value is not a valid OAuthRedirectReference: %s=%s" , key , value )
260
281
}
282
+ default :
283
+ panic ("unreacable" )
261
284
}
262
285
models [name ] = m
263
286
}
0 commit comments