Skip to content

Commit b8175bc

Browse files
ovidiupopa07jgrandja
authored andcommitted
OidcIdToken cannot be serialized to JSON if token contains claim of type JSONArray or JSONObject
ObjectToListStringConverter and ObjectToMapStringObjectConverter were checking if the source object is of type List or Map and if the first element or key is a String. If we have a JSONArray containing Strings the above check will pass, meaning that a JSONArray will be returned which is not serializable (same applies to JSONObject) With this change, even if the check is passing a new List or Map will be returned. Closes gh-9210
1 parent 00375da commit b8175bc

File tree

4 files changed

+56
-18
lines changed

4 files changed

+56
-18
lines changed

oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/converter/ObjectToListStringConverter.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
5656
if (source == null) {
5757
return null;
5858
}
59-
if (source instanceof List) {
60-
List<?> sourceList = (List<?>) source;
61-
if (!sourceList.isEmpty() && sourceList.get(0) instanceof String) {
62-
return source;
63-
}
64-
}
6559
if (source instanceof Collection) {
6660
Collection<String> results = new ArrayList<>();
6761
for (Object object : ((Collection<?>) source)) {

oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/converter/ObjectToMapStringObjectConverter.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor t
5353
return null;
5454
}
5555
Map<?, ?> sourceMap = (Map<?, ?>) source;
56-
if (!sourceMap.isEmpty() && sourceMap.keySet().iterator().next() instanceof String) {
57-
return source;
58-
}
5956
Map<String, Object> result = new HashMap<>();
6057
sourceMap.forEach((k, v) -> result.put(k.toString(), v));
6158
return result;

oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/converter/ClaimConversionServiceTests.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.util.List;
2727
import java.util.Map;
2828

29+
import com.nimbusds.jose.shaded.json.JSONArray;
30+
import com.nimbusds.jose.shaded.json.JSONObject;
2931
import org.assertj.core.util.Lists;
3032
import org.junit.Test;
3133

@@ -145,9 +147,9 @@ public void convertCollectionStringWhenNullThenReturnNull() {
145147
}
146148

147149
@Test
148-
public void convertCollectionStringWhenListStringThenReturnSame() {
150+
public void convertCollectionStringWhenListStringThenReturnNotSameButEqual() {
149151
List<String> list = Lists.list("1", "2", "3", "4");
150-
assertThat(this.conversionService.convert(list, Collection.class)).isSameAs(list);
152+
assertThat(this.conversionService.convert(list, Collection.class)).isNotSameAs(list).isEqualTo(list);
151153
}
152154

153155
@Test
@@ -156,6 +158,17 @@ public void convertCollectionStringWhenListNumberThenConverts() {
156158
.isEqualTo(Lists.list("1", "2", "3", "4"));
157159
}
158160

161+
@Test
162+
public void convertListStringWhenJsonArrayThenConverts() {
163+
JSONArray jsonArray = new JSONArray();
164+
jsonArray.add("1");
165+
jsonArray.add("2");
166+
jsonArray.add("3");
167+
jsonArray.add(null);
168+
assertThat(this.conversionService.convert(jsonArray, List.class)).isNotInstanceOf(JSONArray.class)
169+
.isEqualTo(Lists.list("1", "2", "3"));
170+
}
171+
159172
@Test
160173
public void convertCollectionStringWhenNotConvertibleThenReturnSingletonList() {
161174
String string = "not-convertible-collection";
@@ -169,9 +182,9 @@ public void convertListStringWhenNullThenReturnNull() {
169182
}
170183

171184
@Test
172-
public void convertListStringWhenListStringThenReturnSame() {
185+
public void convertListStringWhenListStringThenReturnNotSameButEqual() {
173186
List<String> list = Lists.list("1", "2", "3", "4");
174-
assertThat(this.conversionService.convert(list, List.class)).isSameAs(list);
187+
assertThat(this.conversionService.convert(list, List.class)).isNotSameAs(list).isEqualTo(list);
175188
}
176189

177190
@Test
@@ -192,15 +205,16 @@ public void convertMapStringObjectWhenNullThenReturnNull() {
192205
}
193206

194207
@Test
195-
public void convertMapStringObjectWhenMapStringObjectThenReturnSame() {
208+
public void convertMapStringObjectWhenMapStringObjectThenReturnNotSameButEqual() {
196209
Map<String, Object> mapStringObject = new HashMap<String, Object>() {
197210
{
198211
put("key1", "value1");
199212
put("key2", "value2");
200213
put("key3", "value3");
201214
}
202215
};
203-
assertThat(this.conversionService.convert(mapStringObject, Map.class)).isSameAs(mapStringObject);
216+
assertThat(this.conversionService.convert(mapStringObject, Map.class)).isNotSameAs(mapStringObject)
217+
.isEqualTo(mapStringObject);
204218
}
205219

206220
@Test
@@ -222,6 +236,22 @@ public void convertMapStringObjectWhenMapIntegerObjectThenConverts() {
222236
assertThat(this.conversionService.convert(mapIntegerObject, Map.class)).isEqualTo(mapStringObject);
223237
}
224238

239+
@Test
240+
public void convertMapStringObjectWhenJsonObjectThenConverts() {
241+
JSONObject jsonObject = new JSONObject();
242+
jsonObject.put("1", "value1");
243+
jsonObject.put("2", "value2");
244+
245+
Map<String, Object> mapStringObject = new HashMap<String, Object>() {
246+
{
247+
put("1", "value1");
248+
put("2", "value2");
249+
}
250+
};
251+
assertThat(this.conversionService.convert(jsonObject, Map.class)).isNotInstanceOf(JSONObject.class)
252+
.isEqualTo(mapStringObject);
253+
}
254+
225255
@Test
226256
public void convertMapStringObjectWhenNotConvertibleThenReturnNull() {
227257
List<String> notConvertibleList = Lists.list("1", "2", "3", "4");

oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/converter/ClaimTypeConverterTests.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
import java.util.List;
2424
import java.util.Map;
2525

26+
import com.nimbusds.jose.shaded.json.JSONArray;
27+
import com.nimbusds.jose.shaded.json.JSONObject;
2628
import org.assertj.core.util.Lists;
29+
import org.assertj.core.util.Maps;
2730
import org.junit.Before;
2831
import org.junit.Test;
2932

@@ -55,6 +58,10 @@ public class ClaimTypeConverterTests {
5558

5659
private static final String MAP_STRING_OBJECT_CLAIM = "map-string-object-claim";
5760

61+
private static final String JSON_ARRAY_CLAIM = "json-array-claim";
62+
63+
private static final String JSON_OBJECT_CLAIM = "json-object-claim";
64+
5865
private ClaimTypeConverter claimTypeConverter;
5966

6067
@Before
@@ -115,6 +122,12 @@ public void convertWhenAllClaimsRequireConversionThenConvertAll() throws Excepti
115122
mapIntegerObject.put(1, "value1");
116123
Map<String, Object> mapStringObject = new HashMap<>();
117124
mapStringObject.put("1", "value1");
125+
JSONArray jsonArray = new JSONArray();
126+
jsonArray.add("1");
127+
List<String> jsonArrayListString = Lists.list("1");
128+
JSONObject jsonObject = new JSONObject();
129+
jsonObject.put("1", "value1");
130+
Map<String, Object> jsonObjectMap = Maps.newHashMap("1", "value1");
118131
Map<String, Object> claims = new HashMap<>();
119132
claims.put(STRING_CLAIM, Boolean.TRUE);
120133
claims.put(BOOLEAN_CLAIM, "true");
@@ -123,6 +136,8 @@ public void convertWhenAllClaimsRequireConversionThenConvertAll() throws Excepti
123136
claims.put(COLLECTION_STRING_CLAIM, listNumber);
124137
claims.put(LIST_STRING_CLAIM, listNumber);
125138
claims.put(MAP_STRING_OBJECT_CLAIM, mapIntegerObject);
139+
claims.put(JSON_ARRAY_CLAIM, jsonArray);
140+
claims.put(JSON_OBJECT_CLAIM, jsonObject);
126141
claims = this.claimTypeConverter.convert(claims);
127142
assertThat(claims.get(STRING_CLAIM)).isEqualTo("true");
128143
assertThat(claims.get(BOOLEAN_CLAIM)).isEqualTo(Boolean.TRUE);
@@ -131,6 +146,8 @@ public void convertWhenAllClaimsRequireConversionThenConvertAll() throws Excepti
131146
assertThat(claims.get(COLLECTION_STRING_CLAIM)).isEqualTo(listString);
132147
assertThat(claims.get(LIST_STRING_CLAIM)).isEqualTo(listString);
133148
assertThat(claims.get(MAP_STRING_OBJECT_CLAIM)).isEqualTo(mapStringObject);
149+
assertThat(claims.get(JSON_ARRAY_CLAIM)).isEqualTo(jsonArrayListString);
150+
assertThat(claims.get(JSON_OBJECT_CLAIM)).isEqualTo(jsonObjectMap);
134151
}
135152

136153
@Test
@@ -155,9 +172,9 @@ public void convertWhenNoClaimsRequireConversionThenConvertNone() throws Excepti
155172
assertThat(claims.get(BOOLEAN_CLAIM)).isSameAs(bool);
156173
assertThat(claims.get(INSTANT_CLAIM)).isSameAs(instant);
157174
assertThat(claims.get(URL_CLAIM)).isSameAs(url);
158-
assertThat(claims.get(COLLECTION_STRING_CLAIM)).isSameAs(listString);
159-
assertThat(claims.get(LIST_STRING_CLAIM)).isSameAs(listString);
160-
assertThat(claims.get(MAP_STRING_OBJECT_CLAIM)).isSameAs(mapStringObject);
175+
assertThat(claims.get(COLLECTION_STRING_CLAIM)).isNotSameAs(listString).isEqualTo(listString);
176+
assertThat(claims.get(LIST_STRING_CLAIM)).isNotSameAs(listString).isEqualTo(listString);
177+
assertThat(claims.get(MAP_STRING_OBJECT_CLAIM)).isNotSameAs(mapStringObject).isEqualTo(mapStringObject);
161178
}
162179

163180
@Test

0 commit comments

Comments
 (0)