1
1
package login
2
2
3
3
import (
4
+ "bytes"
4
5
"crypto/tls"
6
+ "encoding/json"
5
7
"fmt"
8
+ "io/ioutil"
6
9
"net/http"
7
10
"net/http/httptest"
8
11
"regexp"
@@ -12,12 +15,18 @@ import (
12
15
"github.com/MakeNowJust/heredoc"
13
16
14
17
"github.com/openshift/origin/pkg/cmd/util/clientcmd"
18
+ "github.com/openshift/origin/pkg/oauth/util"
15
19
"github.com/openshift/origin/pkg/oc/cli/config"
16
20
21
+ kapierrs "k8s.io/apimachinery/pkg/api/errors"
17
22
restclient "k8s.io/client-go/rest"
18
23
kclientcmdapi "k8s.io/client-go/tools/clientcmd/api"
19
24
)
20
25
26
+ const (
27
+ oauthMetadataEndpoint = "/.well-known/oauth-authorization-server"
28
+ )
29
+
21
30
func TestNormalizeServerURL (t * testing.T ) {
22
31
testCases := []struct {
23
32
originalServerURL string
@@ -256,6 +265,77 @@ func TestDialToHTTPServer(t *testing.T) {
256
265
}
257
266
}
258
267
268
+ type oauthMetadataResponse struct {
269
+ metadata * util.OauthAuthorizationServerMetadata
270
+ }
271
+
272
+ func (r * oauthMetadataResponse ) Serialize () ([]byte , error ) {
273
+ b , err := json .Marshal (r .metadata )
274
+ if err != nil {
275
+ return []byte {}, err
276
+ }
277
+
278
+ return b , nil
279
+ }
280
+
281
+ func TestPreserveErrTypeAuthInfo (t * testing.T ) {
282
+ invoked := make (chan struct {}, 2 )
283
+ oauthResponse := []byte {}
284
+
285
+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
286
+ select {
287
+ case invoked <- struct {}{}:
288
+ default :
289
+ t .Fatalf ("unexpected request handled by test server: %v: %v" , r .Method , r .URL )
290
+ }
291
+
292
+ if r .URL .Path == oauthMetadataEndpoint {
293
+ w .WriteHeader (http .StatusOK )
294
+ w .Write (oauthResponse )
295
+ return
296
+ }
297
+ w .WriteHeader (http .StatusUnauthorized )
298
+ }))
299
+ defer server .Close ()
300
+
301
+ metadataResponse := & oauthMetadataResponse {}
302
+ metadataResponse .metadata = & util.OauthAuthorizationServerMetadata {
303
+ Issuer : server .URL ,
304
+ AuthorizationEndpoint : server .URL + "/oauth/authorize" ,
305
+ TokenEndpoint : server .URL + "/oauth/token" ,
306
+ CodeChallengeMethodsSupported : []string {"plain" , "S256" },
307
+ }
308
+
309
+ oauthResponse , err := metadataResponse .Serialize ()
310
+ if err != nil {
311
+ t .Fatalf ("unexpected error: %v" , err )
312
+ }
313
+
314
+ options := & LoginOptions {
315
+ Server : server .URL ,
316
+ StartingKubeConfig : & kclientcmdapi.Config {},
317
+ Username : "test" ,
318
+ Password : "test" ,
319
+ Reader : bytes .NewReader ([]byte {}),
320
+
321
+ Config : & restclient.Config {
322
+ Host : server .URL ,
323
+ },
324
+
325
+ Out : ioutil .Discard ,
326
+ ErrOut : ioutil .Discard ,
327
+ }
328
+
329
+ err = options .gatherAuthInfo ()
330
+ if err == nil {
331
+ t .Fatalf ("expecting unauthorized error when gathering authinfo" )
332
+ }
333
+
334
+ if ! kapierrs .IsUnauthorized (err ) {
335
+ t .Fatalf ("expecting error of type metav1.StatusReasonUnauthorized, but got %T" , err )
336
+ }
337
+ }
338
+
259
339
func TestDialToHTTPSServer (t * testing.T ) {
260
340
invoked := make (chan struct {}, 1 )
261
341
server := httptest .NewTLSServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
0 commit comments