@Override public void verifyExpectedAndActualETagValues(String expectedETag, StorageObject uploadedObject) throws ServiceException { if(StringUtils.isBlank(uploadedObject.getETag())) { log.warn("No ETag to verify"); return; } super.verifyExpectedAndActualETagValues(expectedETag, uploadedObject); }
@Override protected void post(final Path file, final MessageDigest digest, final StorageObject part) throws BackgroundException { if(null != part.getServerSideEncryptionAlgorithm()) { log.warn(String.format("Skip checksum verification for %s with server side encryption enabled", file)); return; } this.verify(file, digest, Checksum.parse(part.getETag())); }
@SuppressWarnings("deprecation") public boolean isDirectoryPlaceholder() { // Recognize "standard" directory place-holder indications used by // Amazon's AWS Console and Panic's Transmit. if (this.getKey().endsWith("/") && this.getContentLength() == 0) { return true; } // Recognize s3sync.rb directory placeholders by MD5/ETag value. if ("d66759af42f282e1ba19144df2d405d0".equals(this.getETag())) { return true; } // Recognize place-holder objects created by the Google Storage console // or S3 Organizer Firefox extension. if (this.getKey().endsWith("_$folder$") && this.getContentLength() == 0) { return true; } // Recognize legacy JetS3t directory place-holder objects, only gives // accurate results if an object's metadata is populated. if (this.getContentLength() == 0 && Mimetypes.MIMETYPE_JETS3T_DIRECTORY.equals(this.getContentType())) { return true; } return false; }
@SuppressWarnings("deprecation") public boolean isDirectoryPlaceholder() { // Recognize "standard" directory place-holder indications used by // Amazon's AWS Console and Panic's Transmit. if (this.getKey().endsWith("/") && this.getContentLength() == 0) { return true; } // Recognize s3sync.rb directory placeholders by MD5/ETag value. if ("d66759af42f282e1ba19144df2d405d0".equals(this.getETag())) { return true; } // Recognize place-holder objects created by the Google Storage console // or S3 Organizer Firefox extension. if (this.getKey().endsWith("_$folder$") && this.getContentLength() == 0) { return true; } // Recognize legacy JetS3t directory place-holder objects, only gives // accurate results if an object's metadata is populated. if (this.getContentLength() == 0 && Mimetypes.MIMETYPE_JETS3T_DIRECTORY.equals(this.getContentType())) { return true; } return false; }
if (!ServiceUtils.isEtagAlsoAnMD5Hash(object.getETag())) log.warn("Unable to verify MD5 hash of downloaded data against" + " ETag returned by service because ETag value \"" + object.getETag() + "\" is not an MD5 hash value" + ", for object key: " + object.getKey()); if (!hexMD5OfDownloadedData.equals(object.getETag())) { throw new ServiceException("Mismatch between MD5 hash of downloaded data (" + hexMD5OfDownloadedData + ") and ETag returned by service (" + object.getETag() + ") for object key: " + object.getKey()); } else {
if (!ServiceUtils.isEtagAlsoAnMD5Hash(object.getETag())) log.warn("Unable to verify MD5 hash of downloaded data against" + " ETag returned by service because ETag value \"" + object.getETag() + "\" is not an MD5 hash value" + ", for object key: " + object.getKey()); if (!hexMD5OfDownloadedData.equals(object.getETag())) { throw new ServiceException("Mismatch between MD5 hash of downloaded data (" + hexMD5OfDownloadedData + ") and ETag returned by service (" + object.getETag() + ") for object key: " + object.getKey()); } else {
@Override public InputStream openStream() throws IOException { try { final long start; final long end = objectDetails.getContentLength() - 1; if (offset > 0 && offset < objectDetails.getContentLength()) { start = offset; } else if (offset < 0 && (-1 * offset) < objectDetails.getContentLength()) { start = objectDetails.getContentLength() + offset; } else { start = 0; } return service.getObject( config.getS3Bucket(), taskKey, null, null, new String[]{objectDetails.getETag()}, null, start, end ).getDataInputStream(); } catch (ServiceException e) { throw new IOException(e); } } }
/** * @return * the Base64-encoded MD5 hash of an object's data contents as stored in the metadata * item <code>Content-MD5</code>, or as derived from an <code>ETag</code> or * <code>md5-hash</code> hex-encoded version of the hash. Returns null if the hash value is not * available. */ public String getMd5HashAsBase64() { String md5HashBase64 = (String) getMetadata(METADATA_HEADER_CONTENT_MD5); if (md5HashBase64 == null) { // Try converting the object's ETag (a hex-encoded md5 hash). final String eTag = getETag(); if (eTag != null && ServiceUtils.isEtagAlsoAnMD5Hash(eTag)) { return ServiceUtils.toBase64(ServiceUtils.fromHex(eTag)); } // Try converting the object's md5-hash (another hex-encoded md5 hash). if (getMd5HashAsHex() != null) { return ServiceUtils.toBase64(ServiceUtils.fromHex(getMd5HashAsHex())); } } return md5HashBase64; }
/** * @return * the Base64-encoded MD5 hash of an object's data contents as stored in the metadata * item <code>Content-MD5</code>, or as derived from an <code>ETag</code> or * <code>md5-hash</code> hex-encoded version of the hash. Returns null if the hash value is not * available. */ public String getMd5HashAsBase64() { String md5HashBase64 = (String) getMetadata(METADATA_HEADER_CONTENT_MD5); if (md5HashBase64 == null) { // Try converting the object's ETag (a hex-encoded md5 hash). final String eTag = getETag(); if (eTag != null && ServiceUtils.isEtagAlsoAnMD5Hash(eTag)) { return ServiceUtils.toBase64(ServiceUtils.fromHex(eTag)); } // Try converting the object's md5-hash (another hex-encoded md5 hash). if (getMd5HashAsHex() != null) { return ServiceUtils.toBase64(ServiceUtils.fromHex(getMd5HashAsHex())); } } return md5HashBase64; }