From 744ae974a5bfc47c219320460eead041fc9f64f4 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 11 Aug 2016 15:30:17 +0200 Subject: [PATCH] Improve "invalid reference" error message Use the same error message as is used in docker/reference/reference.go to provide slightly more information about the error. This change tests if the reference passes after lowercasing its characters, to determine if the reference was invalid due to it containing uppercase characters. Signed-off-by: Sebastiaan van Stijn --- reference/reference.go | 8 +++++++- reference/reference_test.go | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/reference/reference.go b/reference/reference.go index bb09fa25..5b3e08ee 100644 --- a/reference/reference.go +++ b/reference/reference.go @@ -24,6 +24,7 @@ package reference import ( "errors" "fmt" + "strings" "github.com/docker/distribution/digest" ) @@ -43,6 +44,9 @@ var ( // ErrDigestInvalidFormat represents an error while trying to parse a string as a tag. ErrDigestInvalidFormat = errors.New("invalid digest format") + // ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters. + ErrNameContainsUppercase = errors.New("repository name must be lowercase") + // ErrNameEmpty is returned for empty, invalid repository names. ErrNameEmpty = errors.New("repository name must have at least one component") @@ -149,7 +153,9 @@ func Parse(s string) (Reference, error) { if s == "" { return nil, ErrNameEmpty } - // TODO(dmcgowan): Provide more specific and helpful error + if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil { + return nil, ErrNameContainsUppercase + } return nil, ErrReferenceInvalidFormat } diff --git a/reference/reference_test.go b/reference/reference_test.go index cde1a7a2..f60cf093 100644 --- a/reference/reference_test.go +++ b/reference/reference_test.go @@ -95,6 +95,25 @@ func TestReferenceParse(t *testing.T) { input: "validname@invaliddigest:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", err: digest.ErrDigestUnsupported, }, + { + input: "Uppercase:tag", + err: ErrNameContainsUppercase, + }, + // FIXME "Uppercase" is incorrectly handled as a domain-name here, therefore passes. + // See https://github.com/docker/distribution/pull/1778, and https://github.com/docker/docker/pull/20175 + //{ + // input: "Uppercase/lowercase:tag", + // err: ErrNameContainsUppercase, + //}, + { + input: "test:5000/Uppercase/lowercase:tag", + err: ErrNameContainsUppercase, + }, + { + input: "lowercase:Uppercase", + repository: "lowercase", + tag: "Uppercase", + }, { input: strings.Repeat("a/", 128) + "a:tag", err: ErrNameTooLong,