You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ga...@apache.org on 2022/01/12 13:24:50 UTC

[jclouds] branch master updated: JCLOUDS-1594: Allow overriding S3 signer

This is an automated email from the ASF dual-hosted git repository.

gaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git


The following commit(s) were added to refs/heads/master by this push:
     new 468b126  JCLOUDS-1594: Allow overriding S3 signer
468b126 is described below

commit 468b126dd856b48ff89f423b649ec4e3b19af012
Author: Andrew Gaul <ga...@apache.org>
AuthorDate: Fri Dec 31 19:53:04 2021 +0900

    JCLOUDS-1594: Allow overriding S3 signer
    
    Previously s3 always used v2 and aws-s3 always used v4.  Now s3
    defaults to v2 and can override to v4.  Note that this does not change
    BlobRequestSigner.
---
 .../main/java/org/jclouds/s3/S3ApiMetadata.java    |  2 ++
 .../org/jclouds/s3/config/S3HttpApiModule.java     | 22 ++++++++++++++++++----
 .../java/org/jclouds/s3/reference/S3Constants.java |  1 +
 .../java/org/jclouds/aws/s3/AWSS3ApiMetadata.java  |  2 ++
 .../jclouds/aws/s3/config/AWSS3HttpApiModule.java  |  6 +++---
 .../java/org/jclouds/aws/s3/AWSS3ClientTest.java   |  6 +++---
 .../s3/blobstore/AWSS3BlobSignerV4ExpectTest.java  |  6 +++---
 .../aws/s3/internal/BaseAWSS3ClientExpectTest.java |  6 +++---
 8 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java b/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
index c992994..9fb7653 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/S3ApiMetadata.java
@@ -26,6 +26,7 @@ import static org.jclouds.reflect.Reflection2.typeToken;
 import static org.jclouds.s3.reference.S3Constants.PROPERTY_JCLOUDS_S3_CHUNKED_SIZE;
 import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_SERVICE_PATH;
 import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS;
+import static org.jclouds.s3.reference.S3Constants.PROPERTY_SIGNER_VERSION;
 
 import java.net.URI;
 import java.util.Properties;
@@ -81,6 +82,7 @@ public class S3ApiMetadata extends BaseHttpApiMetadata {
       properties.setProperty(PROPERTY_BLOBSTORE_DIRECTORY_SUFFIX, "/");
       properties.setProperty(PROPERTY_USER_METADATA_PREFIX, String.format("x-${%s}-meta-", PROPERTY_HEADER_TAG));
       properties.setProperty(PROPERTY_IDEMPOTENT_METHODS, "DELETE,GET,HEAD,OPTIONS,POST,PUT");
+      properties.setProperty(PROPERTY_SIGNER_VERSION, "2");
 
       // Chunk size must be at least 8 KB. We recommend a chunk size of a least 64 KB for better performance.
       properties.setProperty(PROPERTY_JCLOUDS_S3_CHUNKED_SIZE, String.valueOf(64 * 1024));
diff --git a/apis/s3/src/main/java/org/jclouds/s3/config/S3HttpApiModule.java b/apis/s3/src/main/java/org/jclouds/s3/config/S3HttpApiModule.java
index aae98ec..88160d3 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/config/S3HttpApiModule.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/config/S3HttpApiModule.java
@@ -49,9 +49,11 @@ import org.jclouds.s3.blobstore.functions.BucketsToStorageMetadata;
 import org.jclouds.s3.domain.BucketMetadata;
 import org.jclouds.s3.filters.RequestAuthorizeSignature;
 import org.jclouds.s3.filters.RequestAuthorizeSignatureV2;
+import org.jclouds.s3.filters.RequestAuthorizeSignatureV4;
 import org.jclouds.s3.functions.GetRegionForBucket;
 import org.jclouds.s3.handlers.ParseS3ErrorFromXmlContent;
 import org.jclouds.s3.handlers.S3RedirectionRetryHandler;
+import org.jclouds.s3.reference.S3Constants;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
@@ -61,8 +63,8 @@ import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Iterables;
+import com.google.inject.Injector;
 import com.google.inject.Provides;
-import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 
 /**
@@ -169,7 +171,6 @@ public class S3HttpApiModule<S extends S3Client> extends AWSHttpApiModule<S> {
       super.configure();
       install(new S3ObjectModule());
       install(new S3ParserModule());
-      bindRequestSigner();
       bind(new TypeLiteral<Function<String, Optional<String>>>() {
       }).annotatedWith(Bucket.class).to(GetRegionForBucket.class);
       bind(new TypeLiteral<Function<Set<BucketMetadata>, PageSet<? extends StorageMetadata>>>() {
@@ -183,8 +184,21 @@ public class S3HttpApiModule<S extends S3Client> extends AWSHttpApiModule<S> {
       bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseS3ErrorFromXmlContent.class);
    }
 
-   protected void bindRequestSigner() {
-      bind(RequestAuthorizeSignature.class).to(RequestAuthorizeSignatureV2.class).in(Scopes.SINGLETON);
+   @Provides
+   @Singleton
+   protected final RequestAuthorizeSignature provideRequestAuthorizeSignature(Injector i, @Named(S3Constants.PROPERTY_SIGNER_VERSION) int version) {
+      return providesRequestAuthorizeSignature(i, version);
+   }
+
+   protected RequestAuthorizeSignature providesRequestAuthorizeSignature(Injector i, int version) {
+      switch (version) {
+      case 2:
+         return i.getInstance(RequestAuthorizeSignatureV2.class);
+      case 4:
+         return i.getInstance(RequestAuthorizeSignatureV4.class);
+      default:
+         throw new IllegalStateException("version must be 2 or 4, was: " + version);
+      }
    }
 
    @Provides
diff --git a/apis/s3/src/main/java/org/jclouds/s3/reference/S3Constants.java b/apis/s3/src/main/java/org/jclouds/s3/reference/S3Constants.java
index f5f876c..21ba572 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/reference/S3Constants.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/reference/S3Constants.java
@@ -32,6 +32,7 @@ public final class S3Constants {
    public static final String PROPERTY_S3_SERVICE_PATH = "jclouds.s3.service-path";
    public static final String PROPERTY_S3_VIRTUAL_HOST_BUCKETS = "jclouds.s3.virtual-host-buckets";
    public static final String PROPERTY_JCLOUDS_S3_CHUNKED_SIZE = "jclouds.s3.chunked.size";
+   public static final String PROPERTY_SIGNER_VERSION = "jclouds.s3.signer-version";
 
    public static final String TEMPORARY_SIGNATURE_PARAM = "Signature";
 
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
index 319feb1..1696c95 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3ApiMetadata.java
@@ -18,6 +18,7 @@ package org.jclouds.aws.s3;
 
 import static org.jclouds.reflect.Reflection2.typeToken;
 import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS;
+import static org.jclouds.s3.reference.S3Constants.PROPERTY_SIGNER_VERSION;
 
 import java.util.Properties;
 
@@ -50,6 +51,7 @@ public class AWSS3ApiMetadata extends S3ApiMetadata {
    public static Properties defaultProperties() {
       Properties properties = S3ApiMetadata.defaultProperties();
       properties.setProperty(PROPERTY_S3_VIRTUAL_HOST_BUCKETS, "true");
+      properties.setProperty(PROPERTY_SIGNER_VERSION, "4");
       return properties;
    }
 
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3HttpApiModule.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3HttpApiModule.java
index 3921c83..409fc1b 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3HttpApiModule.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/config/AWSS3HttpApiModule.java
@@ -32,8 +32,8 @@ import org.jclouds.s3.predicates.validators.BucketNameValidator;
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
+import com.google.inject.Injector;
 import com.google.inject.Provides;
-import com.google.inject.Scopes;
 
 /**
  * Configures the S3 connection.
@@ -57,8 +57,8 @@ public class AWSS3HttpApiModule extends S3HttpApiModule<AWSS3Client> {
    }
 
    @Override
-   protected void bindRequestSigner() {
-      bind(RequestAuthorizeSignature.class).to(AWSRequestAuthorizeSignatureV4.class).in(Scopes.SINGLETON);
+   protected RequestAuthorizeSignature providesRequestAuthorizeSignature(Injector i, int version) {
+      return i.getInstance(AWSRequestAuthorizeSignatureV4.class);
    }
 
    @Singleton
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
index 6b2f36f..0ec7052 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3ClientTest.java
@@ -52,8 +52,8 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.reflect.Invokable;
+import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.Scopes;
 
 // NOTE:without testName, this will not call @Before* and fail w/NPE during
 // surefire
@@ -197,8 +197,8 @@ public class AWSS3ClientTest extends S3ClientTest<AWSS3Client> {
 
       // subclass expects v2 signatures
       @Override
-      protected void bindRequestSigner() {
-         bind(RequestAuthorizeSignature.class).to(AWSRequestAuthorizeSignature.class).in(Scopes.SINGLETON);
+      protected RequestAuthorizeSignature providesRequestAuthorizeSignature(Injector i, int version) {
+         return i.getInstance(AWSRequestAuthorizeSignature.class);
       }
    }
 
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/AWSS3BlobSignerV4ExpectTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/AWSS3BlobSignerV4ExpectTest.java
index 80dc438..23fc97d 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/AWSS3BlobSignerV4ExpectTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/AWSS3BlobSignerV4ExpectTest.java
@@ -48,8 +48,8 @@ import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.net.HttpHeaders;
+import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.Scopes;
 
 @Test(groups = "unit", testName = "AWSS3BlobSignerV4ExpectTest")
 public class AWSS3BlobSignerV4ExpectTest extends S3BlobSignerExpectTest {
@@ -174,8 +174,8 @@ public class AWSS3BlobSignerV4ExpectTest extends S3BlobSignerExpectTest {
       }
 
       @Override
-      protected void bindRequestSigner() {
-         bind(RequestAuthorizeSignature.class).to(AWSRequestAuthorizeSignatureV4.class).in(Scopes.SINGLETON);
+      protected RequestAuthorizeSignature providesRequestAuthorizeSignature(Injector i, int version) {
+         return i.getInstance(AWSRequestAuthorizeSignatureV4.class);
       }
 
       @Override
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/internal/BaseAWSS3ClientExpectTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/internal/BaseAWSS3ClientExpectTest.java
index 73969ca..ab6c38b 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/internal/BaseAWSS3ClientExpectTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/internal/BaseAWSS3ClientExpectTest.java
@@ -27,8 +27,8 @@ import org.jclouds.rest.internal.BaseRestApiExpectTest;
 import org.jclouds.s3.filters.RequestAuthorizeSignature;
 
 import com.google.common.base.Supplier;
+import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.Scopes;
 
 /**
  * Base class for writing Expect tests for AWS-S3
@@ -56,8 +56,8 @@ public class BaseAWSS3ClientExpectTest extends BaseRestApiExpectTest<AWSS3Client
 
       // subclass expects v2 signatures
       @Override
-      protected void bindRequestSigner() {
-         bind(RequestAuthorizeSignature.class).to(AWSRequestAuthorizeSignature.class).in(Scopes.SINGLETON);
+      protected RequestAuthorizeSignature providesRequestAuthorizeSignature(Injector i, int version) {
+         return i.getInstance(AWSRequestAuthorizeSignature.class);
       }
    }