Skip to content

Commit 36aabb4

Browse files
quaffgaryrussell
authored andcommitted
Improve JsonDeserializer to keep compatibility
Since version 2.1.0, spring-kafka add whitelist of trusted packages for security, It will break existing application, It must manual add generic type's package like this.addTrustedPackages(Trade.class.getPackage().getName()), We should add Trade's package as default for class TradeDeserializer extends JsonDeserializer<Trade>. Polishing - also add package if targetType comes from Kafka consumer properties.
1 parent 257d9c3 commit 36aabb4

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

spring-kafka/src/main/java/org/springframework/kafka/support/serializer/JsonDeserializer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
* @author Igor Stepanov
4747
* @author Artem Bilan
4848
* @author Gary Russell
49+
* @author Yanming Zhou
4950
*/
5051
public class JsonDeserializer<T> implements ExtendedDeserializer<T> {
5152

@@ -94,6 +95,7 @@ public JsonDeserializer(Class<T> targetType, ObjectMapper objectMapper) {
9495
targetType = (Class<T>) ResolvableType.forClass(getClass()).getSuperType().resolveGeneric(0);
9596
}
9697
this.targetType = targetType;
98+
addTargetPackageToTrusted();
9799
}
98100

99101
public Jackson2JavaTypeMapper getTypeMapper() {
@@ -135,6 +137,7 @@ else if (configs.get(DEFAULT_VALUE_TYPE) instanceof String) {
135137
else {
136138
throw new IllegalStateException(DEFAULT_VALUE_TYPE + " must be Class or String");
137139
}
140+
addTargetPackageToTrusted();
138141
}
139142
}
140143
catch (ClassNotFoundException | LinkageError e) {
@@ -157,6 +160,12 @@ public void addTrustedPackages(String... packages) {
157160
this.typeMapper.addTrustedPackages(packages);
158161
}
159162

163+
private void addTargetPackageToTrusted() {
164+
if (this.targetType != null) {
165+
addTrustedPackages(this.targetType.getPackage().getName());
166+
}
167+
}
168+
160169
@Override
161170
public T deserialize(String topic, Headers headers, byte[] data) {
162171
JavaType javaType = this.typeMapper.toJavaType(headers);

spring-kafka/src/test/java/org/springframework/kafka/support/serializer/JsonSerializationTests.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016 the original author or authors.
2+
* Copyright 2016-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -24,18 +24,22 @@
2424
import java.util.List;
2525

2626
import org.apache.kafka.common.errors.SerializationException;
27+
import org.apache.kafka.common.header.Headers;
28+
import org.apache.kafka.common.header.internals.RecordHeaders;
2729
import org.apache.kafka.common.serialization.StringDeserializer;
2830
import org.apache.kafka.common.serialization.StringSerializer;
2931
import org.junit.Before;
3032
import org.junit.Test;
3133

34+
import org.springframework.kafka.support.converter.AbstractJavaTypeMapper;
3235
import org.springframework.kafka.support.serializer.testentities.DummyEntity;
3336

3437
import com.fasterxml.jackson.core.JsonParseException;
3538

3639
/**
3740
* @author Igor Stepanov
3841
* @author Artem Bilan
42+
* @author Yanming Zhou
3943
*/
4044
public class JsonSerializationTests {
4145

@@ -47,6 +51,8 @@ public class JsonSerializationTests {
4751

4852
private JsonDeserializer<DummyEntity> jsonReader;
4953

54+
private JsonDeserializer<DummyEntity> dummyEntityJsonDeserializer;
55+
5056
private DummyEntity entity;
5157

5258
private String topic;
@@ -73,6 +79,7 @@ public void init() {
7379
stringReader.configure(new HashMap<String, Object>(), false);
7480
stringWriter = new StringSerializer();
7581
stringWriter.configure(new HashMap<String, Object>(), false);
82+
dummyEntityJsonDeserializer = new DummyEntityJsonDeserializer();
7683
}
7784

7885
/*
@@ -83,6 +90,9 @@ public void init() {
8390
@Test
8491
public void testDeserializeSerializedEntityEquals() {
8592
assertThat(jsonReader.deserialize(topic, jsonWriter.serialize(topic, entity))).isEqualTo(entity);
93+
Headers headers = new RecordHeaders();
94+
headers.add(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME, DummyEntity.class.getName().getBytes());
95+
assertThat(dummyEntityJsonDeserializer.deserialize(topic, headers, jsonWriter.serialize(topic, entity))).isEqualTo(entity);
8696
}
8797

8898
/*
@@ -103,6 +113,18 @@ public void testDeserializeSerializedDummyException() {
103113
catch (Exception e) {
104114
fail("Expected SerializationException, not " + e.getClass());
105115
}
116+
try {
117+
Headers headers = new RecordHeaders();
118+
headers.add(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME, "com.malware.DummyEntity".getBytes());
119+
dummyEntityJsonDeserializer.deserialize(topic, headers, jsonWriter.serialize(topic, entity));
120+
fail("Expected IllegalArgumentException");
121+
}
122+
catch (IllegalArgumentException e) {
123+
assertThat(e.getMessage()).contains("not in the trusted packages");
124+
}
125+
catch (Exception e) {
126+
fail("Expected IllegalArgumentException, not " + e.getClass());
127+
}
106128
}
107129

108130
@Test
@@ -125,4 +147,8 @@ public void testDeserializedJsonNullEqualsNull() {
125147
assertThat(jsonReader.deserialize(topic, null)).isEqualTo(null);
126148
}
127149

150+
static class DummyEntityJsonDeserializer extends JsonDeserializer<DummyEntity> {
151+
152+
}
153+
128154
}

0 commit comments

Comments
 (0)