From f599d2943574e9147a33b35b7f4ebf5fe61db094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roland=20Hu=C3=9F?= Date: Tue, 10 Apr 2018 16:30:58 +0200 Subject: [PATCH] fix: Quote labels and env also when having a space Fixes #988 --- .../maven/docker/assembly/DockerFileBuilder.java | 12 +++++++----- .../docker/assembly/DockerFileBuilderTest.java | 15 ++++++++++++--- .../docker/Dockerfile.multiline_label.test | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java b/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java index 3995b6bb2..27400c1f5 100644 --- a/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java +++ b/src/main/java/io/fabric8/maven/docker/assembly/DockerFileBuilder.java @@ -244,23 +244,25 @@ private String createKeyValue(String key, String value) { if (value == null || value.isEmpty()) { return sb.append("\"\"").toString(); } - StringBuffer valBuf = new StringBuffer(); - boolean escaped = false; + StringBuilder valBuf = new StringBuilder(); + boolean toBeQuoted = false; for (int i = 0; i < value.length(); ++i) { char c = value.charAt(i); switch (c) { case '"': case '\n': case '\\': - escaped = true; // escape the character valBuf.append('\\'); - // fall into writing the character + case ' ': + // space needs quotes, too + toBeQuoted = true; default: + // always append valBuf.append(c); } } - if (escaped) { + if (toBeQuoted) { // need to keep quotes sb.append('"').append(valBuf.toString()).append('"'); } else { diff --git a/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java b/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java index c4ecbeada..96716cd6e 100644 --- a/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java +++ b/src/test/java/io/fabric8/maven/docker/assembly/DockerFileBuilderTest.java @@ -46,12 +46,21 @@ public void testBuildDockerFileMultilineLabel() throws Exception { .cmd(a) .labels(ImmutableMap.of("key", "unquoted", "flag", "", + "with_space", "1.fc nuremberg", "some-json", "{\n \"key\": \"value\"\n}\n")) .content(); String expected = loadFile("docker/Dockerfile.multiline_label.test"); assertEquals(expected, stripCR(dockerfileContent)); } + @Test + public void testBuildLabelWithSpace() throws Exception { + String dockerfileContent = new DockerFileBuilder() + .labels(ImmutableMap.of("key", "label with space")) + .content(); + assertTrue(stripCR(dockerfileContent).contains("LABEL key=\"label with space\"")); + } + @Test public void testBuildDockerFileUDPPort() throws Exception { Arguments a = Arguments.Builder.get().withParam("c1").withParam("c2").build(); @@ -85,7 +94,7 @@ public void testBuildDockerFileExplicitTCPPort() throws Exception { String expected = loadFile("docker/Dockerfile_tcp.test"); assertEquals(expected, stripCR(dockerfileContent)); } - + @Test(expected=IllegalArgumentException.class) public void testBuildDockerFileBadPort() throws Exception { Arguments a = Arguments.Builder.get().withParam("c1").withParam("c2").build(); @@ -101,7 +110,7 @@ public void testBuildDockerFileBadPort() throws Exception { .volumes(Collections.singletonList("/vol1")) .run(Arrays.asList("echo something", "echo second")) .content(); - } + } @Test(expected=IllegalArgumentException.class) public void testBuildDockerFileBadProtocol() throws Exception { @@ -118,7 +127,7 @@ public void testBuildDockerFileBadProtocol() throws Exception { .volumes(Collections.singletonList("/vol1")) .run(Arrays.asList("echo something", "echo second")) .content(); - } + } @Test public void testDockerFileOptimisation() throws Exception { diff --git a/src/test/resources/docker/Dockerfile.multiline_label.test b/src/test/resources/docker/Dockerfile.multiline_label.test index 90597d531..2584b05af 100644 --- a/src/test/resources/docker/Dockerfile.multiline_label.test +++ b/src/test/resources/docker/Dockerfile.multiline_label.test @@ -1,5 +1,5 @@ FROM image -LABEL key=unquoted flag="" some-json="{\ +LABEL key=unquoted flag="" with_space="1.fc nuremberg" some-json="{\ \"key\": \"value\"\ }\ "