From abd215546907afeacadf55189bad055128a6d04e Mon Sep 17 00:00:00 2001 From: Mawoka Date: Sat, 1 Nov 2025 14:06:26 +0100 Subject: [PATCH] Fix S3 upload --- classquiz/storage/s3_storage.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/classquiz/storage/s3_storage.py b/classquiz/storage/s3_storage.py index d5654ca..5a6377e 100644 --- a/classquiz/storage/s3_storage.py +++ b/classquiz/storage/s3_storage.py @@ -42,7 +42,13 @@ class S3Storage: if not self.client.bucket_exists(self.bucket_name): self.client.make_bucket(self.bucket_name) - def _generate_aws_signature_v4(self, method: str, path: str, expiry: int = None) -> Tuple[dict, str]: + def _generate_aws_signature_v4( + self, + method: str, + path: str, + expiry: int | None = None, + payload_hash: str | None = None, + ) -> Tuple[dict, str]: path = f"/{self.bucket_name}{path}" service = "s3" @@ -58,7 +64,8 @@ class S3Storage: canonical_querystring = f"Expires={expiry}" # For S3, the payload hash must be included and signed - payload_hash = hashlib.sha256(b"").hexdigest() + if payload_hash is None: + payload_hash = hashlib.sha256(b"").hexdigest() canonical_headers = f"host:{self.host}\n" f"x-amz-content-sha256:{payload_hash}\n" f"x-amz-date:{amz_date}\n" signed_headers = "host;x-amz-content-sha256;x-amz-date" @@ -122,7 +129,11 @@ class S3Storage: size: int | None, mime_type: str | None = None, ) -> None: - headers, url = self._generate_aws_signature_v4(method="PUT", path=f"/{file_name}") + file.seek(0) + payload = file.read() + payload_hash = hashlib.sha256(payload).hexdigest() + file.seek(0) + headers, url = self._generate_aws_signature_v4(method="PUT", path=f"/{file_name}", payload_hash=payload_hash) file_size = 0 while True: chunk = file.read(1024)