Skip to content

Commit d840edf

Browse files
committed
fix
1 parent 87298fd commit d840edf

6 files changed

Lines changed: 34 additions & 25 deletions

File tree

src/main/java/software/amazon/encryption/s3/S3AsyncEncryptionClient.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.DEFAULT_BUFFER_SIZE_BYTES;
66
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.MAX_ALLOWED_BUFFER_SIZE_BYTES;
77
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.MIN_ALLOWED_BUFFER_SIZE_BYTES;
8-
import static software.amazon.encryption.s3.internal.ApiNameVersion.API_NAME_INTERCEPTOR;
98

109
import java.net.URI;
1110
import java.security.KeyPair;
@@ -56,6 +55,7 @@
5655
import software.amazon.awssdk.services.s3.model.UploadPartResponse;
5756
import software.amazon.awssdk.services.s3.multipart.MultipartConfiguration;
5857
import software.amazon.encryption.s3.algorithms.AlgorithmSuite;
58+
import software.amazon.encryption.s3.internal.ApiNameVersion;
5959
import software.amazon.encryption.s3.internal.GetEncryptedObjectPipeline;
6060
import software.amazon.encryption.s3.internal.InstructionFileConfig;
6161
import software.amazon.encryption.s3.internal.NoRetriesAsyncRequestBody;
@@ -240,12 +240,12 @@ public <T> CompletableFuture<T> getObject(GetObjectRequest getObjectRequest,
240240
@Override
241241
public CompletableFuture<DeleteObjectResponse> deleteObject(DeleteObjectRequest deleteObjectRequest) {
242242
final DeleteObjectRequest actualRequest = deleteObjectRequest.toBuilder()
243-
.overrideConfiguration(API_NAME_INTERCEPTOR)
243+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectRequest.overrideConfiguration()))
244244
.build();
245245
final CompletableFuture<DeleteObjectResponse> response = _wrappedClient.deleteObject(actualRequest);
246246
final String instructionObjectKey = deleteObjectRequest.key() + ".instruction";
247247
final CompletableFuture<DeleteObjectResponse> instructionResponse = _wrappedClient.deleteObject(builder -> builder
248-
.overrideConfiguration(API_NAME_INTERCEPTOR)
248+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectRequest.overrideConfiguration()))
249249
.bucket(deleteObjectRequest.bucket())
250250
.key(instructionObjectKey));
251251
// Delete the instruction file, then delete the object
@@ -271,7 +271,7 @@ public CompletableFuture<DeleteObjectsResponse> deleteObjects(DeleteObjectsReque
271271
// Add the original objects
272272
objectsToDelete.addAll(deleteObjectsRequest.delete().objects());
273273
return _wrappedClient.deleteObjects(deleteObjectsRequest.toBuilder()
274-
.overrideConfiguration(API_NAME_INTERCEPTOR)
274+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectsRequest.overrideConfiguration()))
275275
.delete(builder -> builder.objects(objectsToDelete))
276276
.build());
277277
}

src/main/java/software/amazon/encryption/s3/S3EncryptionClient.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.MAX_ALLOWED_BUFFER_SIZE_BYTES;
88
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.MIN_ALLOWED_BUFFER_SIZE_BYTES;
99
import static software.amazon.encryption.s3.S3EncryptionClientUtilities.instructionFileKeysToDelete;
10-
import static software.amazon.encryption.s3.internal.ApiNameVersion.API_NAME_INTERCEPTOR;
1110

1211
import java.io.IOException;
1312
import java.net.URI;
@@ -75,6 +74,7 @@
7574
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
7675
import software.amazon.awssdk.services.s3.model.UploadPartResponse;
7776
import software.amazon.encryption.s3.algorithms.AlgorithmSuite;
77+
import software.amazon.encryption.s3.internal.ApiNameVersion;
7878
import software.amazon.encryption.s3.internal.ContentMetadata;
7979
import software.amazon.encryption.s3.internal.ContentMetadataDecodingStrategy;
8080
import software.amazon.encryption.s3.internal.ContentMetadataEncodingStrategy;
@@ -570,7 +570,7 @@ private <T extends Throwable> T onAbort(UploadObjectObserver observer, T t) {
570570
public DeleteObjectResponse deleteObject(DeleteObjectRequest deleteObjectRequest) throws AwsServiceException,
571571
SdkClientException {
572572
DeleteObjectRequest actualRequest = deleteObjectRequest.toBuilder()
573-
.overrideConfiguration(API_NAME_INTERCEPTOR)
573+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectRequest.overrideConfiguration()))
574574
.build();
575575

576576
try {
@@ -583,7 +583,7 @@ public DeleteObjectResponse deleteObject(DeleteObjectRequest deleteObjectRequest
583583
//# - DeleteObject MUST delete the associated instruction file using the default instruction file suffix.
584584
String instructionObjectKey = deleteObjectRequest.key() + DEFAULT_INSTRUCTION_FILE_SUFFIX;
585585
_wrappedAsyncClient.deleteObject(builder -> builder
586-
.overrideConfiguration(API_NAME_INTERCEPTOR)
586+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectRequest.overrideConfiguration()))
587587
.bucket(deleteObjectRequest.bucket())
588588
.key(instructionObjectKey)).join();
589589
// Return original deletion
@@ -610,7 +610,7 @@ public DeleteObjectResponse deleteObject(DeleteObjectRequest deleteObjectRequest
610610
public DeleteObjectsResponse deleteObjects(DeleteObjectsRequest deleteObjectsRequest) throws AwsServiceException,
611611
SdkClientException {
612612
DeleteObjectsRequest actualRequest = deleteObjectsRequest.toBuilder()
613-
.overrideConfiguration(API_NAME_INTERCEPTOR)
613+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectsRequest.overrideConfiguration()))
614614
.build();
615615
try {
616616
//= specification/s3-encryption/client.md#required-api-operations
@@ -622,7 +622,7 @@ public DeleteObjectsResponse deleteObjects(DeleteObjectsRequest deleteObjectsReq
622622
//# - DeleteObjects MUST delete each of the corresponding instruction files using the default instruction file suffix.
623623
List<ObjectIdentifier> deleteObjects = instructionFileKeysToDelete(deleteObjectsRequest);
624624
_wrappedAsyncClient.deleteObjects(DeleteObjectsRequest.builder()
625-
.overrideConfiguration(API_NAME_INTERCEPTOR)
625+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(deleteObjectsRequest.overrideConfiguration()))
626626
.bucket(deleteObjectsRequest.bucket())
627627
.delete(builder -> builder.objects(deleteObjects))
628628
.build()).join();

src/main/java/software/amazon/encryption/s3/internal/ApiNameVersion.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,36 @@
99
import java.io.IOException;
1010
import java.net.URL;
1111
import java.util.Enumeration;
12+
import java.util.Optional;
1213
import java.util.Properties;
13-
import java.util.function.Consumer;
1414

1515
/**
1616
* Provides the information for the ApiName APIs for the AWS SDK
1717
*/
1818
public class ApiNameVersion {
1919
private static final ApiName API_NAME = ApiNameVersion.apiNameWithVersion();
20-
// This is used in overrideConfiguration
21-
public static final Consumer<AwsRequestOverrideConfiguration.Builder> API_NAME_INTERCEPTOR =
22-
builder -> builder.addApiName(API_NAME);
2320

2421
public static final String NAME = "AmazonS3Encrypt";
2522
public static final String API_VERSION_UNKNOWN = "4-unknown";
2623

24+
/**
25+
* Returns an {@link AwsRequestOverrideConfiguration} which includes the S3EC API name while
26+
* preserving any override configuration the caller already set on their request. This ensures
27+
* caller-supplied configuration (e.g. custom headers, credentials providers, or signer
28+
* overrides) is not dropped when the S3EC adds its API name.
29+
*
30+
* @param existingOverrideConfiguration the override configuration from the original request, if any
31+
* @return an override configuration containing the S3EC API name merged with the existing configuration
32+
*/
33+
public static AwsRequestOverrideConfiguration addApiNameToOverrideConfiguration(
34+
Optional<AwsRequestOverrideConfiguration> existingOverrideConfiguration) {
35+
return existingOverrideConfiguration
36+
.map(AwsRequestOverrideConfiguration::toBuilder)
37+
.orElseGet(AwsRequestOverrideConfiguration::builder)
38+
.addApiName(API_NAME)
39+
.build();
40+
}
41+
2742
public static ApiName apiNameWithVersion() {
2843
return ApiName.builder()
2944
.name(NAME)

src/main/java/software/amazon/encryption/s3/internal/GetEncryptedObjectPipeline.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package software.amazon.encryption.s3.internal;
44

5-
import static software.amazon.encryption.s3.internal.ApiNameVersion.API_NAME_INTERCEPTOR;
6-
75
import java.nio.ByteBuffer;
86
import java.util.Arrays;
97
import java.util.Collections;
@@ -64,7 +62,7 @@ public <T> CompletableFuture<T> getObject(GetObjectRequest getObjectRequest, Asy
6462
//# and end of the cipher blocks for the given range.
6563
String cryptoRange = RangedGetUtils.getCryptoRangeAsString(getObjectRequest.range());
6664
GetObjectRequest adjustedRangeRequest = getObjectRequest.toBuilder()
67-
.overrideConfiguration(API_NAME_INTERCEPTOR)
65+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(getObjectRequest.overrideConfiguration()))
6866
.range(cryptoRange)
6967
.build();
7068
if (!_enableLegacyUnauthenticatedModes && getObjectRequest.range() != null) {

src/main/java/software/amazon/encryption/s3/internal/MultipartUploadObjectPipeline.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package software.amazon.encryption.s3.internal;
44

5-
import static software.amazon.encryption.s3.internal.ApiNameVersion.API_NAME_INTERCEPTOR;
6-
75
import java.io.IOException;
86
import java.io.InputStream;
97
import java.io.OutputStream;
@@ -80,7 +78,7 @@ public CreateMultipartUploadResponse createMultipartUpload(CreateMultipartUpload
8078
final byte[] contentIV = materials.algorithmSuite().isCommitting() ? materials.messageId() : materials.iv();
8179
CreateMultipartUploadRequest createMpuRequest = _contentMetadataEncodingStrategy.encodeMetadata(materials, contentIV, request);
8280
request = createMpuRequest.toBuilder()
83-
.overrideConfiguration(API_NAME_INTERCEPTOR)
81+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(createMpuRequest.overrideConfiguration()))
8482
.build();
8583

8684
//= specification/s3-encryption/client.md#optional-api-operations
@@ -135,7 +133,7 @@ public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requ
135133

136134
// Once we have (a valid) ciphertext length, set the request contentLength
137135
UploadPartRequest actualRequest = request.toBuilder()
138-
.overrideConfiguration(API_NAME_INTERCEPTOR)
136+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(request.overrideConfiguration()))
139137
.contentLength(ciphertextLength)
140138
.build();
141139

@@ -201,7 +199,7 @@ public CompleteMultipartUploadResponse completeMultipartUpload(CompleteMultipart
201199
}
202200

203201
CompleteMultipartUploadRequest actualRequest = request.toBuilder()
204-
.overrideConfiguration(API_NAME_INTERCEPTOR)
202+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(request.overrideConfiguration()))
205203
.build();
206204

207205
//= specification/s3-encryption/client.md#optional-api-operations
@@ -215,7 +213,7 @@ public CompleteMultipartUploadResponse completeMultipartUpload(CompleteMultipart
215213
public AbortMultipartUploadResponse abortMultipartUpload(AbortMultipartUploadRequest request) {
216214
_multipartUploadMaterials.remove(request.uploadId());
217215
AbortMultipartUploadRequest actualRequest = request.toBuilder()
218-
.overrideConfiguration(API_NAME_INTERCEPTOR)
216+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(request.overrideConfiguration()))
219217
.build();
220218
//= specification/s3-encryption/client.md#optional-api-operations
221219
//# - AbortMultipartUpload MUST abort the multipart upload.

src/main/java/software/amazon/encryption/s3/internal/PutEncryptedObjectPipeline.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package software.amazon.encryption.s3.internal;
44

5-
import static software.amazon.encryption.s3.internal.ApiNameVersion.API_NAME_INTERCEPTOR;
6-
75
import java.security.SecureRandom;
86
import java.util.concurrent.CompletableFuture;
97

@@ -81,7 +79,7 @@ public CompletableFuture<PutObjectResponse> putObject(PutObjectRequest request,
8179
final byte[] contentIV = materials.algorithmSuite().isCommitting() ? materials.messageId() : materials.iv();
8280
PutObjectRequest modifiedRequest = _contentMetadataEncodingStrategy.encodeMetadata(materials, contentIV, request);
8381
PutObjectRequest encryptedPutRequest = modifiedRequest.toBuilder()
84-
.overrideConfiguration(API_NAME_INTERCEPTOR)
82+
.overrideConfiguration(ApiNameVersion.addApiNameToOverrideConfiguration(request.overrideConfiguration()))
8583
.contentLength(encryptedContent.getCiphertextLength())
8684
.build();
8785
return _s3AsyncClient.putObject(encryptedPutRequest, new NoRetriesAsyncRequestBody(encryptedContent.getAsyncCiphertext()));

0 commit comments

Comments
 (0)