@@ -133,119 +133,101 @@ export class SignatureV4 implements RequestSigner {
133
133
}
134
134
}
135
135
136
- presignRequest < StreamType > ( {
136
+ public async presignRequest < StreamType > ( {
137
137
request : originalRequest ,
138
138
expiration,
139
139
signingDate = new Date ( ) ,
140
140
hoistHeaders = true ,
141
141
unsignableHeaders = UNSIGNABLE_HEADERS ,
142
142
unsignedPayload = this . unsignedPayload ,
143
143
} : PresigningArguments < StreamType > ) : Promise < HttpRequest < StreamType > > {
144
- return Promise . all ( [ this . regionProvider ( ) , this . credentialProvider ( ) ] )
145
- . then ( ( [ region , credentials ] ) => {
146
- const { longDate, shortDate} = formatDate ( signingDate ) ;
147
- const ttl = getTtl ( signingDate , expiration ) ;
148
- if ( ttl > MAX_PRESIGNED_TTL ) {
149
- return Promise . reject ( 'Signature version 4 presigned URLs'
150
- + ' must have an expiration date less than one week in'
151
- + ' the future' ) ;
152
- }
153
-
154
- const scope = createScope ( shortDate , region , this . service ) ;
155
- const keyPromise = this . getSigningKey ( credentials , shortDate ) ;
156
-
157
- const wrapperFn = hoistHeaders
158
- ? moveHeadersToQuery
159
- : ensureRequestHasQuery ;
160
- const request = wrapperFn ( prepareRequest ( originalRequest ) ) ;
161
-
162
- if ( credentials . sessionToken ) {
163
- request . query [ TOKEN_QUERY_PARAM ] = credentials . sessionToken ;
164
- }
165
- request . query [ ALGORITHM_QUERY_PARAM ] = ALGORITHM_IDENTIFIER ;
166
- request . query [ CREDENTIAL_QUERY_PARAM ]
167
- = `${ credentials . accessKeyId } /${ scope } ` ;
168
- request . query [ AMZ_DATE_QUERY_PARAM ] = longDate ;
169
- request . query [ EXPIRES_QUERY_PARAM ] = ttl . toString ( 10 ) ;
170
-
171
- return this . getPayloadHash ( request , unsignedPayload )
172
- . then ( payloadHash => {
173
- if ( this . applyChecksum ) {
174
- request . query [ SHA256_QUERY_PARAM ] = payloadHash ;
175
- }
176
-
177
- const canonicalHeaders = getCanonicalHeaders (
178
- request ,
179
- unsignableHeaders
180
- ) ;
181
- request . query [ SIGNED_HEADERS_QUERY_PARAM ]
182
- = getCanonicalHeaderList ( canonicalHeaders ) ;
183
- const canonicalRequest = this . createCanonicalRequest (
184
- request ,
185
- canonicalHeaders ,
186
- payloadHash
187
- ) ;
188
-
189
- return this . getSignature (
190
- longDate ,
191
- scope ,
192
- keyPromise ,
193
- canonicalRequest
194
- )
195
- } ) . then ( signature => {
196
- request . query [ SIGNATURE_QUERY_PARAM ] = signature ;
197
- return request ;
198
- } ) ;
199
- } ) ;
144
+ const [ region , credentials ] = await Promise . all ( [
145
+ this . regionProvider ( ) ,
146
+ this . credentialProvider ( )
147
+ ] ) ;
148
+
149
+ const { longDate, shortDate} = formatDate ( signingDate ) ;
150
+ const ttl = getTtl ( signingDate , expiration ) ;
151
+ if ( ttl > MAX_PRESIGNED_TTL ) {
152
+ return Promise . reject ( 'Signature version 4 presigned URLs'
153
+ + ' must have an expiration date less than one week in'
154
+ + ' the future' ) ;
155
+ }
156
+
157
+ const scope = createScope ( shortDate , region , this . service ) ;
158
+
159
+ const wrapperFn = hoistHeaders ? moveHeadersToQuery : ensureReqHasQuery ;
160
+ const request = wrapperFn ( prepareRequest ( originalRequest ) ) ;
161
+
162
+ if ( credentials . sessionToken ) {
163
+ request . query [ TOKEN_QUERY_PARAM ] = credentials . sessionToken ;
164
+ }
165
+ request . query [ ALGORITHM_QUERY_PARAM ] = ALGORITHM_IDENTIFIER ;
166
+ request . query [ CREDENTIAL_QUERY_PARAM ] = `${ credentials . accessKeyId } /${ scope } ` ;
167
+ request . query [ AMZ_DATE_QUERY_PARAM ] = longDate ;
168
+ request . query [ EXPIRES_QUERY_PARAM ] = ttl . toString ( 10 ) ;
169
+
170
+ const payloadHash = await this . getPayloadHash ( request , unsignedPayload ) ;
171
+ if ( this . applyChecksum ) {
172
+ request . query [ SHA256_QUERY_PARAM ] = payloadHash ;
173
+ }
174
+
175
+ const canonicalHeaders = getCanonicalHeaders ( request , unsignableHeaders ) ;
176
+ request . query [ SIGNED_HEADERS_QUERY_PARAM ] = getCanonicalHeaderList ( canonicalHeaders ) ;
177
+
178
+ request . query [ SIGNATURE_QUERY_PARAM ] = await this . getSignature (
179
+ longDate ,
180
+ scope ,
181
+ this . getSigningKey ( credentials , region , shortDate ) ,
182
+ this . createCanonicalRequest (
183
+ request ,
184
+ canonicalHeaders ,
185
+ payloadHash
186
+ )
187
+ ) ;
188
+
189
+ return request ;
200
190
}
201
191
202
- signRequest < StreamType > ( {
192
+ public async signRequest < StreamType > ( {
203
193
request : originalRequest ,
204
194
signingDate = new Date ( ) ,
205
195
unsignableHeaders = UNSIGNABLE_HEADERS ,
206
196
unsignedPayload = this . unsignedPayload ,
207
197
} : SigningArguments < StreamType > ) : Promise < HttpRequest < StreamType > > {
208
- return Promise . all ( [ this . regionProvider ( ) , this . credentialProvider ( ) ] )
209
- . then ( ( [ region , credentials ] ) => {
210
- const request = prepareRequest ( originalRequest ) ;
211
- const { longDate, shortDate} = formatDate ( signingDate ) ;
212
- const scope = createScope ( shortDate , region , this . service ) ;
213
- const keyPromise = this . getSigningKey ( credentials , shortDate ) ;
214
-
215
- request . headers [ AMZ_DATE_HEADER ] = longDate ;
216
- if ( credentials . sessionToken ) {
217
- request . headers [ TOKEN_HEADER ] = credentials . sessionToken ;
218
- }
219
-
220
- return this . getPayloadHash ( request , unsignedPayload )
221
- . then ( payloadHash => {
222
- if ( this . applyChecksum || payloadHash === UNSIGNED_PAYLOAD ) {
223
- request . headers [ SHA256_HEADER ] = payloadHash ;
224
- }
225
- const canonicalHeaders = getCanonicalHeaders (
226
- request ,
227
- unsignableHeaders
228
- ) ;
229
- const canonicalRequest = this . createCanonicalRequest (
230
- request ,
231
- canonicalHeaders ,
232
- payloadHash
233
- ) ;
234
-
235
- return this . getSignature (
236
- longDate ,
237
- scope ,
238
- keyPromise ,
239
- canonicalRequest
240
- ) . then ( signature => {
241
- request . headers [ AUTH_HEADER ] = `${ ALGORITHM_IDENTIFIER } `
242
- + `Credential=${ credentials . accessKeyId } /${ scope } , `
243
- + `SignedHeaders=${ getCanonicalHeaderList ( canonicalHeaders ) } , `
244
- + `Signature=${ signature } ` ;
245
- return request ;
246
- } ) ;
247
- } ) ;
248
- } ) ;
198
+ const [ region , credentials ] = await Promise . all ( [
199
+ this . regionProvider ( ) ,
200
+ this . credentialProvider ( )
201
+ ] ) ;
202
+
203
+ const request = prepareRequest ( originalRequest ) ;
204
+ const { longDate, shortDate} = formatDate ( signingDate ) ;
205
+ const scope = createScope ( shortDate , region , this . service ) ;
206
+
207
+ request . headers [ AMZ_DATE_HEADER ] = longDate ;
208
+ if ( credentials . sessionToken ) {
209
+ request . headers [ TOKEN_HEADER ] = credentials . sessionToken ;
210
+ }
211
+
212
+ const payloadHash = await this . getPayloadHash ( request , unsignedPayload ) ;
213
+
214
+ if ( this . applyChecksum || payloadHash === UNSIGNED_PAYLOAD ) {
215
+ request . headers [ SHA256_HEADER ] = payloadHash ;
216
+ }
217
+ const canonicalHeaders = getCanonicalHeaders ( request , unsignableHeaders ) ;
218
+ const signature = await this . getSignature (
219
+ longDate ,
220
+ scope ,
221
+ this . getSigningKey ( credentials , region , shortDate ) ,
222
+ this . createCanonicalRequest ( request , canonicalHeaders , payloadHash )
223
+ ) ;
224
+
225
+ request . headers [ AUTH_HEADER ] = `${ ALGORITHM_IDENTIFIER } `
226
+ + `Credential=${ credentials . accessKeyId } /${ scope } , `
227
+ + `SignedHeaders=${ getCanonicalHeaderList ( canonicalHeaders ) } , `
228
+ + `Signature=${ signature } ` ;
229
+
230
+ return request ;
249
231
}
250
232
251
233
private createCanonicalRequest (
@@ -263,20 +245,19 @@ ${sortedHeaders.join(';')}
263
245
${ payloadHash } `;
264
246
}
265
247
266
- private createStringToSign (
248
+ private async createStringToSign (
267
249
longDate : string ,
268
250
credentialScope : string ,
269
251
canonicalRequest : string
270
252
) : Promise < string > {
271
253
const hash = new this . sha256 ( ) ;
272
254
hash . update ( canonicalRequest ) ;
255
+ const hashedRequest = await hash . digest ( ) ;
273
256
274
- return hash . digest ( ) . then ( hashedRequest => (
275
- `${ ALGORITHM_IDENTIFIER }
257
+ return `${ ALGORITHM_IDENTIFIER }
276
258
${ longDate }
277
259
${ credentialScope }
278
- ${ toHex ( hashedRequest ) } `
279
- ) ) ;
260
+ ${ toHex ( hashedRequest ) } `;
280
261
}
281
262
282
263
private getCanonicalPath (
@@ -290,53 +271,50 @@ ${toHex(hashedRequest)}`
290
271
return path ;
291
272
}
292
273
293
- private getPayloadHash < StreamType > (
274
+ private async getPayloadHash < StreamType > (
294
275
request : HttpRequest < StreamType > ,
295
276
unsignedPayload : boolean
296
277
) : Promise < string > {
297
-
298
-
299
278
if ( unsignedPayload && request . protocol === 'https:' ) {
300
- return Promise . resolve ( UNSIGNED_PAYLOAD ) ;
279
+ return UNSIGNED_PAYLOAD ;
301
280
}
302
281
303
282
return getPayloadHash ( request , this . sha256 ) ;
304
283
}
305
284
306
- private getSignature (
285
+ private async getSignature (
307
286
longDate : string ,
308
287
credentialScope : string ,
309
288
keyPromise : Promise < Uint8Array > ,
310
289
canonicalRequest : string
311
290
) : Promise < string > {
312
- return this . createStringToSign (
291
+ const stringToSign = await this . createStringToSign (
313
292
longDate ,
314
293
credentialScope ,
315
294
canonicalRequest
316
- ) . then ( stringToSign => {
317
- return keyPromise . then ( key => {
318
- const hash = new this . sha256 ( key ) ;
319
- hash . update ( stringToSign ) ;
320
- return hash . digest ( ) ;
321
- } ) ;
322
- } ) . then ( toHex ) ;
295
+ ) ;
296
+
297
+ const hash = new this . sha256 ( await keyPromise ) ;
298
+ hash . update ( stringToSign ) ;
299
+ return toHex ( await hash . digest ( ) ) ;
323
300
}
324
301
325
302
private getSigningKey (
326
303
credentials : Credentials ,
304
+ region : string ,
327
305
shortDate : string
328
306
) : Promise < Uint8Array > {
329
- return this . regionProvider ( ) . then ( region => getSigningKey (
307
+ return getSigningKey (
330
308
this . sha256 ,
331
309
credentials ,
332
310
shortDate ,
333
311
region ,
334
312
this . service
335
- ) ) ;
313
+ ) ;
336
314
}
337
315
}
338
316
339
- function ensureRequestHasQuery < StreamType > (
317
+ function ensureReqHasQuery < StreamType > (
340
318
request : HttpRequest < StreamType >
341
319
) : HttpRequest < StreamType > & { query : QueryParameterBag } {
342
320
const { query = { } as QueryParameterBag } = request ;
0 commit comments