Skip to content

Check for invalid characters in X-Opaque-ID headers #1873

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion mr/src/main/java/org/elasticsearch/hadoop/cfg/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -768,10 +768,27 @@ 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, 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);
}
Expand Down
53 changes: 53 additions & 0 deletions mr/src/test/java/org/elasticsearch/hadoop/cfg/SettingsTest.java
Original file line number Diff line number Diff line change
@@ -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<String, String> 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;
}
}
}