diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/type/ImageReference.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/type/ImageReference.java index f562d22f8317..01a918895a62 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/type/ImageReference.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/type/ImageReference.java @@ -17,6 +17,7 @@ package org.springframework.boot.buildpack.platform.docker.type; import java.io.File; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -260,7 +261,8 @@ public static ImageReference of(String value) { path = path.substring(0, tagSplit) + remainder; } } - Assert.isTrue(Regex.PATH.matcher(path).matches(), + + Assert.isTrue(isLowerCase(path) && matchesPathRegex(path), () -> "Unable to parse image reference \"" + value + "\". " + "Image reference must be in the form '[domainHost:port/][path/]name[:tag][@digest]', " + "with 'path' and 'name' containing only [a-z0-9][.][_][-]"); @@ -268,6 +270,14 @@ public static ImageReference of(String value) { return new ImageReference(name, tag, digest); } + private static boolean isLowerCase(String path) { + return path.toLowerCase(Locale.ENGLISH).equals(path); + } + + private static boolean matchesPathRegex(String path) { + return Regex.PATH.matcher(path).matches(); + } + /** * Create a new {@link ImageReference} from the given {@link ImageName}. * @param name the image name diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/type/ImageReferenceTests.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/type/ImageReferenceTests.java index 61940e44c8e5..d33abc7f38b8 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/type/ImageReferenceTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/type/ImageReferenceTests.java @@ -180,6 +180,14 @@ void ofWhenHasIllegalCharacter() { .withMessageContaining("Unable to parse image reference"); } + @Test + void ofWhenContainsUpperCaseThrowsException() { + assertThatIllegalArgumentException() + .isThrownBy(() -> ImageReference + .of("europe-west1-docker.pkg.dev/aaaaaa-bbbbb-123456/docker-registry/bootBuildImage:0.0.1")) + .withMessageContaining("Unable to parse image reference"); + } + @Test void forJarFile() { assertForJarFile("spring-boot.2.0.0.BUILD-SNAPSHOT.jar", "library/spring-boot", "2.0.0.BUILD-SNAPSHOT");