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 2017/11/13 22:45:12 UTC

jclouds git commit: JCLOUDS-1110: Atmos time-limited signed URLs

Repository: jclouds
Updated Branches:
  refs/heads/master 3923fb0d7 -> fda87d7dc


JCLOUDS-1110: Atmos time-limited signed URLs


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/fda87d7d
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/fda87d7d
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/fda87d7d

Branch: refs/heads/master
Commit: fda87d7dc7ff6bc5b20d7eefcb60b358a6d81169
Parents: 3923fb0
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Nov 13 10:42:39 2017 -0800
Committer: Andrew Gaul <ga...@apache.org>
Committed: Mon Nov 13 14:44:02 2017 -0800

----------------------------------------------------------------------
 .../atmos/blobstore/AtmosBlobRequestSigner.java | 43 +++++++++++++++++---
 .../org/jclouds/atmos/filters/SignRequest.java  |  2 +-
 .../integration/AtmosBlobSignerLiveTest.java    | 22 ----------
 3 files changed, 38 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/fda87d7d/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobRequestSigner.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobRequestSigner.java b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobRequestSigner.java
index 0d9b5c6..bdb6470 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobRequestSigner.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobRequestSigner.java
@@ -20,26 +20,35 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static org.jclouds.blobstore.util.BlobStoreUtils.cleanRequest;
 import static org.jclouds.reflect.Reflection2.method;
 
+import java.net.URI;
+
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.jclouds.atmos.AtmosClient;
 import org.jclouds.atmos.blobstore.functions.BlobToObject;
 import org.jclouds.atmos.domain.AtmosObject;
+import org.jclouds.atmos.filters.SignRequest;
 import org.jclouds.atmos.options.PutOptions;
 import org.jclouds.blobstore.BlobRequestSigner;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
+import org.jclouds.domain.Credentials;
 import org.jclouds.http.HttpRequest;
+import org.jclouds.http.Uris;
 import org.jclouds.http.options.GetOptions;
+import org.jclouds.location.Provider;
 import org.jclouds.reflect.Invocation;
 
 import com.google.common.base.Function;
+import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.reflect.Invokable;
 
 @Singleton
 public class AtmosBlobRequestSigner implements BlobRequestSigner {
+   private static final int DEFAULT_EXPIRY_SECONDS = 15 * 60;
+
    private final Function<Invocation, HttpRequest> processor;
    private final BlobToObject blobToObject;
    private final BlobToHttpGetOptions blob2ObjectGetOptions;
@@ -48,28 +57,36 @@ public class AtmosBlobRequestSigner implements BlobRequestSigner {
    private final Invokable<?, ?> deleteMethod;
    private final Invokable<?, ?> createMethod;
 
+   private final SignRequest signer;
+   private final URI endpoint;
+   private final String identity;
+
    @Inject
    public AtmosBlobRequestSigner(Function<Invocation, HttpRequest> processor, BlobToObject blobToObject,
-         BlobToHttpGetOptions blob2ObjectGetOptions) throws SecurityException, NoSuchMethodException {
+         BlobToHttpGetOptions blob2ObjectGetOptions, SignRequest signer,
+         @Provider Supplier<URI> endpointProvider, @Provider Supplier<Credentials> creds)
+         throws SecurityException, NoSuchMethodException {
       this.processor = checkNotNull(processor, "processor");
       this.blobToObject = checkNotNull(blobToObject, "blobToObject");
       this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
       this.getMethod = method(AtmosClient.class, "readFile", String.class, GetOptions[].class);
       this.deleteMethod = method(AtmosClient.class, "deletePath", String.class);
       this.createMethod = method(AtmosClient.class, "createFile", String.class, AtmosObject.class, PutOptions[].class);
+      this.signer = signer;
+      this.endpoint = endpointProvider.get();
+      this.identity = creds.get().identity;
    }
 
    @Override
    public HttpRequest signGetBlob(String container, String name) {
-      checkNotNull(container, "container");
-      checkNotNull(name, "name");
-      return cleanRequest(processor.apply(Invocation.create(getMethod,
-            ImmutableList.<Object> of(getPath(container, name)))));
+      return signGetBlob(container, name, DEFAULT_EXPIRY_SECONDS);
    }
 
    @Override
    public HttpRequest signGetBlob(String container, String name, long timeInSeconds) {
-      throw new UnsupportedOperationException();
+      checkNotNull(container, "container");
+      checkNotNull(name, "name");
+      return sign("GET", "/rest/namespace/" + container + "/" + name, timeInSeconds);
    }
 
    @Override
@@ -106,4 +123,18 @@ public class AtmosBlobRequestSigner implements BlobRequestSigner {
             ImmutableList.of(getPath(container, name), blob2ObjectGetOptions.apply(checkNotNull(options, "options"))))));
    }
 
+   private HttpRequest sign(String method, String path, long timeInSeconds) {
+      String expires = String.valueOf(System.currentTimeMillis() / 1000 + timeInSeconds);
+      String stringToSign = method + "\n" +
+            path + "\n" +
+            identity + "\n" +
+            expires;
+      return HttpRequest.builder()
+            .method(method)
+            .endpoint(Uris.uriBuilder(endpoint.getScheme() + "://" + endpoint.getHost()).appendPath(path).build())
+            .addQueryParam("uid", identity)
+            .addQueryParam("expires", expires)
+            .addQueryParam("signature", signer.calculateSignature(stringToSign))
+            .build();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/fda87d7d/apis/atmos/src/main/java/org/jclouds/atmos/filters/SignRequest.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/filters/SignRequest.java b/apis/atmos/src/main/java/org/jclouds/atmos/filters/SignRequest.java
index 7c3486e..6f308ea 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/filters/SignRequest.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/filters/SignRequest.java
@@ -113,7 +113,7 @@ public class SignRequest implements HttpRequestFilter {
       return buffer.toString();
    }
 
-   private String calculateSignature(String toSign) {
+   public String calculateSignature(String toSign) {
       String signature = signString(toSign);
       if (signatureWire.enabled())
          signatureWire.input(Strings2.toInputStream(signature));

http://git-wip-us.apache.org/repos/asf/jclouds/blob/fda87d7d/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosBlobSignerLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosBlobSignerLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosBlobSignerLiveTest.java
index 76ec5d8..67d8539 100644
--- a/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosBlobSignerLiveTest.java
+++ b/apis/atmos/src/test/java/org/jclouds/atmos/blobstore/integration/AtmosBlobSignerLiveTest.java
@@ -18,8 +18,6 @@ package org.jclouds.atmos.blobstore.integration;
 
 import static org.testng.Assert.fail;
 
-import java.io.IOException;
-
 import org.jclouds.blobstore.integration.internal.BaseBlobSignerLiveTest;
 import org.testng.SkipException;
 import org.testng.annotations.Test;
@@ -31,26 +29,6 @@ public class AtmosBlobSignerLiveTest extends BaseBlobSignerLiveTest {
    }
 
    @Test
-   public void testSignGetUrlWithTime() throws InterruptedException, IOException {
-      try {
-         super.testSignGetUrlWithTime();
-         fail();
-      } catch (UnsupportedOperationException uoe) {
-         throw new SkipException("not supported in Atmos", uoe);
-      }
-   }
-
-   @Test
-   public void testSignGetUrlWithTimeExpired() throws InterruptedException, IOException {
-      try {
-         super.testSignGetUrlWithTimeExpired();
-         fail();
-      } catch (UnsupportedOperationException uoe) {
-         throw new SkipException("not supported in Atmos", uoe);
-      }
-   }
-
-   @Test
    public void testSignPutUrlWithTime() throws Exception {
       try {
          super.testSignPutUrlWithTime();