From bd81b387cbd9cda12524673e345048bd2a44709b Mon Sep 17 00:00:00 2001 From: Raihaan Shouhell Date: Tue, 14 Jan 2020 14:33:37 +0800 Subject: [PATCH 1/2] Escape paths with n Signed-off-by: Raihaan Shouhell --- .../plugins/envinject/service/PropertiesLoader.java | 2 +- .../plugins/envinject/sevice/PropertiesLoaderTest.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java b/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java index 4437e77b..405a4972 100644 --- a/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java +++ b/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java @@ -71,7 +71,7 @@ private Map getVars(@Nonnull String content, @Nonnull Map\\\\/])(?![\\\\])(?![\n])", "\\\\\\\\"); + escapedContent = escapedContent.replaceAll("(?\\\\/])(?![\\\\])(?![\n])", "\\\\\\\\"); //Escape windows network shares initial double backslash i.e \\Network\Share escapedContent = escapedContent.replaceAll("(?m)^([^=]+=)(\\\\\\\\)(?![:*?\"<>\\\\/])", "$1\\\\\\\\\\\\\\\\"); diff --git a/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java b/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java index c32ff4aa..811c9a75 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java @@ -173,14 +173,15 @@ public void contentWithBackSlashes() throws Exception { } private void checkWithBackSlashes(boolean fromFile) throws Exception { - String content = "KEY1=Test\\Path\\Variable\nKEY2=C:\\Windows\\Temp\nKEY3=\\\\Test\\Path\\Variable"; + String content = "KEY1=Test\\Path\\Variable\nKEY2=C:\\Windows\\Temp\nKEY3=\\\\Test\\Path\\Variable\nKEY4=C:\\npm"; Map gatherVars = gatherEnvVars(fromFile, content, new HashMap()); assertNotNull(gatherVars); - assertEquals(3, gatherVars.size()); + assertEquals(4, gatherVars.size()); assertEquals("Test\\Path\\Variable", gatherVars.get("KEY1")); assertEquals("C:\\Windows\\Temp", gatherVars.get("KEY2")); assertEquals("\\\\Test\\Path\\Variable", gatherVars.get("KEY3")); + assertEquals("C:\\npm", gatherVars.get("KEY4")); } private Map gatherEnvVars(boolean fromFile, String content2Load, Map currentEnvVars) throws Exception { From de69e481e5d7ba069d91a79533e59612a52c6b18 Mon Sep 17 00:00:00 2001 From: Raihaan Shouhell Date: Wed, 15 Jan 2020 10:04:30 +0800 Subject: [PATCH 2/2] Fix escaping the n character Signed-off-by: Raihaan Shouhell --- .../envinject/service/PropertiesLoader.java | 21 ++++++++++++------- .../sevice/PropertiesLoaderTest.java | 11 +++++----- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java b/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java index 405a4972..dc5a8cc6 100644 --- a/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java +++ b/src/main/java/org/jenkinsci/plugins/envinject/service/PropertiesLoader.java @@ -10,6 +10,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; +import java.util.regex.Pattern; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -69,17 +70,23 @@ public Map getVarsFromPropertiesContent(@Nonnull String content, private Map getVars(@Nonnull String content, @Nonnull Map currentEnvVars) throws EnvInjectException { - // Replace single backslashes with double ones so they won't be removed by Property.load() - String escapedContent = content; - escapedContent = escapedContent.replaceAll("(?\\\\/])(?![\\\\])(?![\n])", "\\\\\\\\"); - //Escape windows network shares initial double backslash i.e \\Network\Share - escapedContent = escapedContent.replaceAll("(?m)^([^=]+=)(\\\\\\\\)(?![:*?\"<>\\\\/])", "$1\\\\\\\\\\\\\\\\"); - + String[] contentArray = content.split("\n"); + content = ""; + //Check if string contains windows network or local paths + for (String s : contentArray) { + if (s.indexOf("=\\\\", 0) != -1 || Pattern.matches("[A-z_0-9]+=[A-z]:\\\\.*", s)) { + // Replace single backslashes with double ones so they won't be removed by Property.load() + s = s.replaceAll("(?\\\\/])(?![\\\\])(?![\n])", "\\\\\\\\"); + //Escape windows network shares initial double backslash i.e \\Network\Share + s = s.replaceAll("(?m)^([^=]+=)(\\\\\\\\)(?![:*?\"<>\\\\/])", "$1\\\\\\\\\\\\\\\\"); + } + content += s + "\n"; + } Map result = new LinkedHashMap<>(); Properties properties = new Properties(); - try (StringReader stringReader = new StringReader(escapedContent)) { + try (StringReader stringReader = new StringReader(content)) { properties.load(stringReader); } catch (IOException ioe) { throw new EnvInjectException("Problem occurs on loading content", ioe); diff --git a/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java b/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java index 811c9a75..591474c0 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/sevice/PropertiesLoaderTest.java @@ -173,15 +173,14 @@ public void contentWithBackSlashes() throws Exception { } private void checkWithBackSlashes(boolean fromFile) throws Exception { - String content = "KEY1=Test\\Path\\Variable\nKEY2=C:\\Windows\\Temp\nKEY3=\\\\Test\\Path\\Variable\nKEY4=C:\\npm"; + String content = "KEY1=C:\\Windows\\Temp\nKEY2=\\\\Test\\Path\\Variable\nKEY3=C:\\npm"; Map gatherVars = gatherEnvVars(fromFile, content, new HashMap()); assertNotNull(gatherVars); - assertEquals(4, gatherVars.size()); + assertEquals(3, gatherVars.size()); - assertEquals("Test\\Path\\Variable", gatherVars.get("KEY1")); - assertEquals("C:\\Windows\\Temp", gatherVars.get("KEY2")); - assertEquals("\\\\Test\\Path\\Variable", gatherVars.get("KEY3")); - assertEquals("C:\\npm", gatherVars.get("KEY4")); + assertEquals("C:\\Windows\\Temp", gatherVars.get("KEY1")); + assertEquals("\\\\Test\\Path\\Variable", gatherVars.get("KEY2")); + assertEquals("C:\\npm", gatherVars.get("KEY3")); } private Map gatherEnvVars(boolean fromFile, String content2Load, Map currentEnvVars) throws Exception {