Skip to content

Commit a6c7776

Browse files
fix: Remove vulnerable transitive dependencies (plexus-utils, kotlin-stdlib)
- Replace gson-jodatime-serialisers with inline DateTime serializer using ISODateTimeFormat.dateTime() - Remove gson-jodatime-serialisers 1.8.0 from pom.xml, eliminating transitive kotlin-stdlib 1.3.21 - Move plexus-utils from <dependencies> to <dependencyManagement> at version 4.0.3 - Add format-parity test to verify identical ISO 8601 serialization output
1 parent 65adae8 commit a6c7776

3 files changed

Lines changed: 55 additions & 16 deletions

File tree

pom.xml

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,7 @@
249249
<artifactId>joda-time</artifactId>
250250
<version>2.10.6</version>
251251
</dependency>
252-
<dependency>
253-
<groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
254-
<artifactId>gson-jodatime-serialisers</artifactId>
255-
<version>1.8.0</version>
256-
</dependency>
252+
257253
<dependency>
258254
<groupId>org.apache.maven.surefire</groupId>
259255
<artifactId>surefire</artifactId>
@@ -293,14 +289,17 @@
293289
<scope>test</scope>
294290
</dependency>
295291

296-
<!-- Specify versions of transitive dependencies
297-
plexus:plexus-utils introduced through jacoco-maven-plugin, maven-compiler-plugin, and others
298-
- can be removed when mvn dependency:list shows version 3.0.24 or higher and no snyk reported vulnerabilities
299-
-->
300-
<dependency>
301-
<groupId>org.codehaus.plexus</groupId>
302-
<artifactId>plexus-utils</artifactId>
303-
<version>3.5.1</version>
304-
</dependency>
305292
</dependencies>
293+
294+
<dependencyManagement>
295+
<dependencies>
296+
<!-- Pin plexus-utils for Maven plugin resolution only (not shipped to consumers).
297+
Transitive dep of jacoco-maven-plugin, maven-compiler-plugin, and others. -->
298+
<dependency>
299+
<groupId>org.codehaus.plexus</groupId>
300+
<artifactId>plexus-utils</artifactId>
301+
<version>4.0.3</version>
302+
</dependency>
303+
</dependencies>
304+
</dependencyManagement>
306305
</project>

src/main/java/com/recurly/v3/JsonSerializer.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.recurly.v3;
22

3-
import com.fatboyindustrial.gsonjodatime.Converters;
43
import com.google.gson.*;
54
import com.google.gson.annotations.SerializedName;
65
import com.google.gson.reflect.TypeToken;
@@ -15,6 +14,7 @@
1514
import java.util.Map;
1615

1716
import org.joda.time.DateTime;
17+
import org.joda.time.format.ISODateTimeFormat;
1818

1919
public class JsonSerializer {
2020
private class DateDeserializer implements JsonDeserializer<DateTime> {
@@ -25,7 +25,14 @@ public DateTime deserialize(JsonElement element, Type arg1, JsonDeserializationC
2525
}
2626
}
2727

28-
private final Gson gsonSerializer = Converters.registerDateTime(new GsonBuilder()).create();
28+
private final Gson gsonSerializer =
29+
new GsonBuilder()
30+
.registerTypeAdapter(
31+
DateTime.class,
32+
(com.google.gson.JsonSerializer<DateTime>)
33+
(src, typeOfSrc, context) ->
34+
new JsonPrimitive(ISODateTimeFormat.dateTime().print(src)))
35+
.create();
2936
private final Gson gsonDeserializer =
3037
new GsonBuilder()
3138
.excludeFieldsWithoutExposeAnnotation()

src/test/java/com/recurly/v3/JsonSerializerTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.recurly.v3;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
45

56
import com.recurly.v3.fixtures.DateTimeTestClass;
67
import com.recurly.v3.fixtures.FixtureConstants;
78
import com.recurly.v3.fixtures.MyRequest;
89
import com.recurly.v3.fixtures.MyResource;
910
import com.recurly.v3.Constants;
1011
import org.joda.time.DateTime;
12+
import org.joda.time.DateTimeZone;
13+
import org.joda.time.format.ISODateTimeFormat;
1114
import org.junit.jupiter.api.Test;
1215

1316
public class JsonSerializerTest {
@@ -125,6 +128,36 @@ private static String getDateTimesJson() {
125128
+ "}";
126129
}
127130

131+
@Test
132+
public void testDateTimeSerializationFormatParity() {
133+
final JsonSerializer jsonSerializer = new JsonSerializer();
134+
135+
// Verify the inline serializer produces the same ISO 8601 output
136+
// as ISODateTimeFormat.dateTime() (which the removed library used)
137+
final DateTime dt = new DateTime(2019, 5, 31, 15, 31, 24, 99, DateTimeZone.UTC);
138+
final String expected = ISODateTimeFormat.dateTime().print(dt);
139+
140+
final MyRequest request = new MyRequest();
141+
request.setMyDateTime(dt);
142+
final String serialized = jsonSerializer.serialize(request);
143+
144+
assertTrue(serialized.contains("\"" + expected + "\""),
145+
"Serialized JSON should contain ISO 8601 DateTime: " + expected
146+
+ " but got: " + serialized);
147+
148+
// Round-trip: serialize then deserialize and verify field values
149+
final String json = "{\"my_datetime\":\"" + expected + "\"}";
150+
final DateTimeTestClass deserialized =
151+
jsonSerializer.deserialize("{\"date1\":\"" + expected + "\"}", DateTimeTestClass.class);
152+
assertEquals(2019, deserialized.getDate1().getYear());
153+
assertEquals(5, deserialized.getDate1().getMonthOfYear());
154+
assertEquals(31, deserialized.getDate1().getDayOfMonth());
155+
assertEquals(15, deserialized.getDate1().getHourOfDay());
156+
assertEquals(31, deserialized.getDate1().getMinuteOfHour());
157+
assertEquals(24, deserialized.getDate1().getSecondOfMinute());
158+
assertEquals(99, deserialized.getDate1().getMillisOfSecond());
159+
}
160+
128161
private static void checkDateTime(DateTime date) {
129162
assertEquals(DateTime.class, date.getClass());
130163
assertEquals(2019, date.getYear());

0 commit comments

Comments
 (0)