From f217a768447d6b81b35d253fb5c9d9a7cb90fdba Mon Sep 17 00:00:00 2001 From: Keith Massey Date: Wed, 19 Jan 2022 15:21:04 -0600 Subject: [PATCH 1/2] Removing newlines from X-Opaque-ID header --- mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java b/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java index 2877eacd3..2aaa37a5a 100644 --- a/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java +++ b/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java @@ -768,7 +768,7 @@ public String save() { public abstract Properties asProperties(); public Settings setOpaqueId(String opaqueId) { - setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, opaqueId); + setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, opaqueId.replace("\n", "").replace("\r", "")); return this; } From b8ebe08e3a95058732ae2538c9bea677362727ef Mon Sep 17 00:00:00 2001 From: Keith Massey Date: Wed, 19 Jan 2022 16:50:42 -0600 Subject: [PATCH 2/2] Preventing invalid characters in x-opaque-id header --- .../elasticsearch/hadoop/cfg/Settings.java | 19 ++++++- .../hadoop/cfg/SettingsTest.java | 53 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 mr/src/test/java/org/elasticsearch/hadoop/cfg/SettingsTest.java diff --git a/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java b/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java index 2aaa37a5a..19cc7b0e2 100644 --- a/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java +++ b/mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java @@ -768,10 +768,27 @@ public String save() { public abstract Properties asProperties(); public Settings setOpaqueId(String opaqueId) { - setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, opaqueId.replace("\n", "").replace("\r", "")); + setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, cleanOpaqueId(opaqueId)); return this; } + /** + * Headers can't contain newlines or non-ascii characters. This method strips them out, returning whatever is left. + * @param opaqueId + * @return + */ + private String cleanOpaqueId(String opaqueId) { + char[] chars = opaqueId.toCharArray(); + StringBuilder cleanedOpaqueId = new StringBuilder(chars.length); + for (int i = 0; i < chars.length; i++) { + int character = chars[i]; + if (character > 31 && character < 127) { //visible ascii + cleanedOpaqueId.append(chars[i]); + } + } + return cleanedOpaqueId.toString(); + } + public String getOpaqueId() { return getProperty(ES_NET_HTTP_HEADER_OPAQUE_ID); } diff --git a/mr/src/test/java/org/elasticsearch/hadoop/cfg/SettingsTest.java b/mr/src/test/java/org/elasticsearch/hadoop/cfg/SettingsTest.java new file mode 100644 index 000000000..5165f5393 --- /dev/null +++ b/mr/src/test/java/org/elasticsearch/hadoop/cfg/SettingsTest.java @@ -0,0 +1,53 @@ +package org.elasticsearch.hadoop.cfg; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class SettingsTest { + @Test + public void getXOpaqueId() throws Exception { + TestSettings testSettings = new TestSettings(); + String opaqueId1 = "This is an opaque ID"; + testSettings.setOpaqueId(opaqueId1); + assertEquals(opaqueId1, testSettings.getOpaqueId()); + testSettings.setOpaqueId("This one\n has newlines\r\n and a carriage return"); + assertEquals("This one has newlines and a carriage return", testSettings.getOpaqueId()); + testSettings.setOpaqueId("This oñe has a non-ascii character"); + assertEquals("This oe has a non-ascii character", testSettings.getOpaqueId()); + } + + public static class TestSettings extends Settings { + private Map actualSettings = new HashMap(); + @Override + public InputStream loadResource(String location) { + return null; + } + + @Override + public Settings copy() { + return null; + } + + @Override + public String getProperty(String name) { + return actualSettings.get(name); + } + + @Override + public void setProperty(String name, String value) { + actualSettings.put(name, value); + } + + @Override + public Properties asProperties() { + return null; + } + } +}