diff --git a/pom.xml b/pom.xml
index 2a21aa5..85b441f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,18 @@
1.0.0
+
+
+
+ org.gcube.distribution
+ gcube-bom
+ 1.0.0-SNAPSHOT
+ pom
+ import
+
+
+
+
distro
@@ -20,19 +32,16 @@
org.gcube.common
common-authorization
- [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT)
org.gcube.core
common-encryption
- [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT)
org.slf4j
slf4j-api
- 1.7.5
junit
diff --git a/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java b/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java
index b14c609..3a61cf3 100644
--- a/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java
+++ b/src/main/java/org/gcube/common/authorization/client/proxy/AuthorizationProxy.java
@@ -1,6 +1,7 @@
package org.gcube.common.authorization.client.proxy;
import java.util.List;
+import java.util.Map;
import org.gcube.common.authorization.client.exceptions.ObjectNotFound;
import org.gcube.common.authorization.library.AuthorizationEntry;
@@ -11,9 +12,9 @@ import org.gcube.common.authorization.library.provider.ServiceInfo;
public interface AuthorizationProxy {
- AuthorizationEndpoint getEndpoint();
+ AuthorizationEndpoint getEndpoint(int infrastructureHash);
- void setEndpoint(AuthorizationEndpoint endpoint);
+ void setEndpoint(Map endpoints);
AuthorizationEntry get(String token) throws ObjectNotFound, Exception;
diff --git a/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java b/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java
index 5d80662..67c1105 100644
--- a/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java
+++ b/src/main/java/org/gcube/common/authorization/client/proxy/DefaultAuthorizationProxy.java
@@ -13,7 +13,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.WeakHashMap;
import org.gcube.common.authorization.client.Binder;
import org.gcube.common.authorization.client.exceptions.ObjectNotFound;
@@ -23,6 +23,7 @@ import org.gcube.common.authorization.library.enpoints.AuthorizationEndpoint;
import org.gcube.common.authorization.library.enpoints.AuthorizationEndpointScanner;
import org.gcube.common.authorization.library.policies.Policy;
import org.gcube.common.authorization.library.provider.ClientInfo;
+import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.authorization.library.provider.ServiceInfo;
import org.gcube.common.authorization.library.provider.UserInfo;
import org.gcube.common.encryption.StringEncrypter;
@@ -33,18 +34,19 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
private static Logger log = LoggerFactory.getLogger(AuthorizationProxy.class);
- private static Map cache = new ConcurrentHashMap();
+ private static Map cache = Collections.synchronizedMap(new WeakHashMap());
- private List endpoints;
+ private Map endpoints;
+ private static final String TOKEN_SEPARATOR ="|";
+
public DefaultAuthorizationProxy() {
endpoints = AuthorizationEndpointScanner.endpoints();
- this.setEndpoint(endpoints.get(0));
}
- private String getInternalEnpoint(){
- StringBuilder endpoint = new StringBuilder("http://").append(getEndpoint().getHost()).append(":")
- .append(getEndpoint().getPort()).append("/authorization-service/gcube/service");
+ private String getInternalEnpoint(int infrastructureHash){
+ StringBuilder endpoint = new StringBuilder("http://").append(getEndpoint(infrastructureHash).getHost()).append(":")
+ .append(getEndpoint(infrastructureHash).getPort()).append("/authorization-service/gcube/service");
return endpoint.toString();
}
@@ -56,8 +58,10 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
if (client instanceof UserInfo)
methodPath+="user";
else methodPath+="service";
-
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath).append("?")
+
+ int infrastructureHash = getInfrastructureHashfromContext(context);
+
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(infrastructureHash)).append(methodPath).append("?")
.append(CONTEXT_PARAM).append("=").append(context);
URL url = new URL(callUrl.toString());
@@ -86,6 +90,24 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
return StringEncrypter.getEncrypter().decrypt(encryptedToken, context);
}
+ private int getInfrastructureHashfromContext(String context) {
+ try{
+ String infrastructure = context.split("/")[1];
+ return infrastructure.hashCode();
+ }catch(Exception e){
+ throw new RuntimeException("invalid contex");
+ }
+ }
+
+ private int getInfrastructureHashFromToken(String token) {
+ try{
+ String hashCodeAsString = token.split(TOKEN_SEPARATOR)[1];
+ return Integer.parseInt(hashCodeAsString);
+ }catch(Exception e){
+ throw new RuntimeException("invalid token");
+ }
+ }
+
@Override
public String requestActivation(ServiceInfo container, String context) throws Exception {
@@ -93,7 +115,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath).append("?")
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(getInfrastructureHashfromContext(context))).append(methodPath).append("?")
.append(CONTEXT_PARAM).append("=").append(context);
URL url = new URL(callUrl.toString());
@@ -129,7 +151,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
final String methodPath = "/retrieve/";
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath).append(token);
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(getInfrastructureHashFromToken(token))).append(methodPath).append(token);
URL url = new URL(callUrl.toString());
HttpURLConnection connection = makeRequest(url, "GET");
@@ -150,7 +172,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
public void addPolicies(List policies) throws Exception {
final String methodPath = "/policyManager";
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath);
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(getInfrastructureHashFromToken(SecurityTokenProvider.instance.get()))).append(methodPath);
URL url = new URL(callUrl.toString());
HttpURLConnection connection = makeRequest(url, "POST");
@@ -168,7 +190,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
@Override
public void removePolicies(long... ids) throws Exception {
final String methodPath = "/policyManager/";
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath);
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(getInfrastructureHashFromToken(SecurityTokenProvider.instance.get()))).append(methodPath);
List errorIds = new ArrayList();
for (long id: ids){
URL url = new URL(callUrl.toString()+id);
@@ -183,7 +205,7 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
public List getPolicies(String context) throws Exception{
final String methodPath = "/policyManager/";
- StringBuilder callUrl = new StringBuilder(getInternalEnpoint()).append(methodPath).append("?").append(CONTEXT_PARAM).append("=").append(context);
+ StringBuilder callUrl = new StringBuilder(getInternalEnpoint(getInfrastructureHashfromContext(context))).append(methodPath).append("?").append(CONTEXT_PARAM).append("=").append(context);
URL url = new URL(callUrl.toString());
HttpURLConnection connection = makeRequest(url, "GET");
@@ -205,13 +227,15 @@ public class DefaultAuthorizationProxy implements AuthorizationProxy {
}
@Override
- public AuthorizationEndpoint getEndpoint() {
- return this.endpoints.get(0);
+ public AuthorizationEndpoint getEndpoint(int infrastructureHash) {
+ if (!this.endpoints.containsKey(infrastructureHash))
+ throw new RuntimeException("Authorization Endpoint not found for the required infrastructure");
+ return this.endpoints.get(infrastructureHash);
}
@Override
- public void setEndpoint(AuthorizationEndpoint authEndpoint) {
- this.endpoints = Collections.singletonList(authEndpoint);
+ public void setEndpoint(Map endpoints) {
+ this.endpoints = endpoints;
}