mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 17:19:37 +02:00
50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
const Crypto = require('node:crypto')
|
|
|
|
/**
|
|
* Creates an S3 client that uses MD5 checksums for DeleteObjects operations
|
|
* https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/MD5_FALLBACK.md
|
|
*/
|
|
const md5Middleware = (next, context) => async args => {
|
|
if (context.commandName !== 'DeleteObjectsCommand') {
|
|
return next(args)
|
|
}
|
|
|
|
const headers = args.request.headers
|
|
|
|
// Remove any checksum headers added by default middleware
|
|
// This ensures our Content-MD5 is the primary integrity check
|
|
Object.keys(headers).forEach(header => {
|
|
const lowerHeader = header.toLowerCase()
|
|
if (
|
|
lowerHeader.startsWith('x-amz-checksum-') ||
|
|
lowerHeader.startsWith('x-amz-sdk-checksum-')
|
|
) {
|
|
delete headers[header]
|
|
}
|
|
})
|
|
|
|
if (args.request.body) {
|
|
const bodyContent = Buffer.from(args.request.body)
|
|
headers['Content-MD5'] = Crypto.createHash('md5')
|
|
.update(bodyContent)
|
|
.digest('base64')
|
|
}
|
|
|
|
return await next(args)
|
|
}
|
|
|
|
function addMd5Middleware(client) {
|
|
// Add the middleware relative to the flexible checksums middleware
|
|
// This ensures it runs after default checksums might be added, but before signing
|
|
client.middlewareStack.add(md5Middleware, {
|
|
step: 'build',
|
|
toMiddleware: 'flexibleChecksumsMiddleware',
|
|
name: 'addMD5ChecksumForDeleteObjects',
|
|
tags: ['MD5_FALLBACK'],
|
|
})
|
|
}
|
|
|
|
module.exports = {
|
|
addMd5Middleware,
|
|
}
|