diff --git a/src/main/java/org/gaul/s3proxy/EncryptedBlobStore.java b/src/main/java/org/gaul/s3proxy/EncryptedBlobStore.java index c1dbeba..2cf0dcd 100644 --- a/src/main/java/org/gaul/s3proxy/EncryptedBlobStore.java +++ b/src/main/java/org/gaul/s3proxy/EncryptedBlobStore.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkArgument; import java.io.IOException; import java.io.InputStream; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.security.spec.KeySpec; import java.util.ArrayList; @@ -41,6 +42,7 @@ import com.google.common.hash.Hashing; import org.gaul.s3proxy.crypto.Constants; import org.gaul.s3proxy.crypto.Decryption; import org.gaul.s3proxy.crypto.Encryption; +import org.gaul.s3proxy.crypto.PartPadding; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobAccess; @@ -317,9 +319,21 @@ public final class EncryptedBlobStore extends ForwardingBlobStore { mbm.setSize(size); mbm.getContentMetadata().setContentLength(size); } else { - long size = blobMeta.getSize() - Constants.PADDING_BLOCK_SIZE; - mbm.setSize(size); - mbm.getContentMetadata().setContentLength(size); + // if there is also no eTag suffix then get the number of parts from last padding + var options = new GetOptions() + .range(blobMeta.getSize() - Constants.PADDING_BLOCK_SIZE, blobMeta.getSize()); + var name = blobNameWithSuffix(blobMeta.getName()); + var blob = delegate().getBlob(blobMeta.getContainer(), name, options); + try { + PartPadding lastPartPadding = PartPadding.readPartPaddingFromBlob(blob); + int parts = lastPartPadding.getPart(); + int partPaddingSizes = Constants.PADDING_BLOCK_SIZE * parts; + long size = blobMeta.getSize() - partPaddingSizes; + mbm.setSize(size); + mbm.getContentMetadata().setContentLength(size); + } catch (IOException e) { + throw new UncheckedIOException("Failed to read part-padding from encrypted blob", e); + } } }