diff --git a/matrix/matrix-media-repo/0001-Make-using-MD5-hashing-a-config-option-on-the-datast.patch b/matrix/matrix-media-repo/0001-Make-using-MD5-hashing-a-config-option-on-the-datast.patch new file mode 100644 index 0000000..e4f1cc5 --- /dev/null +++ b/matrix/matrix-media-repo/0001-Make-using-MD5-hashing-a-config-option-on-the-datast.patch @@ -0,0 +1,86 @@ +From b740c2f77c7e3b10ff77ebade90afa58f79f6267 Mon Sep 17 00:00:00 2001 +From: Travis Ralston +Date: Sat, 10 Jun 2023 15:04:48 -0600 +Subject: [PATCH] Make using MD5 hashing a config option on the datastore + +--- + config.sample.yaml | 4 ++++ + datastores/s3.go | 8 ++++++++ + datastores/upload.go | 6 +++++- + 3 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/config.sample.yaml b/config.sample.yaml +index d0d9543..24774b7 100644 +--- a/config.sample.yaml ++++ b/config.sample.yaml +@@ -191,6 +191,10 @@ datastores: + # An optional storage class for tuning how the media is stored at s3. + # See https://aws.amazon.com/s3/storage-classes/ for details; uncomment to use. + #storageClass: STANDARD ++ # If you're seeing errors relating to 'z-amz-checksum-algorithm CRC32C not implemented', ++ # set this to `true`. This will reduce performance, but will allow uploads to be possible. ++ # It is common that you need to enable this with Backblaze B2 and CloudFlare R2. ++ useMD5: false + + # Options for controlling archives. Archives are exports of a particular user's content for + # the purpose of GDPR or moving media to a different server. +diff --git a/datastores/s3.go b/datastores/s3.go +index 0517188..828f6e5 100644 +--- a/datastores/s3.go ++++ b/datastores/s3.go +@@ -19,6 +19,7 @@ type s3 struct { + client *minio.Client + storageClass string + bucket string ++ putWithMd5 bool + } + + func ResetS3Clients() { +@@ -37,6 +38,7 @@ func getS3(ds config.DatastoreConfig) (*s3, error) { + region := ds.Options["region"] + storageClass, hasStorageClass := ds.Options["storageClass"] + useSslStr, hasSsl := ds.Options["ssl"] ++ useMd5Str, hasMd5 := ds.Options["useMD5"] + + if !hasStorageClass { + storageClass = "STANDARD" +@@ -47,6 +49,11 @@ func getS3(ds config.DatastoreConfig) (*s3, error) { + useSsl, _ = strconv.ParseBool(useSslStr) + } + ++ useMd5 := false ++ if hasMd5 && useMd5Str != "" { ++ useMd5, _ = strconv.ParseBool(useMd5Str) ++ } ++ + var err error + var client *minio.Client + client, err = minio.New(endpoint, &minio.Options{ +@@ -62,6 +69,7 @@ func getS3(ds config.DatastoreConfig) (*s3, error) { + client: client, + storageClass: storageClass, + bucket: bucket, ++ putWithMd5: useMd5, + } + s3clients.Store(ds.Id, s3c) + return s3c, nil +diff --git a/datastores/upload.go b/datastores/upload.go +index a06bc0e..f011752 100644 +--- a/datastores/upload.go ++++ b/datastores/upload.go +@@ -40,7 +40,11 @@ func Upload(ctx rcontext.RequestContext, ds config.DatastoreConfig, data io.Read + + metrics.S3Operations.With(prometheus.Labels{"operation": "PutObject"}).Inc() + var info minio.UploadInfo +- info, err = s3c.client.PutObject(ctx.Context, s3c.bucket, objectName, tee, size, minio.PutObjectOptions{StorageClass: s3c.storageClass, ContentType: contentType}) ++ info, err = s3c.client.PutObject(ctx.Context, s3c.bucket, objectName, tee, size, minio.PutObjectOptions{ ++ StorageClass: s3c.storageClass, ++ ContentType: contentType, ++ SendContentMd5: s3c.putWithMd5, ++ }) + uploadedBytes = info.Size + } else if ds.Type == "file" { + basePath := ds.Options["path"] +-- +2.41.0 + diff --git a/matrix/matrix-media-repo/default.nix b/matrix/matrix-media-repo/default.nix index 7ce7d26..99082ce 100644 --- a/matrix/matrix-media-repo/default.nix +++ b/matrix/matrix-media-repo/default.nix @@ -30,6 +30,9 @@ in repo = "matrix-media-repo"; inherit (source) rev sha256; }; + patches = [ + ./0001-Make-using-MD5-hashing-a-config-option-on-the-datast.patch + ]; modules = ./gomod2nix.toml; go = go_1_20; nativeBuildInputs = [