Skip to content

Commit 72b9dd2

Browse files
garyrussellartembilan
authored andcommitted
GH-1550: DefaultKafkaHeaderMapper - trust arrays
Resolves #1550 - trust arrays of trusted types (including arrays of primitive wrappers and String)) - trust arrays of primitives
1 parent f947d9f commit 72b9dd2

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

spring-kafka/src/main/java/org/springframework/kafka/support/DefaultKafkaHeaderMapper.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.charset.StandardCharsets;
2222
import java.util.Arrays;
2323
import java.util.HashMap;
24+
import java.util.HashSet;
2425
import java.util.LinkedHashSet;
2526
import java.util.List;
2627
import java.util.Map;
@@ -62,6 +63,16 @@ public class DefaultKafkaHeaderMapper extends AbstractKafkaHeaderMapper {
6263

6364
private static final String JAVA_LANG_STRING = "java.lang.String";
6465

66+
private static final Set<String> TRUSTED_ARRAY_TYPES =
67+
new HashSet<>(Arrays.asList(
68+
"[B",
69+
"[I",
70+
"[J",
71+
"[F",
72+
"[D",
73+
"[C"
74+
));
75+
6576
private static final List<String> DEFAULT_TRUSTED_PACKAGES =
6677
Arrays.asList(
6778
"java.lang",
@@ -366,12 +377,16 @@ protected boolean trusted(String requestedType) {
366377
if (requestedType.equals(NonTrustedHeaderType.class.getName())) {
367378
return true;
368379
}
380+
if (TRUSTED_ARRAY_TYPES.contains(requestedType)) {
381+
return true;
382+
}
383+
String type = requestedType.startsWith("[") ? requestedType.substring(2) : requestedType;
369384
if (!this.trustedPackages.isEmpty()) {
370-
int lastDot = requestedType.lastIndexOf('.');
385+
int lastDot = type.lastIndexOf('.');
371386
if (lastDot < 0) {
372387
return false;
373388
}
374-
String packageName = requestedType.substring(0, lastDot);
389+
String packageName = type.substring(0, lastDot);
375390
for (String trustedPackage : this.trustedPackages) {
376391
if (packageName.equals(trustedPackage) || packageName.startsWith(trustedPackage + ".")) {
377392
return true;

spring-kafka/src/test/java/org/springframework/kafka/support/DefaultKafkaHeaderMapperTests.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,23 @@ void testTrustedAndNot() {
6868
.setHeader("simpleContentType", MimeTypeUtils.TEXT_PLAIN_VALUE)
6969
.setHeader("customToString", new Bar("fiz"))
7070
.setHeader("uri", URI.create("https://foo.bar"))
71+
.setHeader("intA", new int[] { 42 })
72+
.setHeader("longA", new long[] { 42L })
73+
.setHeader("floatA", new float[] { 1.0f })
74+
.setHeader("doubleA", new double[] { 1.0 })
75+
.setHeader("charA", new char[] { 'c' })
76+
.setHeader("boolA", new boolean[] { true })
77+
.setHeader("IntA", new Integer[] { 42 })
78+
.setHeader("LongA", new Long[] { 42L })
79+
.setHeader("FloatA", new Float[] { 1.0f })
80+
.setHeader("DoubleA", new Double[] { 1.0 })
81+
.setHeader("CharA", new Character[] { 'c' })
82+
.setHeader("BoolA", new Boolean[] { true })
83+
.setHeader("stringA", new String[] { "array" })
7184
.build();
7285
RecordHeaders recordHeaders = new RecordHeaders();
7386
mapper.fromHeaders(message.getHeaders(), recordHeaders);
74-
assertThat(recordHeaders.toArray().length).isEqualTo(10); // 9 + json_types
87+
assertThat(recordHeaders.toArray().length).isEqualTo(23); // 21 + json_types
7588
Map<String, Object> headers = new HashMap<>();
7689
mapper.toHeaders(recordHeaders, headers);
7790
assertThat(headers.get("foo")).isInstanceOf(byte[].class);
@@ -85,10 +98,21 @@ void testTrustedAndNot() {
8598
assertThat(headers.get(MessageHeaders.ERROR_CHANNEL)).isEqualTo("errors");
8699
assertThat(headers.get("customToString")).isEqualTo("Bar [field=fiz]");
87100
assertThat(headers.get("uri")).isEqualTo(URI.create("https://foo.bar"));
101+
assertThat(headers.get("intA")).isEqualTo(new int[] { 42 });
102+
assertThat(headers.get("longA")).isEqualTo(new long[] { 42L });
103+
assertThat(headers.get("floatA")).isEqualTo(new float[] { 1.0f });
104+
assertThat(headers.get("doubleA")).isEqualTo(new double[] { 1.0 });
105+
assertThat(headers.get("charA")).isEqualTo(new char[] { 'c' });
106+
assertThat(headers.get("IntA")).isEqualTo(new Integer[] { 42 });
107+
assertThat(headers.get("LongA")).isEqualTo(new Long[] { 42L });
108+
assertThat(headers.get("FloatA")).isEqualTo(new Float[] { 1.0f });
109+
assertThat(headers.get("DoubleA")).isEqualTo(new Double[] { 1.0 });
110+
assertThat(headers.get("CharA")).isEqualTo(new Character[] { 'c' });
111+
assertThat(headers.get("stringA")).isEqualTo(new String[] { "array" });
88112
NonTrustedHeaderType ntht = (NonTrustedHeaderType) headers.get("fix");
89113
assertThat(ntht.getHeaderValue()).isNotNull();
90114
assertThat(ntht.getUntrustedType()).isEqualTo(Foo.class.getName());
91-
assertThat(headers).hasSize(9);
115+
assertThat(headers).hasSize(22);
92116

93117
mapper.addTrustedPackages(getClass().getPackage().getName());
94118
headers = new HashMap<>();
@@ -97,7 +121,7 @@ void testTrustedAndNot() {
97121
assertThat(new String((byte[]) headers.get("foo"))).isEqualTo("bar");
98122
assertThat(headers.get("baz")).isEqualTo("qux");
99123
assertThat(headers.get("fix")).isEqualTo(new Foo());
100-
assertThat(headers).hasSize(9);
124+
assertThat(headers).hasSize(22);
101125
}
102126

103127
@Test

0 commit comments

Comments
 (0)