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();