From f967bbc5d902a4d0afd85e1b431083ff6f313e72 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Mon, 15 May 2023 16:00:33 +0200 Subject: [PATCH] Fixed test to get current context even if ScopeProvider is not set --- pom.xml | 31 +++++ .../gcube/common/context/ContextUtility.java | 37 ++++++ .../java/org/gcube/common/ContextTest.java | 120 ++++++++++++++++++ .../common/context/ContextUtilityTest.java | 23 ++++ src/test/resources/.gitignore | 2 + src/test/resources/logback-test.xml | 19 +++ 6 files changed, 232 insertions(+) create mode 100644 src/test/java/org/gcube/common/ContextTest.java create mode 100644 src/test/java/org/gcube/common/context/ContextUtilityTest.java create mode 100644 src/test/resources/.gitignore create mode 100644 src/test/resources/logback-test.xml 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