diff --git a/pom.xml b/pom.xml
index b15405b..7d66199 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,5 +46,36 @@
org.gcube.common
gxHTTP
+
+ org.gcube.common
+ gcube-jackson-core
+
+
+ org.gcube.common
+ gcube-jackson-annotations
+
+
+ org.gcube.common
+ gcube-jackson-databind
+
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ ch.qos.logback
+ logback-classic
+ test
+
+
+ org.gcube.common
+ authorization-utils
+ [2.1.0-SNAPSHOT, 3.0.0-SNAPSHOT)
+ test
+
\ No newline at end of file
diff --git a/src/main/java/org/gcube/common/context/ContextUtility.java b/src/main/java/org/gcube/common/context/ContextUtility.java
index 0341ea4..e8dd2f1 100644
--- a/src/main/java/org/gcube/common/context/ContextUtility.java
+++ b/src/main/java/org/gcube/common/context/ContextUtility.java
@@ -1,6 +1,15 @@
package org.gcube.common.context;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+import org.gcube.com.fasterxml.jackson.databind.JsonNode;
+import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
+import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;
+import org.gcube.common.authorization.library.provider.AccessTokenProvider;
import org.gcube.common.scope.api.ScopeProvider;
+import org.gcube.common.scope.impl.ScopeBean;
/**
* @author Luca Frosini (ISTI - CNR)
@@ -10,6 +19,34 @@ public class ContextUtility {
public static String getCurrentContextFullName() {
String context = ScopeProvider.instance.get();
+ if(context==null) {
+ String token = AccessTokenProvider.instance.get();
+ String realUmaTokenEncoded = token.split("\\.")[1];
+ String realUmaToken = new String(Base64.getDecoder().decode(realUmaTokenEncoded.getBytes()));
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ JsonNode tokenJsonNode = mapper.readTree(realUmaToken);
+ JsonNode jsonNode = tokenJsonNode.get("aud");
+ if(jsonNode.isArray()) {
+ ArrayNode arrayNode = (ArrayNode) jsonNode;
+ for (JsonNode aud : arrayNode) {
+ if (aud != null && aud.isTextual() && aud.asText().compareTo("") != 0) {
+ String audience = aud.asText();
+ String contextToBeValidated = URLDecoder.decode(audience, StandardCharsets.UTF_8.toString());
+ ScopeBean scopeBean = new ScopeBean(contextToBeValidated);
+ context = scopeBean.toString();
+ return context;
+ }
+ }
+ }
+ if(jsonNode.isTextual()) {
+ return jsonNode.asText();
+ }
+ throw new Exception("Unable to get Current Context");
+ }catch (Exception e) {
+ new RuntimeException(e);
+ }
+ }
return context;
}
diff --git a/src/test/java/org/gcube/common/ContextTest.java b/src/test/java/org/gcube/common/ContextTest.java
new file mode 100644
index 0000000..bca17c4
--- /dev/null
+++ b/src/test/java/org/gcube/common/ContextTest.java
@@ -0,0 +1,120 @@
+/**
+ *
+ */
+package org.gcube.common;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.gcube.common.authorization.utils.manager.SecretManager;
+import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
+import org.gcube.common.authorization.utils.secret.JWTSecret;
+import org.gcube.common.authorization.utils.secret.Secret;
+import org.gcube.common.authorization.utils.secret.SecretUtility;
+import org.gcube.common.keycloak.KeycloakClientFactory;
+import org.gcube.common.keycloak.model.TokenResponse;
+import org.gcube.common.scope.api.ScopeProvider;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Luca Frosini (ISTI - CNR)
+ */
+@SuppressWarnings("deprecation")
+public class ContextTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(ContextTest.class);
+
+ protected static final String CONFIG_INI_FILENAME = "config.ini";
+
+ public static final String ROOT_DEV;
+ public static final String ROOT_PREPROD;
+ public static final String ROOT_PROD;
+
+ protected static final Properties properties;
+
+ protected static final String CLIENT_ID_PROPERTY_KEY = "client_id";
+ protected static final String CLIENT_SECRET_PROPERTY_KEY = "client_secret";
+
+ protected static final String clientID;
+ protected static final String clientSecret;
+
+ static {
+ properties = new Properties();
+ InputStream input = ContextTest.class.getClassLoader().getResourceAsStream(CONFIG_INI_FILENAME);
+ try {
+ // load the properties file
+ properties.load(input);
+
+ clientID = properties.getProperty(CLIENT_ID_PROPERTY_KEY);
+ clientSecret = properties.getProperty(CLIENT_SECRET_PROPERTY_KEY);
+
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ ROOT_DEV = "/gcube";
+ ROOT_PREPROD = "/pred4s";
+ ROOT_PROD = "/d4science.research-infrastructures.eu";
+ }
+
+ public static void set(Secret secret) throws Exception {
+ SecretManagerProvider.instance.reset();
+ SecretManager secretManager = new SecretManager();
+ secretManager.addSecret(secret);
+ SecretManagerProvider.instance.set(secretManager);
+ SecretManagerProvider.instance.get().set();
+ }
+
+ public static void setContextByName(String fullContextName) throws Exception {
+ Secret secret = getSecretByContextName(fullContextName);
+ set(secret);
+ }
+
+
+ private static TokenResponse getJWTAccessToken(String context) throws Exception {
+ ScopeProvider.instance.set(context);
+ TokenResponse tr = KeycloakClientFactory.newInstance().queryUMAToken(clientID, clientSecret, context, null);
+ return tr;
+ }
+
+ public static Secret getSecretByContextName(String context) throws Exception {
+ TokenResponse tr = getJWTAccessToken(context);
+ Secret secret = new JWTSecret(tr.getAccessToken());
+ return secret;
+ }
+
+ public static void setContext(String token) throws Exception {
+ Secret secret = getSecret(token);
+ set(secret);
+ }
+
+ private static Secret getSecret(String token) throws Exception {
+ Secret secret = SecretUtility.getSecretByTokenString(token);
+ return secret;
+ }
+
+ public static String getUser() {
+ String user = "Unknown";
+ try {
+ user = SecretManagerProvider.instance.get().getUser().getUsername();
+ } catch(Exception e) {
+ logger.error("Unable to retrieve user. {} will be used", user);
+ }
+ return user;
+ }
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ setContextByName(ROOT_DEV);
+ }
+
+ @AfterClass
+ public static void afterClass() throws Exception {
+ SecretManagerProvider.instance.reset();
+ }
+
+}
diff --git a/src/test/java/org/gcube/common/context/ContextUtilityTest.java b/src/test/java/org/gcube/common/context/ContextUtilityTest.java
new file mode 100644
index 0000000..f7d758e
--- /dev/null
+++ b/src/test/java/org/gcube/common/context/ContextUtilityTest.java
@@ -0,0 +1,23 @@
+package org.gcube.common.context;
+
+import org.gcube.common.ContextTest;
+import org.gcube.common.authorization.library.provider.AccessTokenProvider;
+import org.gcube.common.authorization.utils.manager.SecretManager;
+import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
+import org.junit.Test;
+
+/**
+ * @author Luca Frosini (ISTI - CNR)
+ */
+public class ContextUtilityTest extends ContextTest {
+
+ @Test
+ public void testGetContext() throws Exception {
+ SecretManager secretManager = SecretManagerProvider.instance.get();
+ String token = secretManager.getCurrentSecretHolder().getSecrets().first().getToken();
+ ContextTest.afterClass();
+ AccessTokenProvider.instance.set(token);
+ ContextUtility.getCurrentContextFullName();
+ }
+
+}
diff --git a/src/test/resources/.gitignore b/src/test/resources/.gitignore
new file mode 100644
index 0000000..a600bf5
--- /dev/null
+++ b/src/test/resources/.gitignore
@@ -0,0 +1,2 @@
+/token.properties
+/config.ini
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..13f1c6e
--- /dev/null
+++ b/src/test/resources/logback-test.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file