From 430bf0d5eb65d948142f3bee41e20e2776372fcb Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Sat, 6 Aug 2022 16:32:58 +0100 Subject: [PATCH] crypt: fix compress wrapping crypt giving upload errors Before this fix a chain compress -> crypt -> s3 was giving errors BadDigest: The Content-MD5 you specified did not match what we received. This was because the crypt backend was encrypting the underlying local object to calculate the hash rather than the contents of the metadata stream. It did this because the crypt backend incorrectly identified the object as a local object. This fixes the problem by making sure the crypt backend does not unwrap anything but fs.OverrideRemote objects. See: https://forum.rclone.org/t/not-encrypting-or-compressing-before-upload/32261/10 --- backend/crypt/crypt.go | 5 +++-- backend/crypt/crypt_internal_test.go | 15 +-------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/backend/crypt/crypt.go b/backend/crypt/crypt.go index 85972298e..1aece2753 100644 --- a/backend/crypt/crypt.go +++ b/backend/crypt/crypt.go @@ -1047,10 +1047,11 @@ func (o *ObjectInfo) Hash(ctx context.Context, hash hash.Type) (string, error) { // Get the underlying object if there is one if srcObj, ok = o.ObjectInfo.(fs.Object); ok { // Prefer direct interface assertion - } else if do, ok := o.ObjectInfo.(fs.ObjectUnWrapper); ok { - // Otherwise likely is an operations.OverrideRemote + } else if do, ok := o.ObjectInfo.(*fs.OverrideRemote); ok { + // Unwrap if it is an operations.OverrideRemote srcObj = do.UnWrap() } else { + // Otherwise don't unwrap any further return "", nil } // if this is wrapping a local object then we work out the hash diff --git a/backend/crypt/crypt_internal_test.go b/backend/crypt/crypt_internal_test.go index 825877630..07dee6ac5 100644 --- a/backend/crypt/crypt_internal_test.go +++ b/backend/crypt/crypt_internal_test.go @@ -17,19 +17,6 @@ import ( "github.com/stretchr/testify/require" ) -type testWrapper struct { - fs.ObjectInfo -} - -// UnWrap returns the Object that this Object is wrapping or nil if it -// isn't wrapping anything -func (o testWrapper) UnWrap() fs.Object { - if o, ok := o.ObjectInfo.(fs.Object); ok { - return o - } - return nil -} - // Create a temporary local fs to upload things from func makeTempLocalFs(t *testing.T) (localFs fs.Fs, cleanup func()) { @@ -83,7 +70,7 @@ func testObjectInfo(t *testing.T, f *Fs, wrap bool) { var oi fs.ObjectInfo = obj if wrap { // wrap the object in an fs.ObjectUnwrapper if required - oi = testWrapper{oi} + oi = fs.NewOverrideRemote(oi, "new_remote") } // wrap the object in a crypt for upload using the nonce we