Skip to content

Commit 778f350

Browse files
ChaithanyaGKzoewangg
authored andcommitted
Fix#1035 Use request header to determine if checksum validation should be enabled in SyncChecksumValidation also
1 parent e36b63c commit 778f350

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/handlers/SyncChecksumValidationInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public Optional<InputStream> modifyHttpResponseContent(Context.ModifyHttpRespons
8686

8787
@Override
8888
public void afterUnmarshalling(Context.AfterUnmarshalling context, ExecutionAttributes executionAttributes) {
89-
if (putObjectChecksumEnabled(context.request(), SYNC, executionAttributes, context.httpResponse())) {
89+
if (putObjectChecksumEnabled(context.request(), SYNC, executionAttributes, context.httpRequest())) {
9090
validatePutObjectChecksum((PutObjectResponse) context.response(), executionAttributes);
9191
}
9292
}

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/handlers/SyncChecksumValidationInterceptorTest.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,22 @@
1717

1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Java6Assertions.assertThatThrownBy;
2021
import static software.amazon.awssdk.core.ClientType.SYNC;
2122
import static software.amazon.awssdk.core.interceptor.SdkExecutionAttribute.CLIENT_TYPE;
2223
import static software.amazon.awssdk.core.interceptor.SdkExecutionAttribute.SERVICE_CONFIG;
2324
import static software.amazon.awssdk.services.s3.checksums.ChecksumConstant.CHECKSUM_ENABLED_RESPONSE_HEADER;
2425
import static software.amazon.awssdk.services.s3.checksums.ChecksumConstant.CONTENT_LENGTH_HEADER;
2526
import static software.amazon.awssdk.services.s3.checksums.ChecksumConstant.ENABLE_MD5_CHECKSUM_HEADER_VALUE;
27+
import static software.amazon.awssdk.services.s3.checksums.ChecksumConstant.SERVER_SIDE_ENCRYPTION_HEADER;
2628
import static software.amazon.awssdk.services.s3.checksums.ChecksumsEnabledValidator.CHECKSUM;
29+
import static software.amazon.awssdk.services.s3.model.ServerSideEncryption.AWS_KMS;
2730

2831
import java.io.IOException;
2932
import java.io.InputStream;
33+
import java.net.URI;
3034
import java.nio.ByteBuffer;
35+
import java.nio.charset.Charset;
3136
import java.util.ArrayList;
3237
import java.util.List;
3338
import java.util.Optional;
@@ -38,19 +43,28 @@
3843
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3944
import software.amazon.awssdk.core.sync.RequestBody;
4045
import software.amazon.awssdk.http.ContentStreamProvider;
46+
import software.amazon.awssdk.http.SdkHttpFullRequest;
47+
import software.amazon.awssdk.http.SdkHttpMethod;
48+
import software.amazon.awssdk.http.SdkHttpRequest;
4149
import software.amazon.awssdk.http.SdkHttpResponse;
4250
import software.amazon.awssdk.services.s3.S3Configuration;
4351
import software.amazon.awssdk.services.s3.checksums.ChecksumCalculatingInputStream;
4452
import software.amazon.awssdk.services.s3.checksums.ChecksumValidatingInputStream;
4553
import software.amazon.awssdk.services.s3.internal.handlers.SyncChecksumValidationInterceptor.ChecksumCalculatingStreamProvider;
4654
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
4755
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
56+
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
4857
import software.amazon.awssdk.services.s3.utils.InterceptorTestUtils;
4958
import software.amazon.awssdk.utils.IoUtils;
5059
import software.amazon.awssdk.utils.StringInputStream;
60+
import software.amazon.awssdk.utils.internal.Base16Lower;
5161

5262
public class SyncChecksumValidationInterceptorTest {
5363

64+
private static final byte[] CONTENT_BYTES = "CONTENT".getBytes(Charset.forName("UTF-8"));
65+
private static final String VALID_CHECKSUM = Base16Lower.encodeAsString(checkSumFor(CONTENT_BYTES).getChecksumBytes());
66+
private static final String INVALID_CHECKSUM = "3902ee7e149eb8313a34757e89e21af6";
67+
5468
private SyncChecksumValidationInterceptor interceptor = new SyncChecksumValidationInterceptor();
5569

5670
@Test
@@ -149,6 +163,73 @@ public void checksumCalculatingStreamProvider_shouldReturnNewStreamResetChecksum
149163
newStream.close();
150164
}
151165

166+
@Test
167+
public void afterUnmarshalling_putObjectRequest_shouldValidateChecksum() {
168+
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
169+
170+
PutObjectResponse response = PutObjectResponse.builder()
171+
.eTag(VALID_CHECKSUM)
172+
.build();
173+
174+
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
175+
.build();
176+
177+
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
178+
.uri(URI.create("http://localhost:8080"))
179+
.method(SdkHttpMethod.PUT)
180+
.build();
181+
182+
Context.AfterUnmarshalling afterUnmarshallingContext =
183+
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
184+
185+
interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum());
186+
}
187+
188+
@Test
189+
public void afterUnmarshalling_putObjectRequest_shouldValidateChecksum_throwExceptionIfInvalid() {
190+
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
191+
192+
PutObjectResponse response = PutObjectResponse.builder()
193+
.eTag(INVALID_CHECKSUM)
194+
.build();
195+
196+
PutObjectRequest putObjectRequest = PutObjectRequest.builder().build();
197+
198+
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
199+
.uri(URI.create("http://localhost:8080"))
200+
.method(SdkHttpMethod.PUT)
201+
.build();
202+
203+
Context.AfterUnmarshalling afterUnmarshallingContext =
204+
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
205+
206+
assertThatThrownBy(() -> interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum()))
207+
.hasMessage("Data read has a different checksum than expected.");
208+
}
209+
210+
@Test
211+
public void afterUnmarshalling_putObjectRequest_with_SSE_shouldNotValidateChecksum() {
212+
SdkHttpResponse sdkHttpResponse = getSdkHttpResponseWithChecksumHeader();
213+
214+
PutObjectResponse response = PutObjectResponse.builder()
215+
.eTag(INVALID_CHECKSUM)
216+
.build();
217+
218+
PutObjectRequest putObjectRequest = PutObjectRequest.builder().build();
219+
220+
SdkHttpRequest sdkHttpRequest = SdkHttpFullRequest.builder()
221+
.putHeader(SERVER_SIDE_ENCRYPTION_HEADER, AWS_KMS.toString())
222+
.putHeader("x-amz-server-side-encryption-aws-kms-key-id", ENABLE_MD5_CHECKSUM_HEADER_VALUE)
223+
.uri(URI.create("http://localhost:8080"))
224+
.method(SdkHttpMethod.PUT)
225+
.build();
226+
227+
Context.AfterUnmarshalling afterUnmarshallingContext =
228+
InterceptorTestUtils.afterUnmarshallingContext(putObjectRequest, sdkHttpRequest, response, sdkHttpResponse);
229+
230+
interceptor.afterUnmarshalling(afterUnmarshallingContext, getExecutionAttributesWithChecksum());
231+
}
232+
152233
private static final class CloseAwareStream extends InputStream {
153234
private StringInputStream inputStream;
154235
private boolean isClosed;
@@ -192,4 +273,15 @@ private ExecutionAttributes getExecutionAttributesWithChecksumDisabled() {
192273
executionAttributes.putAttribute(SERVICE_CONFIG, S3Configuration.builder().checksumValidationEnabled(false).build());
193274
return executionAttributes;
194275
}
276+
277+
private ExecutionAttributes getExecutionAttributesWithChecksum() {
278+
SdkChecksum checksum = checkSumFor(CONTENT_BYTES);
279+
return getExecutionAttributes().putAttribute(CHECKSUM, checksum);
280+
}
281+
282+
private static SdkChecksum checkSumFor(byte[] bytes) {
283+
SdkChecksum checksum = new Md5Checksum();
284+
checksum.update(bytes, 0, bytes.length);
285+
return checksum;
286+
}
195287
}

0 commit comments

Comments
 (0)