Skip to content

Commit c7bdb67

Browse files
authored
Check for invalid characters in X-Opaque-ID headers (#1873)
This commit strips out any non-visible, non-ascii characters from the X-Opaque-ID header. Closes #1872
1 parent bb20a44 commit c7bdb67

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,10 +768,27 @@ public String save() {
768768
public abstract Properties asProperties();
769769

770770
public Settings setOpaqueId(String opaqueId) {
771-
setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, opaqueId);
771+
setProperty(ES_NET_HTTP_HEADER_OPAQUE_ID, cleanOpaqueId(opaqueId));
772772
return this;
773773
}
774774

775+
/**
776+
* Headers can't contain newlines or non-ascii characters. This method strips them out, returning whatever is left.
777+
* @param opaqueId
778+
* @return
779+
*/
780+
private String cleanOpaqueId(String opaqueId) {
781+
char[] chars = opaqueId.toCharArray();
782+
StringBuilder cleanedOpaqueId = new StringBuilder(chars.length);
783+
for (int i = 0; i < chars.length; i++) {
784+
int character = chars[i];
785+
if (character > 31 && character < 127) { //visible ascii
786+
cleanedOpaqueId.append(chars[i]);
787+
}
788+
}
789+
return cleanedOpaqueId.toString();
790+
}
791+
775792
public String getOpaqueId() {
776793
return getProperty(ES_NET_HTTP_HEADER_OPAQUE_ID);
777794
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.elasticsearch.hadoop.cfg;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import java.io.InputStream;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.Properties;
10+
11+
import static org.junit.Assert.assertEquals;
12+
13+
public class SettingsTest {
14+
@Test
15+
public void getXOpaqueId() throws Exception {
16+
TestSettings testSettings = new TestSettings();
17+
String opaqueId1 = "This is an opaque ID";
18+
testSettings.setOpaqueId(opaqueId1);
19+
assertEquals(opaqueId1, testSettings.getOpaqueId());
20+
testSettings.setOpaqueId("This one\n has newlines\r\n and a carriage return");
21+
assertEquals("This one has newlines and a carriage return", testSettings.getOpaqueId());
22+
testSettings.setOpaqueId("This oñe has a non-ascii character");
23+
assertEquals("This oe has a non-ascii character", testSettings.getOpaqueId());
24+
}
25+
26+
public static class TestSettings extends Settings {
27+
private Map<String, String> actualSettings = new HashMap();
28+
@Override
29+
public InputStream loadResource(String location) {
30+
return null;
31+
}
32+
33+
@Override
34+
public Settings copy() {
35+
return null;
36+
}
37+
38+
@Override
39+
public String getProperty(String name) {
40+
return actualSettings.get(name);
41+
}
42+
43+
@Override
44+
public void setProperty(String name, String value) {
45+
actualSettings.put(name, value);
46+
}
47+
48+
@Override
49+
public Properties asProperties() {
50+
return null;
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)