diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 5e7c755..43b83d7 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -1,5 +1,5 @@ - + @@ -7,8 +7,14 @@ - - + + + + + + + + @@ -17,7 +23,10 @@ - + + + + @@ -26,7 +35,10 @@ - + + + + @@ -35,7 +47,10 @@ - + + + + @@ -44,10 +59,10 @@ - - uses - - + + + + @@ -56,7 +71,10 @@ - + + + + @@ -65,7 +83,10 @@ - + + + + @@ -74,7 +95,10 @@ - + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 5340607..428bc70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,22 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [v2.7.3] - 2022-04-27 +## [v2.8.1-SNAPSHOT] - 2022-06-13 + +**New** + +- [#23156] CatalogueResolver enhanced to manage (create/resolve) an input query string **Bug Fixing** -- [#23213] Fixing NoClassDefFoundError: org/geotoolkit/xml/XML +- [#23495] Removed the check on the gcube token stored in thread local. The working context of VRE will be checked from ScopeProvider + + +## [v2.7.3-SNAPSHOT] - 2022-04-27 + +**Bug Fixing** + +- [#23213] Fixed NoClassDefFoundError: org/geotoolkit/xml/XML ## [v2.7.2] - 2022-04-06 diff --git a/pom.xml b/pom.xml index dc7a519..3ff57c4 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.gcube.data.transfer uri-resolver - 2.7.3 + 2.8.1-SNAPSHOT war The URI Resolver is an HTTP URI resolver implemented as a REST service which gives access trough HTTP to different gcube Resolvers and gCube Applications. @@ -249,7 +249,7 @@ 4.8.2 test - + diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueRequest.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueRequest.java index 1a025e5..320ee3c 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueRequest.java +++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueRequest.java @@ -5,15 +5,14 @@ package org.gcube.datatransfer.resolver.catalogue; * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * - * Mar 24, 2022 - * - * Binding Catalogue Request as a JSON + * Apr 20, 2022 */ public class CatalogueRequest { private String gcube_scope; private String entity_context; private String entity_name; + private String query_string; /** * Gets the gcube_scope. @@ -42,19 +41,22 @@ public class CatalogueRequest { return entity_name; } + /** + * Gets the query string. + * + * @return the query string + */ + public String getQuery_string() { + return query_string; + } + /** * To string. * * @return the string */ - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ @Override public String toString() { - StringBuilder builder = new StringBuilder(); builder.append("CatalogueRequest [gcube_scope="); builder.append(gcube_scope); @@ -62,6 +64,8 @@ public class CatalogueRequest { builder.append(entity_context); builder.append(", entity_name="); builder.append(entity_name); + builder.append(", query_string="); + builder.append(query_string); builder.append("]"); return builder.toString(); } diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/resource/CatalogueStaticConfigurations.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/resource/CatalogueStaticConfigurations.java index 07cb718..32da00a 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/resource/CatalogueStaticConfigurations.java +++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/resource/CatalogueStaticConfigurations.java @@ -94,12 +94,12 @@ public class CatalogueStaticConfigurations{ if(toPrivateCKANCatalogueURL.startsWith(prefix)) { toPrivateCKANCatalogueURL = toPrivateCKANCatalogueURL.replaceFirst(prefix, ""); //removing prefix String catalogueName = toPrivateCKANCatalogueURL.substring(0,toPrivateCKANCatalogueURL.indexOf(".d4science")); - LOG.info("Catalogue Name extration returning value: "+catalogueName); + LOG.info("Catalogue Name extraction returning value: "+catalogueName); return catalogueName; } } - LOG.info("Catalogue Name extration returning null"); + LOG.info("Catalogue Name extraction returning null"); return null; } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java index 4b9a1c3..2f76d81 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java @@ -43,7 +43,6 @@ import org.gcube.common.storagehub.model.Metadata; import org.gcube.data.analysis.dminvocation.ActionType; import org.gcube.data.analysis.dminvocation.DataMinerInvocationManager; import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; -import org.gcube.datatransfer.resolver.requesthandler.RequestHandler; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.datatransfer.resolver.services.exceptions.InternalServerException; import org.gcube.datatransfer.resolver.util.ScopeUtil; @@ -119,20 +118,11 @@ public class AnalyticsCreateResolver { logger.debug("The body contains the request: " + jsonRequest.toString()); - String contextToken = SecurityTokenProvider.instance.get(); + String scope = ScopeProvider.instance.get(); // logger.info("SecurityTokenProvider contextToken: "+contextToken); logger.info("ScopeProvider has scope: " + scope); - String appToken = req.getServletContext().getInitParameter(RequestHandler.ROOT_APP_TOKEN); - - if (contextToken.compareTo(appToken) == 0) { - logger.error("Token not passed, SecurityTokenProvider contains the root app token: " - + appToken.substring(0, 10) + "..."); - throw ExceptionManager.unauthorizedException(req, - "You are not authorized. You must pass a token of VRE", this.getClass(), helpURI); - } - String operatorID = jsonRequest.getOperatorId(); if (scope == null || scope.isEmpty()) { @@ -148,8 +138,15 @@ public class AnalyticsCreateResolver { "Mandatory body parameter 'operatorId' not found or empty in the JSON object", this.getClass(), helpURI); } - + ScopeBean scopeBean = new ScopeBean(scope); + if (scopeBean.is(Type.INFRASTRUCTURE) || scopeBean.is(Type.VO)) { + logger.error(Type.INFRASTRUCTURE + "or " + Type.VO + " scope detected, you must set a scope of VRE"); + throw ExceptionManager.unauthorizedException(req, + "You are not authorized. You must pass a token of VRE", this.getClass(), helpURI); + } + + String publicLinkToDMInvFile = ""; if (scopeBean.is(Type.VRE)) { @@ -162,7 +159,8 @@ public class AnalyticsCreateResolver { File tempInvocationFile = null; try { - + + String contextToken = SecurityTokenProvider.instance.get(); String xmlRequest = DataMinerInvocationManager.getInstance().marshalingXML(jsonRequest, true, true); String uniqueName = createDMInvocationFileName(jsonRequest.getOperatorId()); tempInvocationFile = createTempFile(uniqueName, ".xml", xmlRequest.getBytes()); @@ -186,8 +184,9 @@ public class AnalyticsCreateResolver { StorageHubManagement storageHubManagement = new StorageHubManagement(); Metadata metadata = new Metadata(); - Map theMap = new HashMap(); + Map theMap = new HashMap(); theMap.put("owner", owner); + metadata.setMap(theMap); URL thePublicLink = null; try { diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java index 6f781a5..05bb132 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java @@ -18,6 +18,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.apache.commons.codec.binary.Base64; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; @@ -111,8 +112,19 @@ public class CatalogueResolver { } } else { itemCatalogueURL = itemCatalogueURLs.getPrivateVRECataloguePortletURL(); - logger.info("The dataset " + itemCatalogueURLs.getItemName() - + " is a private item (to VRE) so using protected access to CKAN portlet: " + itemCatalogueURL); + logger.info("Either the " + itemCatalogueURLs.getItemName() + + " is not an item (alias dataset) or it is a private item (to VRE) so using protected access to CKAN portlet: " + + itemCatalogueURL); + } + + String queryString = req.getQueryString(); + if (queryString != null) { + logger.info("Query string found: " + queryString); + byte[] stringEncBytes = Base64.encodeBase64(queryString.getBytes()); + String queryStringEnc = "query_string=" + new String(stringEncBytes); + logger.info("Adding Base64 encoded: " + queryString); + itemCatalogueURL += itemCatalogueURL.contains("?") ? "&" : "?"; + itemCatalogueURL += queryStringEnc; } return Response.seeOther(new URL(itemCatalogueURL).toURI()).build(); @@ -190,6 +202,11 @@ public class CatalogueResolver { } String linkURL = String.format("%s/%s/%s/%s", serverUrl, rc.getId(), vreName, jsonRequest.getEntity_name()); + + if (jsonRequest.getQuery_string() != null) { + linkURL += "?" + jsonRequest.getQuery_string(); + } + logger.info("Returining Catalogue URL: " + linkURL); return Response.ok(linkURL).header("Location", linkURL).build(); diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java index d1de43d..274d32a 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java @@ -13,11 +13,9 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; -import org.gcube.datatransfer.resolver.requesthandler.RequestHandler; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.datatransfer.resolver.util.Util; import org.slf4j.Logger; @@ -60,22 +58,18 @@ public class KnimeCreateResolver { logger.info(this.getClass().getSimpleName() + " POST starts..."); try { - String contextToken = SecurityTokenProvider.instance.get(); + String scope = ScopeProvider.instance.get(); // logger.info("SecurityTokenProvider contextToken: "+contextToken); logger.info("ScopeProvider has scope: " + scope); - String appToken = req.getServletContext().getInitParameter(RequestHandler.ROOT_APP_TOKEN); - - if (contextToken.compareTo(appToken) == 0) { - logger.error("Token not passed, SecurityTokenProvider contains the root app token: " - + appToken.substring(0, 10) + "..."); + ScopeBean scopeBean = new ScopeBean(scope); + if (scopeBean.is(Type.INFRASTRUCTURE) || scopeBean.is(Type.VO)) { + logger.error(Type.INFRASTRUCTURE + "or " + Type.VO + " scope detected, you must set a scope of VRE"); throw ExceptionManager.unauthorizedException(req, "You are not authorized. You must pass a token of VRE", this.getClass(), helpURI); } - ScopeBean scopeBean = new ScopeBean(scope); - if (scopeBean.is(Type.VRE)) { String vreName = scopeBean.name(); diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/WekeoResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/WekeoResolver.java index af0c459..92dae4b 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/WekeoResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/WekeoResolver.java @@ -22,12 +22,12 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.codec.binary.Base64; -import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datatransfer.resolver.requesthandler.RequestHandler; +import org.gcube.common.scope.impl.ScopeBean; +import org.gcube.common.scope.impl.ScopeBean.Type; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.datatransfer.resolver.services.exceptions.NotFoundException; import org.gcube.resources.discovery.client.api.DiscoveryClient; @@ -72,15 +72,12 @@ public class WekeoResolver { try { - String contextToken = SecurityTokenProvider.instance.get(); String scope = ScopeProvider.instance.get(); logger.info("ScopeProvider has scope: " + scope); - - String appToken = req.getServletContext().getInitParameter(RequestHandler.ROOT_APP_TOKEN); - - if (contextToken.compareTo(appToken) == 0) { - logger.error("Token not passed, SecurityTokenProvider contains the root app token: " - + appToken.substring(0, 10) + "..."); + + ScopeBean scopeBean = new ScopeBean(scope); + if (scopeBean.is(Type.INFRASTRUCTURE) || scopeBean.is(Type.VO)) { + logger.error(Type.INFRASTRUCTURE + "or " + Type.VO + " scope detected, you must set a scope of VRE"); throw ExceptionManager.unauthorizedException(req, "You are not authorized. You must pass a token of VRE", this.getClass(), helpURI); } diff --git a/src/test/java/rest/TestResolvers.java b/src/test/java/rest/TestResolvers.java index 2b510cb..f5a4ac5 100644 --- a/src/test/java/rest/TestResolvers.java +++ b/src/test/java/rest/TestResolvers.java @@ -15,19 +15,10 @@ import java.nio.file.StandardCopyOption; import java.util.List; import java.util.Map; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; - import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.http.HttpStatus; -import org.gcube.common.storagehub.client.StreamDescriptor; -import org.gcube.common.storagehub.client.plugins.AbstractPlugin; -import org.gcube.common.storagehub.client.proxies.ItemManagerClient; import org.gcube.datatransfer.resolver.applicationprofile.ApplicationProfileReader; -import org.gcube.datatransfer.resolver.services.StorageHubResolver; -import org.gcube.datatransfer.resolver.services.error.ExceptionManager; -import org.gcube.datatransfer.resolver.shub.StorageHubMetadataResponseBuilder; import org.gcube.datatransfer.resolver.util.HTTPCallsUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +33,7 @@ import org.slf4j.LoggerFactory; public class TestResolvers { - public static final String URI_RESOLVER_SERVICE_ENDPOINT = "https://data1-d.d4science.net"; + public static final String URI_RESOLVER_SERVICE_ENDPOINT = "https://data.dev.d4science.org"; public static final Logger logger = LoggerFactory.getLogger(TestResolvers.class);