Skip to content

Commit af0ad5b

Browse files
committed
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 7a53401 commit af0ad5b

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
@@ -20,6 +20,7 @@
2020
import java.nio.charset.StandardCharsets;
2121
import java.util.Arrays;
2222
import java.util.HashMap;
23+
import java.util.HashSet;
2324
import java.util.LinkedHashSet;
2425
import java.util.List;
2526
import java.util.Map;
@@ -61,6 +62,16 @@ public class DefaultKafkaHeaderMapper extends AbstractKafkaHeaderMapper {
6162

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

65+
private static final Set<String> TRUSTED_ARRAY_TYPES =
66+
new HashSet<>(Arrays.asList(
67+
"[B",
68+
"[I",
69+
"[J",
70+
"[F",
71+
"[D",
72+
"[C"
73+
));
74+
6475
private static final List<String> DEFAULT_TRUSTED_PACKAGES =
6576
Arrays.asList(
6677
"java.lang",
@@ -362,12 +373,16 @@ protected boolean trusted(String requestedType) {
362373
if (requestedType.equals(NonTrustedHeaderType.class.getName())) {
363374
return true;
364375
}
376+
if (TRUSTED_ARRAY_TYPES.contains(requestedType)) {
377+
return true;
378+
}
379+
String type = requestedType.startsWith("[") ? requestedType.substring(2) : requestedType;
365380
if (!this.trustedPackages.isEmpty()) {
366-
int lastDot = requestedType.lastIndexOf('.');
381+
int lastDot = type.lastIndexOf('.');
367382
if (lastDot < 0) {
368383
return false;
369384
}
370-
String packageName = requestedType.substring(0, lastDot);
385+
String packageName = type.substring(0, lastDot);
371386
for (String trustedPackage : this.trustedPackages) {
372387
if (packageName.equals(trustedPackage) || packageName.startsWith(trustedPackage + ".")) {
373388
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
@@ -66,10 +66,23 @@ void testTrustedAndNot() {
6666
.setHeader("simpleContentType", MimeTypeUtils.TEXT_PLAIN_VALUE)
6767
.setHeader("customToString", new Bar("fiz"))
6868
.setHeader("uri", URI.create("https://foo.bar"))
69+
.setHeader("intA", new int[] { 42 })
70+
.setHeader("longA", new long[] { 42L })
71+
.setHeader("floatA", new float[] { 1.0f })
72+
.setHeader("doubleA", new double[] { 1.0 })
73+
.setHeader("charA", new char[] { 'c' })
74+
.setHeader("boolA", new boolean[] { true })
75+
.setHeader("IntA", new Integer[] { 42 })
76+
.setHeader("LongA", new Long[] { 42L })
77+
.setHeader("FloatA", new Float[] { 1.0f })
78+
.setHeader("DoubleA", new Double[] { 1.0 })
79+
.setHeader("CharA", new Character[] { 'c' })
80+
.setHeader("BoolA", new Boolean[] { true })
81+
.setHeader("stringA", new String[] { "array" })
6982
.build();
7083
RecordHeaders recordHeaders = new RecordHeaders();
7184
mapper.fromHeaders(message.getHeaders(), recordHeaders);
72-
assertThat(recordHeaders.toArray().length).isEqualTo(10); // 9 + json_types
85+
assertThat(recordHeaders.toArray().length).isEqualTo(23); // 21 + json_types
7386
Map<String, Object> headers = new HashMap<>();
7487
mapper.toHeaders(recordHeaders, headers);
7588
assertThat(headers.get("foo")).isInstanceOf(byte[].class);
@@ -83,10 +96,21 @@ void testTrustedAndNot() {
8396
assertThat(headers.get(MessageHeaders.ERROR_CHANNEL)).isEqualTo("errors");
8497
assertThat(headers.get("customToString")).isEqualTo("Bar [field=fiz]");
8598
assertThat(headers.get("uri")).isEqualTo(URI.create("https://foo.bar"));
99+
assertThat(headers.get("intA")).isEqualTo(new int[] { 42 });
100+
assertThat(headers.get("longA")).isEqualTo(new long[] { 42L });
101+
assertThat(headers.get("floatA")).isEqualTo(new float[] { 1.0f });
102+
assertThat(headers.get("doubleA")).isEqualTo(new double[] { 1.0 });
103+
assertThat(headers.get("charA")).isEqualTo(new char[] { 'c' });
104+
assertThat(headers.get("IntA")).isEqualTo(new Integer[] { 42 });
105+
assertThat(headers.get("LongA")).isEqualTo(new Long[] { 42L });
106+
assertThat(headers.get("FloatA")).isEqualTo(new Float[] { 1.0f });
107+
assertThat(headers.get("DoubleA")).isEqualTo(new Double[] { 1.0 });
108+
assertThat(headers.get("CharA")).isEqualTo(new Character[] { 'c' });
109+
assertThat(headers.get("stringA")).isEqualTo(new String[] { "array" });
86110
NonTrustedHeaderType ntht = (NonTrustedHeaderType) headers.get("fix");
87111
assertThat(ntht.getHeaderValue()).isNotNull();
88112
assertThat(ntht.getUntrustedType()).isEqualTo(Foo.class.getName());
89-
assertThat(headers).hasSize(9);
113+
assertThat(headers).hasSize(22);
90114

91115
mapper.addTrustedPackages(getClass().getPackage().getName());
92116
headers = new HashMap<>();
@@ -95,7 +119,7 @@ void testTrustedAndNot() {
95119
assertThat(new String((byte[]) headers.get("foo"))).isEqualTo("bar");
96120
assertThat(headers.get("baz")).isEqualTo("qux");
97121
assertThat(headers.get("fix")).isEqualTo(new Foo());
98-
assertThat(headers).hasSize(9);
122+
assertThat(headers).hasSize(22);
99123
}
100124

101125
@Test

0 commit comments

Comments
 (0)