From 999019e0bb5ce919e9d27d2a94c0c97e599a0ffb Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Fri, 2 Jun 2023 08:39:56 -0400 Subject: [PATCH 1/2] fix: handle tags --- .../github/dockerjava/core/NameParser.java | 12 +++++ .../dockerjava/core/NameParserTest.java | 44 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java index ae39029ed..f06adb6d8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java @@ -22,6 +22,7 @@ private NameParser() { private static final int RepositoryNameTotalLengthMax = 255; private static final String SHA256_SEPARATOR = "@sha256:"; + private static final String COLON_SEPARATOR = ":"; private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); @@ -106,6 +107,13 @@ public static HostnameReposName resolveRepositoryName(String reposName) { String[] nameParts = reposName.split("/", 2); if (nameParts.length == 1 || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) { + if (StringUtils.containsIgnoreCase(reposName, SHA256_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); + } + + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName); } @@ -119,6 +127,10 @@ public static HostnameReposName resolveRepositoryName(String reposName) { reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); } + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } + validateRepoName(reposName); return new HostnameReposName(hostname, reposName); } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java index c6332ba4b..db5d08fcb 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -30,6 +30,7 @@ public void testValidateRepoName() { NameParser.validateRepoName("namespace/repository.with.dots"); NameParser.validateRepoName("namespace_with_underscores/repository"); NameParser.validateRepoName("namespace/repository_with_underscores"); + NameParser.validateRepoName("virtual-registry/namespace/repository"); } @Test(expected = InvalidRepositoryNameException.class) @@ -83,6 +84,24 @@ public void testResolveSimpleRepositoryName() { assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); } + @Test + public void testResolveRepositoryNameWithTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + @Test public void testResolveRepositoryNameWithNamespace() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository"); @@ -92,7 +111,7 @@ public void testResolveRepositoryNameWithNamespace() { @Test public void testResolveRepositoryNameWithNamespaceAndSHA256() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository@sha256:sha256"); - assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository@sha256:sha256"), resolved); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository"), resolved); } @Test @@ -107,6 +126,17 @@ public void testResolveRepositoryNameWithNamespaceAndHostnameAndSHA256() { assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); } + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + @Test(expected = InvalidRepositoryNameException.class) public void testResolveRepositoryNameWithIndex() { NameParser.resolveRepositoryName("index.docker.io/repository"); @@ -147,4 +177,16 @@ public void testResolveReposTagWithSHA256() { resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository@sha256:sha256"); assertEquals(new ReposTag("localhost:5000/namespace/repository@sha256:sha256", ""), resolved); } + + @Test + public void testResolveReposTagWithTagAndSHA256() { + ReposTag resolved = NameParser.parseRepositoryTag("repository:tag@sha256:sha256"); + assertEquals(new ReposTag("repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("namespace/repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("localhost:5000/namespace/repository:tag@sha256:sha256", ""), resolved); + } } From a7ac28ff28f1a677679f9286db85cc5e78024602 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Fri, 2 Jun 2023 16:56:01 -0400 Subject: [PATCH 2/2] fix: handle tags --- .../src/test/java/com/github/dockerjava/core/NameParserTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java index db5d08fcb..89ad131f6 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -30,7 +30,6 @@ public void testValidateRepoName() { NameParser.validateRepoName("namespace/repository.with.dots"); NameParser.validateRepoName("namespace_with_underscores/repository"); NameParser.validateRepoName("namespace/repository_with_underscores"); - NameParser.validateRepoName("virtual-registry/namespace/repository"); } @Test(expected = InvalidRepositoryNameException.class)