diff --git a/CHANGELOG.md b/CHANGELOG.md index 04a25799c..d4e1f2344 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +### [1.113.1](https://www.github.com/googleapis/java-storage/compare/v1.113.0...v1.113.1) (2020-09-17) + + +### Bug Fixes + +* KMS Bad Key error when using existing Blob context to overwrite object ([#507](https://www.github.com/googleapis/java-storage/issues/507)) ([4d9c490](https://www.github.com/googleapis/java-storage/commit/4d9c49027e4746ee273902694441886c2f43188d)) +* When passing a sub-array (offset, length) to the Storage#create method the array is needlessly cloned ([#506](https://www.github.com/googleapis/java-storage/issues/506)) ([9415bb7](https://www.github.com/googleapis/java-storage/commit/9415bb7bdb42d8012ca457a90070b616e6bbec19)), closes [#505](https://www.github.com/googleapis/java-storage/issues/505) + + +### Dependencies + +* update dependency com.google.apis:google-api-services-storage to v1-rev20200814-1.30.10 ([#499](https://www.github.com/googleapis/java-storage/issues/499)) ([af91d7d](https://www.github.com/googleapis/java-storage/commit/af91d7da4117fb22992d6a860af61f72906e0aa1)) + + +### Documentation + +* update libraries-bom ([#504](https://www.github.com/googleapis/java-storage/issues/504)) ([0e58c1c](https://www.github.com/googleapis/java-storage/commit/0e58c1cb2b6a890e567b043188613021592f2bc8)) + ## [1.113.0](https://www.github.com/googleapis/java-storage/compare/v1.112.0...v1.113.0) (2020-09-03) diff --git a/README.md b/README.md index 427222ec9..a21d122d7 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file com.google.cloud libraries-bom - 10.0.0 + 10.1.0 pom import @@ -47,11 +47,11 @@ If you are using Maven without BOM, add this to your dependencies: If you are using Gradle, add this to your dependencies ```Groovy -compile 'com.google.cloud:google-cloud-storage:1.113.0' +compile 'com.google.cloud:google-cloud-storage:1.113.1' ``` If you are using SBT, add this to your dependencies ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "1.113.0" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "1.113.1" ``` [//]: # ({x-version-update-end}) diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index f383ebb30..f5650c063 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 1.113.0 + 1.113.1 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,7 +12,7 @@ com.google.cloud google-cloud-storage-parent - 1.113.0 + 1.113.1 google-cloud-storage diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java index 835e0d453..0604a1170 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java @@ -72,7 +72,6 @@ public StorageObject apply(BlobInfo blobInfo) { return blobInfo.toPb(); } }; - private static final long serialVersionUID = -5625857076205028976L; private final BlobId blobId; private final String generatedId; @@ -323,6 +322,23 @@ public Builder setTimeStorageClassUpdated(Long timeStorageClassUpdated) { abstract Builder setCustomerEncryption(CustomerEncryption customerEncryption); + /** + * Sets a customer-managed key for server-side encryption of the blob. Note that when a KMS key + * is used to encrypt Cloud Storage object, object resource metadata will store the version of + * the KMS cryptographic. If a {@code Blob} with KMS Key metadata is used to upload a new + * version of the object then the existing kmsKeyName version value can't be used in the upload + * request and the client instead ignores it. + * + *

Example of setting the KMS key name + * + *

{@code
+     * String bucketName = "my-unique-bucket";
+     * String blobName = "my-blob-name";
+     * String kmsKeyName = "projects/project-id/locations/us/keyRings/lab1/cryptoKeys/test-key"
+     * BlobInfo blobInfo = BlobInfo.newBuilder(bucketName, blobName).build();
+     * Blob blob = storage.create(blobInfo, Storage.BlobTargetOption.kmsKeyName(kmsKeyName));
+     * }
+ */ abstract Builder setKmsKeyName(String kmsKeyName); /** Sets the blob's event-based hold. */ @@ -1095,7 +1111,6 @@ public ObjectAccessControl apply(Acl acl) { if (retentionExpirationTime != null) { storageObject.setRetentionExpirationTime(new DateTime(retentionExpirationTime)); } - storageObject.setKmsKeyName(kmsKeyName); storageObject.setEventBasedHold(eventBasedHold); storageObject.setTemporaryHold(temporaryHold); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index b1f2bfe3c..c3778a817 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -154,7 +154,7 @@ public Blob create(BlobInfo blobInfo, BlobTargetOption... options) { .setMd5(EMPTY_BYTE_ARRAY_MD5) .setCrc32c(EMPTY_BYTE_ARRAY_CRC32C) .build(); - return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, options); + return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, 0, 0, options); } @Override @@ -168,23 +168,26 @@ public Blob create(BlobInfo blobInfo, byte[] content, BlobTargetOption... option BaseEncoding.base64() .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(content).asInt()))) .build(); - return internalCreate(updatedInfo, content, options); + return internalCreate(updatedInfo, content, 0, content.length, options); } @Override public Blob create( BlobInfo blobInfo, byte[] content, int offset, int length, BlobTargetOption... options) { content = firstNonNull(content, EMPTY_BYTE_ARRAY); - byte[] subContent = Arrays.copyOfRange(content, offset, offset + length); BlobInfo updatedInfo = blobInfo .toBuilder() - .setMd5(BaseEncoding.base64().encode(Hashing.md5().hashBytes(subContent).asBytes())) + .setMd5( + BaseEncoding.base64() + .encode(Hashing.md5().hashBytes(content, offset, length).asBytes())) .setCrc32c( BaseEncoding.base64() - .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(subContent).asInt()))) + .encode( + Ints.toByteArray( + Hashing.crc32c().hashBytes(content, offset, length).asInt()))) .build(); - return internalCreate(updatedInfo, subContent, options); + return internalCreate(updatedInfo, content, offset, length, options); } @Override @@ -199,7 +202,12 @@ public Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... op return Blob.fromPb(this, storageRpc.create(blobPb, inputStreamParam, optionsMap)); } - private Blob internalCreate(BlobInfo info, final byte[] content, BlobTargetOption... options) { + private Blob internalCreate( + BlobInfo info, + final byte[] content, + final int offset, + final int length, + BlobTargetOption... options) { Preconditions.checkNotNull(content); final StorageObject blobPb = info.toPb(); final Map optionsMap = optionMap(info, options); @@ -210,7 +218,8 @@ private Blob internalCreate(BlobInfo info, final byte[] content, BlobTargetOptio new Callable() { @Override public StorageObject call() { - return storageRpc.create(blobPb, new ByteArrayInputStream(content), optionsMap); + return storageRpc.create( + blobPb, new ByteArrayInputStream(content, offset, length), optionsMap); } }, getOptions().getRetrySettings(), diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java index d7b7baa0b..0960f91ff 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java @@ -832,6 +832,10 @@ public String open(StorageObject object, Map options) { Span span = startSpan(HttpStorageRpcSpans.SPAN_NAME_OPEN); Scope scope = tracer.withSpan(span); try { + String kmsKeyName = object.getKmsKeyName(); + if (kmsKeyName != null && kmsKeyName.contains("cryptoKeyVersions")) { + object.setKmsKeyName(""); + } Insert req = storage.objects().insert(object.getBucket(), object); GenericUrl url = req.buildHttpRequest().getUrl(); String scheme = url.getScheme(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java index 84936e0d4..80685a277 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java @@ -3605,4 +3605,23 @@ public void testBlobTimeStorageClassUpdated() { .isEqualTo(updatedBlob1.getTimeStorageClassUpdated()); assertThat(updatedBlob2.delete()).isTrue(); } + + @Test + public void testWriterWithKmsKeyName() throws IOException { + // Write an empty object with a kmsKeyName. + String blobName = "test-empty-blob"; + BlobInfo blobInfo = BlobInfo.newBuilder(BUCKET, blobName).build(); + Blob blob = + storage.create(blobInfo, Storage.BlobTargetOption.kmsKeyName(kmsKeyOneResourcePath)); + + // Create a writer using blob that already has metadata received from Storage API. + int numberOfBytes; + try (WriteChannel writer = blob.writer()) { + byte[] content = BLOB_STRING_CONTENT.getBytes(UTF_8); + numberOfBytes = writer.write(ByteBuffer.wrap(content, 0, content.length)); + } + assertThat(numberOfBytes).isEqualTo(27); + assertThat(blob.getKmsKeyName()).isNotNull(); + assertThat(storage.delete(BUCKET, blobName)).isTrue(); + } } diff --git a/pom.xml b/pom.xml index 332a2c3d3..c048d4a97 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 1.113.0 + 1.113.1 Storage Parent https://github.com/googleapis/java-storage @@ -78,7 +78,7 @@ com.google.apis google-api-services-storage - v1-rev20200727-1.30.10 + v1-rev20200814-1.30.10 org.easymock @@ -159,7 +159,7 @@ org.apache.maven.plugins maven-project-info-reports-plugin - 3.1.0 + 3.1.1 diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 6accfe9af..b99d50256 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-storage - 1.112.0 + 1.113.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 211256dcc..e11ddbfc2 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-storage - 1.112.0 + 1.113.0 diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 7c6cf5632..d64de714e 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -30,7 +30,7 @@ com.google.cloud libraries-bom - 10.0.0 + 10.1.0 pom import diff --git a/versions.txt b/versions.txt index b7420fc77..930c9388e 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-cloud-storage:1.113.0:1.113.0 \ No newline at end of file +google-cloud-storage:1.113.1:1.113.1 \ No newline at end of file