From 81f9516f68cdfd68592fadda6bc7ff8d0707cff0 Mon Sep 17 00:00:00 2001
From: Kieran <kieran@harkin.me>
Date: Tue, 26 Jul 2022 14:01:14 +0100
Subject: [PATCH] S3 optional checksum

---
 VoidCat/Model/VoidSettings.cs         |  1 +
 VoidCat/Services/Files/S3FileStore.cs | 13 ++++++++-----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/VoidCat/Model/VoidSettings.cs b/VoidCat/Model/VoidSettings.cs
index 481edd2..5e1d3da 100644
--- a/VoidCat/Model/VoidSettings.cs
+++ b/VoidCat/Model/VoidSettings.cs
@@ -121,6 +121,7 @@ namespace VoidCat.Model
         public string? Region { get; init; }
         public string? BucketName { get; init; } = "void-cat";
         public bool Direct { get; init; }
+        public bool SendChecksum { get; init; } = true;
     }
 
     public sealed class VirusScannerSettings
diff --git a/VoidCat/Services/Files/S3FileStore.cs b/VoidCat/Services/Files/S3FileStore.cs
index 17b1ed8..67e5b3f 100644
--- a/VoidCat/Services/Files/S3FileStore.cs
+++ b/VoidCat/Services/Files/S3FileStore.cs
@@ -40,8 +40,9 @@ public class S3FileStore : StreamFileStore, IFileStore
             ContentType = "application/octet-stream",
             AutoResetStreamPosition = false,
             AutoCloseStream = false,
-            ChecksumAlgorithm = ChecksumAlgorithm.SHA256,
-            ChecksumSHA256 = payload.Meta.Digest != default ? Convert.ToBase64String(payload.Meta.Digest!.FromHex()) : null,
+            ChecksumAlgorithm = _config.SendChecksum ? ChecksumAlgorithm.SHA256 : null,
+            ChecksumSHA256 = payload.Meta.Digest != default && _config.SendChecksum ?
+                Convert.ToBase64String(payload.Meta.Digest!.FromHex()) : null,
             Headers =
             {
                 ContentLength = (long)payload.Meta.Size
@@ -174,7 +175,7 @@ public class S3FileStore : StreamFileStore, IFileStore
                 BucketName = _config.BucketName,
                 Key = payload.Id.ToString(),
                 ContentType = "application/octet-stream",
-                ChecksumAlgorithm = ChecksumAlgorithm.SHA256
+                ChecksumAlgorithm = _config.SendChecksum ? ChecksumAlgorithm.SHA256 : null
             };
 
             var mStartResult = await _client.InitiateMultipartUploadAsync(mStart, cts);
@@ -193,7 +194,7 @@ public class S3FileStore : StreamFileStore, IFileStore
         fsTmp.Seek(0, SeekOrigin.Begin);
 
         var segmentLength = (ulong)fsTmp.Length;
-        var mbody = new UploadPartRequest()
+        var mBody = new UploadPartRequest()
         {
             UploadId = uploadId,
             BucketName = _config.BucketName,
@@ -202,7 +203,7 @@ public class S3FileStore : StreamFileStore, IFileStore
             InputStream = fsTmp
         };
 
-        var bodyResponse = await _client.UploadPartAsync(mbody, cts);
+        var bodyResponse = await _client.UploadPartAsync(mBody, cts);
         if (bodyResponse.HttpStatusCode != HttpStatusCode.OK)
         {
             await _client.AbortMultipartUploadAsync(new()
@@ -224,6 +225,8 @@ public class S3FileStore : StreamFileStore, IFileStore
                 BucketName = _config.BucketName,
                 Key = payload.Id.ToString(),
                 UploadId = uploadId,
+                ChecksumSHA256 = payload.Meta.Digest != default && _config.SendChecksum ?
+                    Convert.ToBase64String(payload.Meta.Digest!.FromHex()) : null,
                 PartETags = parts.Select(a =>
                 {
                     var pSplit = a.Split('|');