Skip to content

Commit e145459

Browse files
committed
Fixed issue where specifying a custom presigning time causes a runtime exception.
1 parent a9cc310 commit e145459

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"category": "AWS SDK for Java v2",
3+
"type": "bugfix",
4+
"description": "Fixed issue where specifying a custom presigning time causes a runtime exception."
5+
}

core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import java.io.InputStream;
2222
import java.nio.charset.Charset;
23-
import java.time.Instant;
2423
import java.util.ArrayList;
2524
import java.util.Arrays;
2625
import java.util.List;
@@ -99,7 +98,7 @@ protected SdkHttpFullRequest.Builder doPresign(SdkHttpFullRequest request,
9998

10099
SdkHttpFullRequest.Builder mutableRequest = request.toBuilder();
101100

102-
long expirationInSeconds = generateExpirationTime(signingParams);
101+
long expirationInSeconds = getSignatureDurationInSeconds(requestParams, signingParams);
103102
addHostHeader(mutableRequest);
104103

105104
AwsCredentials sanitizedCredentials = sanitizeCredentials(signingParams.awsCredentials());
@@ -112,9 +111,7 @@ protected SdkHttpFullRequest.Builder doPresign(SdkHttpFullRequest request,
112111
}
113112

114113
// Add the important parameters for v4 signing
115-
String timeStamp = requestParams.getFormattedRequestSigningDateTime();
116-
117-
addPreSignInformationToRequest(mutableRequest, sanitizedCredentials, requestParams, timeStamp, expirationInSeconds);
114+
addPreSignInformationToRequest(mutableRequest, sanitizedCredentials, requestParams, expirationInSeconds);
118115

119116
String contentSha256 = calculateContentHashPresign(mutableRequest, signingParams);
120117

@@ -275,13 +272,12 @@ private String buildAuthorizationHeader(byte[] signature,
275272
private void addPreSignInformationToRequest(SdkHttpFullRequest.Builder mutableRequest,
276273
AwsCredentials sanitizedCredentials,
277274
Aws4SignerRequestParams signerParams,
278-
String timeStamp,
279275
long expirationInSeconds) {
280276

281277
String signingCredentials = sanitizedCredentials.accessKeyId() + "/" + signerParams.getScope();
282278

283279
mutableRequest.putRawQueryParameter(SignerConstant.X_AMZ_ALGORITHM, SignerConstant.AWS4_SIGNING_ALGORITHM);
284-
mutableRequest.putRawQueryParameter(SignerConstant.X_AMZ_DATE, timeStamp);
280+
mutableRequest.putRawQueryParameter(SignerConstant.X_AMZ_DATE, signerParams.getFormattedRequestSigningDateTime());
285281
mutableRequest.putRawQueryParameter(SignerConstant.X_AMZ_SIGNED_HEADER,
286282
getSignedHeadersString(mutableRequest.headers()));
287283
mutableRequest.putRawQueryParameter(SignerConstant.X_AMZ_EXPIRES,
@@ -397,10 +393,13 @@ private void addDateHeader(SdkHttpFullRequest.Builder mutableRequest, String dat
397393
* Generates an expiration time for the presigned url. If user has specified
398394
* an expiration time, check if it is in the given limit.
399395
*/
400-
private long generateExpirationTime(U signingParams) {
396+
private long getSignatureDurationInSeconds(Aws4SignerRequestParams requestParams,
397+
U signingParams) {
401398

402-
long expirationInSeconds = signingParams.expirationTime().map(Instant::getEpochSecond)
403-
.orElse(SignerConstant.PRESIGN_URL_MAX_EXPIRATION_SECONDS);
399+
long expirationInSeconds = signingParams.expirationTime()
400+
.map(t -> t.getEpochSecond() -
401+
(requestParams.getRequestSigningDateTimeMilli() / 1000))
402+
.orElse(SignerConstant.PRESIGN_URL_MAX_EXPIRATION_SECONDS);
404403

405404
if (expirationInSeconds > SignerConstant.PRESIGN_URL_MAX_EXPIRATION_SECONDS) {
406405
throw SdkClientException.builder()

0 commit comments

Comments
 (0)