From 22f69362372f398bd217b85d85d31682fe9c127b Mon Sep 17 00:00:00 2001 From: Vadim Bauer Date: Mon, 4 Jun 2018 22:42:58 +0200 Subject: [PATCH] don't fail if scope container more the one grand. (#92) --- registry/authchallenge.go | 2 +- registry/authchallenge_test.go | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/registry/authchallenge.go b/registry/authchallenge.go index 6ab543b1..8a4aa2d7 100644 --- a/registry/authchallenge.go +++ b/registry/authchallenge.go @@ -32,7 +32,7 @@ func parseChallenge(challengeHeader string) (*authService, error) { if d := len(match); d != 1 { return nil, fmt.Errorf("malformed auth challenge header: '%s', %d", challengeHeader, d) } - parts := strings.Split(strings.TrimSpace(match[0][1]), ",") + parts := strings.SplitN(strings.TrimSpace(match[0][1]), ",",3) var realm, service string var scope []string diff --git a/registry/authchallenge_test.go b/registry/authchallenge_test.go index 3c961faa..ab6d8374 100644 --- a/registry/authchallenge_test.go +++ b/registry/authchallenge_test.go @@ -1,7 +1,6 @@ package registry import ( - "reflect" "strings" "testing" ) @@ -22,9 +21,8 @@ func (asm authServiceMock) equalTo(v *authService) bool { if asm.service != v.Service { return false } - if reflect.DeepEqual(asm.scope, v.Scope) { - return false - } + for i, v := range v.Scope { if v != asm.scope[i] { return false } } + if asm.realm != v.Realm.String() { return false } @@ -53,3 +51,26 @@ func TestParseChallenge(t *testing.T) { } } + +func TestParseChallengePush(t *testing.T) { + challengeHeaderCases := []challengeTestCase{ + { + header: `Bearer realm="https://foo.com/v2/token",service="foo.com",scope="repository:pdr/tls:pull,push"`, + value: authServiceMock{ + realm: "https://foo.com/v2/token", + service: "foo.com", + scope: []string{"repository:pdr/tls:pull,push"}, + }, + }, + } + for _, tc := range challengeHeaderCases { + val, err := parseChallenge(tc.header) + if err != nil && !strings.Contains(err.Error(), tc.errorString) { + t.Fatalf("expected error to contain %v, got %s", tc.errorString, err) + } + if !tc.value.equalTo(val) { + t.Fatalf("got %v, expected %v", val, tc.value) + } + + } +}