From b8301005ffe66fb15a64735deeae707595543a92 Mon Sep 17 00:00:00 2001 From: Shishir Mahajan Date: Fri, 29 May 2015 10:22:33 -0400 Subject: [PATCH] Use distribution's ValidateRepositoryName for remote name validation. Signed-off-by: Shishir Mahajan --- integration-cli/docker_cli_tag_test.go | 6 ++-- registry/config.go | 42 +++++--------------------- registry/registry_test.go | 8 +++-- 3 files changed, 15 insertions(+), 41 deletions(-) diff --git a/integration-cli/docker_cli_tag_test.go b/integration-cli/docker_cli_tag_test.go index 7db21a6f37..5a8bc38db5 100644 --- a/integration-cli/docker_cli_tag_test.go +++ b/integration-cli/docker_cli_tag_test.go @@ -111,20 +111,20 @@ func (s *DockerSuite) TestTagExistedNameWithForce(c *check.C) { } } -func (s *DockerSuite) TestTagWithSuffixHyphen(c *check.C) { +func (s *DockerSuite) TestTagWithPrefixHyphen(c *check.C) { if err := pullImageIfNotExist("busybox:latest"); err != nil { c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") } // test repository name begin with '-' tagCmd := exec.Command(dockerBinary, "tag", "busybox:latest", "-busybox:test") out, _, err := runCommandWithOutput(tagCmd) - if err == nil || !strings.Contains(out, "Invalid repository name (-busybox). Cannot begin or end with a hyphen") { + if err == nil || !strings.Contains(out, "repository name component must match") { c.Fatal("tag a name begin with '-' should failed") } // test namespace name begin with '-' tagCmd = exec.Command(dockerBinary, "tag", "busybox:latest", "-test/busybox:test") out, _, err = runCommandWithOutput(tagCmd) - if err == nil || !strings.Contains(out, "Invalid namespace name (-test). Cannot begin or end with a hyphen") { + if err == nil || !strings.Contains(out, "repository name component must match") { c.Fatal("tag a name begin with '-' should failed") } // test index name begin wiht '-' diff --git a/registry/config.go b/registry/config.go index 92ef4d9970..a336d74369 100644 --- a/registry/config.go +++ b/registry/config.go @@ -6,9 +6,9 @@ import ( "fmt" "net" "net/url" - "regexp" "strings" + "github.com/docker/distribution/registry/api/v2" "github.com/docker/docker/image" "github.com/docker/docker/opts" flag "github.com/docker/docker/pkg/mflag" @@ -32,8 +32,6 @@ const ( var ( ErrInvalidRepositoryName = errors.New("Invalid repository name (ex: \"registry.domain.tld/myrepos\")") emptyServiceConfig = NewServiceConfig(nil) - validNamespaceChars = regexp.MustCompile(`^([a-z0-9-_]*)$`) - validRepo = regexp.MustCompile(`^([a-z0-9-_.]+)$`) ) func IndexServerAddress() string { @@ -206,42 +204,16 @@ func ValidateIndexName(val string) (string, error) { } func validateRemoteName(remoteName string) error { - var ( - namespace string - name string - ) - nameParts := strings.SplitN(remoteName, "/", 2) - if len(nameParts) < 2 { - namespace = "library" - name = nameParts[0] + + if !strings.Contains(remoteName, "/") { // the repository name must not be a valid image ID - if err := image.ValidateID(name); err == nil { - return fmt.Errorf("Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", name) + if err := image.ValidateID(remoteName); err == nil { + return fmt.Errorf("Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", remoteName) } - } else { - namespace = nameParts[0] - name = nameParts[1] } - if !validNamespaceChars.MatchString(namespace) { - return fmt.Errorf("Invalid namespace name (%s). Only [a-z0-9-_] are allowed.", namespace) - } - if len(namespace) < 2 || len(namespace) > 255 { - return fmt.Errorf("Invalid namespace name (%s). Cannot be fewer than 2 or more than 255 characters.", namespace) - } - if strings.HasPrefix(namespace, "-") || strings.HasSuffix(namespace, "-") { - return fmt.Errorf("Invalid namespace name (%s). Cannot begin or end with a hyphen.", namespace) - } - if strings.Contains(namespace, "--") { - return fmt.Errorf("Invalid namespace name (%s). Cannot contain consecutive hyphens.", namespace) - } - if !validRepo.MatchString(name) { - return fmt.Errorf("Invalid repository name (%s), only [a-z0-9-_.] are allowed", name) - } - if strings.HasPrefix(name, "-") || strings.HasSuffix(name, "-") { - return fmt.Errorf("Invalid repository name (%s). Cannot begin or end with a hyphen.", name) - } - return nil + + return v2.ValidateRepositoryName(remoteName) } func validateNoSchema(reposName string) error { diff --git a/registry/registry_test.go b/registry/registry_test.go index eee801d4c5..1ee48d0035 100644 --- a/registry/registry_test.go +++ b/registry/registry_test.go @@ -742,9 +742,6 @@ func TestValidRemoteName(t *testing.T) { // Allow embedded hyphens. "docker-rules/docker", - // Allow underscores everywhere (as opposed to hyphens). - "____/____", - //Username doc and image name docker being tested. "doc/docker", } @@ -769,6 +766,11 @@ func TestValidRemoteName(t *testing.T) { "docker-/docker", "-docker-/docker", + // Don't allow underscores everywhere (as opposed to hyphens). + "____/____", + + "_docker/_docker", + // Disallow consecutive hyphens. "dock--er/docker",