Skip to content

Commit 7da55bb

Browse files
fixing the security issues (#94)
1 parent 4afccde commit 7da55bb

14 files changed

+134
-80
lines changed

pom.xml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
<name>client-encryption</name>
1414

1515
<properties>
16-
<okhttp2-version>2.7.5</okhttp2-version>
1716
<okhttp3-version>4.12.0</okhttp3-version>
18-
<google-api-client-version>2.3.0</google-api-client-version>
19-
<feign-version>9.7.0</feign-version>
17+
<google-api-client-version>2.4.0</google-api-client-version>
18+
<feign-version>13.2.1</feign-version>
2019
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2120
<gpg.signature.skip>false</gpg.signature.skip>
2221
</properties>
@@ -69,13 +68,6 @@
6968
<scope>provided</scope>
7069
</dependency>
7170

72-
<dependency>
73-
<groupId>com.squareup.okhttp</groupId>
74-
<artifactId>okhttp</artifactId>
75-
<version>${okhttp2-version}</version>
76-
<scope>provided</scope>
77-
</dependency>
78-
7971
<dependency>
8072
<groupId>com.google.api-client</groupId>
8173
<artifactId>google-api-client</artifactId>

src/main/java/com/mastercard/developer/interceptors/OkHttp2EncryptionInterceptor.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import com.mastercard.developer.encryption.EncryptionConfig;
44
import com.mastercard.developer.encryption.EncryptionException;
5-
import com.squareup.okhttp.Request;
6-
import com.squareup.okhttp.RequestBody;
7-
import com.squareup.okhttp.Response;
8-
import com.squareup.okhttp.ResponseBody;
9-
import com.squareup.okhttp.Interceptor;
5+
import okhttp3.Request;
6+
import okhttp3.RequestBody;
7+
import okhttp3.Response;
8+
import okhttp3.ResponseBody;
9+
import okhttp3.Interceptor;
1010
import okio.Buffer;
1111
import java.io.IOException;
1212
import static com.mastercard.developer.utils.StringUtils.isNullOrEmpty;
@@ -15,7 +15,7 @@ public abstract class OkHttp2EncryptionInterceptor implements Interceptor {
1515

1616
protected abstract String encryptPayload(Request request, Request.Builder newBuilder, String requestPayload) throws EncryptionException;
1717

18-
protected abstract String decryptPayload(com.squareup.okhttp.Response response, com.squareup.okhttp.Response.Builder newBuilder, String responsePayload) throws EncryptionException;
18+
protected abstract String decryptPayload(Response response, Response.Builder newBuilder, String responsePayload) throws EncryptionException;
1919

2020
public static OkHttp2EncryptionInterceptor from(EncryptionConfig config) {
2121
return config.getScheme().equals(EncryptionConfig.Scheme.JWE) ? new OkHttp2JweInterceptor(config) : new OkHttp2FieldLevelEncryptionInterceptor(config);
@@ -48,7 +48,7 @@ private Request handleRequest(Request request) throws IOException {
4848
Request.Builder requestBuilder = request.newBuilder();
4949
String encryptedPayload = encryptPayload(request, requestBuilder, requestPayload);
5050

51-
RequestBody encryptedBody = RequestBody.create(requestBody.contentType(), encryptedPayload);
51+
RequestBody encryptedBody = RequestBody.create(encryptedPayload.getBytes(), requestBody.contentType());
5252
return requestBuilder
5353
.method(request.method(), encryptedBody)
5454
.header("Content-Length", String.valueOf(encryptedBody.contentLength()))
@@ -79,7 +79,7 @@ private Response handleResponse(Response response) throws IOException {
7979
Response.Builder responseBuilder = response.newBuilder();
8080
String decryptedPayload = decryptPayload(response, responseBuilder, responsePayload);
8181

82-
try (ResponseBody decryptedBody = ResponseBody.create(responseBody.contentType(), decryptedPayload)) {
82+
try (ResponseBody decryptedBody = ResponseBody.create(decryptedPayload.getBytes(), responseBody.contentType())) {
8383
return responseBuilder
8484
.body(decryptedBody)
8585
.header("Content-Length", String.valueOf(decryptedBody.contentLength()))
@@ -89,4 +89,5 @@ private Response handleResponse(Response response) throws IOException {
8989
throw new IOException("Failed to intercept and decrypt response!", e);
9090
}
9191
}
92+
9293
}

src/main/java/com/mastercard/developer/interceptors/OkHttp2FieldLevelEncryptionInterceptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.mastercard.developer.interceptors;
22

33
import com.mastercard.developer.encryption.*;
4-
import com.squareup.okhttp.*;
4+
import okhttp3.Request;
5+
import okhttp3.Response;
6+
57

68
/**
79
* An OkHttp2 interceptor for encrypting/decrypting parts of HTTP payloads.

src/main/java/com/mastercard/developer/interceptors/OkHttp2JweInterceptor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
import com.mastercard.developer.encryption.EncryptionException;
55
import com.mastercard.developer.encryption.JweConfig;
66
import com.mastercard.developer.encryption.JweEncryption;
7-
import com.squareup.okhttp.Request;
8-
import com.squareup.okhttp.Response;
7+
import okhttp3.Request;
8+
import okhttp3.Response;
9+
910

1011
/**
1112
* An OkHttp2 JWE interceptor for encrypting/decrypting parts of HTTP payloads.

src/main/java/com/mastercard/developer/interceptors/OpenFeignDecoderExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public Object decode(Response response, Type type) throws IOException {
4242
}
4343

4444
// Read response payload
45-
String responsePayload = Util.toString(body.asReader());
45+
String responsePayload = Util.toString(body.asReader(StandardCharsets.UTF_8));
4646

4747
// Decrypt fields & update headers
4848
String decryptedPayload = decryptPayload(response, responsePayload);
@@ -53,7 +53,7 @@ public Object decode(Response response, Type type) throws IOException {
5353
.body(decryptedPayload, StandardCharsets.UTF_8)
5454
.build();
5555
} catch (EncryptionException e) {
56-
throw new DecodeException("Failed to intercept and decrypt response!", e);
56+
throw new DecodeException(response.status(), "Failed to intercept and decrypt response!", response.request(), e);
5757
}
5858

5959
// Call the regular decoder

src/test/java/com/mastercard/developer/interceptors/OkHttp2FieldLevelEncryptionInterceptorTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
import com.mastercard.developer.encryption.EncryptionException;
55
import com.mastercard.developer.encryption.FieldLevelEncryptionConfig;
66
import com.mastercard.developer.test.TestUtils;
7-
import com.squareup.okhttp.*;
7+
import okhttp3.MediaType;
8+
import okhttp3.Protocol;
9+
import okhttp3.Request;
10+
import okhttp3.RequestBody;
11+
import okhttp3.Response;
12+
import okhttp3.ResponseBody;
813
import okio.Buffer;
914
import org.junit.Rule;
1015
import org.junit.Test;
@@ -15,11 +20,12 @@
1520

1621
import static com.mastercard.developer.test.TestUtils.assertPayloadEquals;
1722
import static com.mastercard.developer.test.TestUtils.getTestFieldLevelEncryptionConfigBuilder;
18-
import static com.squareup.okhttp.Interceptor.Chain;
23+
import static okhttp3.Interceptor.Chain;
1924
import static org.hamcrest.core.Is.isA;
2025
import static org.junit.Assert.*;
2126
import static org.mockito.Mockito.*;
2227

28+
2329
public class OkHttp2FieldLevelEncryptionInterceptorTest {
2430

2531
private static final MediaType JSON_MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
@@ -143,6 +149,7 @@ public void testIntercept_ShouldDecryptResponsePayloadAndUpdateContentLengthHead
143149
.request(request)
144150
.code(200)
145151
.protocol(Protocol.HTTP_1_1)
152+
.message("")
146153
.build();
147154
Chain chain = mock(Chain.class);
148155
when(request.body()).thenReturn(null);

src/test/java/com/mastercard/developer/interceptors/OkHttp2JweInterceptorTest.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package com.mastercard.developer.interceptors;
22

3-
import com.mastercard.developer.encryption.*;
4-
import com.squareup.okhttp.*;
3+
import com.mastercard.developer.encryption.EncryptionConfig;
4+
import com.mastercard.developer.encryption.EncryptionException;
5+
import com.mastercard.developer.encryption.JweConfig;
6+
import okhttp3.Protocol;
7+
import okhttp3.Request;
8+
import okhttp3.RequestBody;
9+
import okhttp3.Response;
10+
import okhttp3.ResponseBody;
11+
import okhttp3.MediaType;
512
import okio.Buffer;
613
import org.junit.Rule;
714
import org.junit.Test;
@@ -12,10 +19,16 @@
1219

1320
import static com.mastercard.developer.test.TestUtils.assertPayloadEquals;
1421
import static com.mastercard.developer.test.TestUtils.getTestJweConfigBuilder;
15-
import static com.squareup.okhttp.Interceptor.Chain;
22+
import static okhttp3.Interceptor.Chain;
1623
import static org.hamcrest.core.Is.isA;
17-
import static org.junit.Assert.*;
18-
import static org.mockito.Mockito.*;
24+
import static org.junit.Assert.assertEquals;
25+
import static org.junit.Assert.assertFalse;
26+
import static org.junit.Assert.assertTrue;
27+
import static org.mockito.Mockito.any;
28+
import static org.mockito.Mockito.mock;
29+
import static org.mockito.Mockito.verify;
30+
import static org.mockito.Mockito.verifyNoMoreInteractions;
31+
import static org.mockito.Mockito.when;
1932

2033
public class OkHttp2JweInterceptorTest {
2134

@@ -106,6 +119,7 @@ public void testIntercept_ShouldDecryptResponsePayloadAndUpdateContentLengthHead
106119
.request(request)
107120
.code(200)
108121
.protocol(Protocol.HTTP_1_1)
122+
.message("")
109123
.build();
110124
Chain chain = mock(Chain.class);
111125
when(request.body()).thenReturn(null);
@@ -136,6 +150,7 @@ public void testInterceptResponse_ShouldDecryptWithA128CBC_HS256Encryption() thr
136150
.body(ResponseBody.create(JSON_MEDIA_TYPE, encryptedPayload))
137151
.request(request)
138152
.code(200)
153+
.message("")
139154
.protocol(Protocol.HTTP_1_1)
140155
.build();
141156
Chain chain = mock(Chain.class);

src/test/java/com/mastercard/developer/interceptors/OkHttpFieldLevelEncryptionInterceptorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
import com.mastercard.developer.encryption.EncryptionException;
55
import com.mastercard.developer.encryption.FieldLevelEncryptionConfig;
66
import com.mastercard.developer.test.TestUtils;
7-
import okhttp3.*;
7+
import okhttp3.Protocol;
8+
import okhttp3.Request;
9+
import okhttp3.RequestBody;
10+
import okhttp3.Response;
11+
import okhttp3.ResponseBody;
12+
import okhttp3.MediaType;
813
import okio.Buffer;
914
import org.junit.Rule;
1015
import org.junit.Test;

src/test/java/com/mastercard/developer/interceptors/OkHttpJweInterceptorTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
import com.mastercard.developer.encryption.EncryptionConfig;
44
import com.mastercard.developer.encryption.EncryptionException;
55
import com.mastercard.developer.encryption.JweConfig;
6-
import okhttp3.*;
6+
import okhttp3.Protocol;
7+
import okhttp3.Request;
8+
import okhttp3.RequestBody;
9+
import okhttp3.Response;
10+
import okhttp3.ResponseBody;
11+
import okhttp3.MediaType;
712
import okio.Buffer;
813
import org.junit.Rule;
914
import org.junit.Test;

src/test/java/com/mastercard/developer/interceptors/OpenFeignFieldLevelEncryptionDecoderTest.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,23 @@
1212
import org.mockito.ArgumentCaptor;
1313

1414
import java.lang.reflect.Type;
15-
import java.nio.charset.StandardCharsets;
1615
import java.util.Collection;
1716
import java.util.Collections;
1817
import java.util.HashMap;
1918

2019
import static com.mastercard.developer.test.TestUtils.assertPayloadEquals;
2120
import static com.mastercard.developer.test.TestUtils.getTestFieldLevelEncryptionConfigBuilder;
2221
import static com.mastercard.developer.utils.FeignUtils.readHeader;
22+
import static com.mastercard.developer.utils.HttpHelpers.buildDummyRequest;
23+
import static com.mastercard.developer.utils.HttpHelpers.buildResponse;
2324
import static org.hamcrest.core.Is.isA;
24-
import static org.junit.Assert.*;
25+
import static org.junit.Assert.assertEquals;
26+
import static org.junit.Assert.assertNull;
2527
import static org.mockito.ArgumentMatchers.any;
26-
import static org.mockito.Mockito.*;
28+
import static org.mockito.Mockito.mock;
29+
import static org.mockito.Mockito.verify;
30+
import static org.mockito.Mockito.verifyNoMoreInteractions;
31+
import static org.mockito.Mockito.when;
2732

2833
public class OpenFeignFieldLevelEncryptionDecoderTest {
2934

@@ -52,11 +57,7 @@ public void testDecode_ShouldDecryptResponsePayloadAndUpdateContentLengthHeader(
5257
put("content-length", Collections.singleton("100"));
5358
}
5459
};
55-
Response response = Response.builder()
56-
.status(200)
57-
.headers(headers)
58-
.body(encryptedPayload, StandardCharsets.UTF_8)
59-
.build();
60+
Response response = buildResponse(encryptedPayload);
6061
Decoder delegate = mock(Decoder.class);
6162

6263
// WHEN
@@ -99,7 +100,7 @@ public void testDecode_ShouldDoNothing_WhenEmptyPayload() throws Exception {
99100
FieldLevelEncryptionConfig config = getTestFieldLevelEncryptionConfigBuilder().build();
100101
Type type = mock(Type.class);
101102
Response response = mock(Response.class);
102-
when(response.body()).thenReturn(buildResponseBody(""));
103+
when(response.body()).thenReturn(buildResponse("").body());
103104
Decoder delegate = mock(Decoder.class);
104105

105106
// WHEN
@@ -128,7 +129,8 @@ public void testDecode_ShouldThrowDecodeException_WhenDecryptionFails() throws E
128129
.build();
129130
Type type = mock(Type.class);
130131
Response response = mock(Response.class);
131-
when(response.body()).thenReturn(buildResponseBody(encryptedPayload));
132+
when(response.body()).thenReturn(buildResponse(encryptedPayload).body());
133+
when(response.request()).thenReturn(buildDummyRequest(encryptedPayload));
132134
Decoder delegate = mock(Decoder.class);
133135

134136
// THEN
@@ -170,11 +172,7 @@ public void testDecode_ShouldDecryptResponsePayloadAndRemoveEncryptionHttpHeader
170172
put("x-encryption-certificate-fingerprint", Collections.singleton("80810fc13a8319fcf0e2ec322c82a4c304b782cc3ce671176343cfe8160c2279"));
171173
}
172174
};
173-
Response response = Response.builder()
174-
.status(200)
175-
.headers(headers)
176-
.body(encryptedPayload, StandardCharsets.UTF_8)
177-
.build();
175+
Response response = buildResponse(encryptedPayload, headers);
178176
Decoder delegate = mock(Decoder.class);
179177

180178
// WHEN
@@ -195,12 +193,4 @@ public void testDecode_ShouldDecryptResponsePayloadAndRemoveEncryptionHttpHeader
195193
assertNull(readHeader(responseValue, "x-encryption-certificate-fingerprint"));
196194
}
197195

198-
private static Response.Body buildResponseBody(String payload) {
199-
Response response = Response.builder()
200-
.status(200)
201-
.headers(new HashMap<>())
202-
.body(payload, StandardCharsets.UTF_8)
203-
.build();
204-
return response.body();
205-
}
206196
}

0 commit comments

Comments
 (0)