Compare commits

..

2 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
c8b7654bcf fix(server): disable automatic checksums in S3 presigned URLs for large file uploads
Co-authored-by: danielalves96 <62755605+danielalves96@users.noreply.github.com>
2025-10-22 12:36:52 +00:00
copilot-swe-agent[bot]
84622adb45 Initial plan 2025-10-22 12:29:18 +00:00
2 changed files with 20 additions and 16 deletions

View File

@@ -80,7 +80,21 @@ export class S3StorageProvider implements StorageProvider {
Key: objectName,
});
return await getSignedUrl(s3Client, command, { expiresIn: expires });
// Disable automatic checksum calculation for large file uploads
// This prevents the SDK from adding x-amz-checksum-* headers that may cause
// 400 Bad Request errors with S3-compatible providers like Wasabi for files > 10GB
// The unhoistableHeaders option prevents specific headers from being included in the presigned URL
return await getSignedUrl(s3Client, command, {
expiresIn: expires,
unhoistableHeaders: new Set([
"x-amz-checksum-crc32",
"x-amz-checksum-crc32c",
"x-amz-checksum-sha1",
"x-amz-checksum-sha256",
"x-amz-checksum-crc64nvme",
"x-amz-sdk-checksum-algorithm",
]),
});
}
async getPresignedGetUrl(objectName: string, expires: number, fileName?: string): Promise<string> {

View File

@@ -121,7 +121,7 @@ export function TwoFactorForm() {
<CardDescription>{status.enabled ? t("twoFactor.enabled") : t("twoFactor.description")}</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
<div className="flex items-center justify-between">
<div>
<p className="font-medium">
{t("twoFactor.status.label")}{" "}
@@ -133,29 +133,19 @@ export function TwoFactorForm() {
</p>
)}
</div>
<div className="flex flex-col sm:flex-row gap-2 w-full sm:w-auto">
<div className="flex gap-2">
{status.enabled ? (
<>
<Button
variant="outline"
onClick={generateNewBackupCodes}
disabled={isLoading}
className="w-full sm:w-auto"
>
<Button variant="outline" onClick={generateNewBackupCodes} disabled={isLoading}>
<IconKey className="h-4 w-4" />
{t("twoFactor.backupCodes.generateNew")}
</Button>
<Button
variant="destructive"
onClick={() => setIsDisableModalOpen(true)}
disabled={isLoading}
className="w-full sm:w-auto"
>
<Button variant="destructive" onClick={() => setIsDisableModalOpen(true)} disabled={isLoading}>
{t("twoFactor.buttons.disable2FA")}
</Button>
</>
) : (
<Button onClick={startSetup} disabled={isLoading} className="w-full sm:w-auto">
<Button onClick={startSetup} disabled={isLoading}>
<IconShield className="h-4 w-4" />
{t("twoFactor.buttons.enable2FA")}
</Button>