diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index cfa6374..facc6b9 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,6 +4,9 @@ + + uses + diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java index c8f6283..b64bb91 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java @@ -17,20 +17,32 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + /** * The Class UriResolverRewriteFilter. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Apr 5, 2016 + * Dec 5, 2016 */ public class UriResolverRewriteFilter implements Filter{ + /** + * + */ + public static final String SERVLET_URI_RESOLVER = "/uri-resolver"; + + private static final String PATH_SEPARATOR = "/"; public static final String SERVLET_GEONETWORK = "/geonetwork"; public static final String PARAMETER_FILTER_PUBLIC_IDS = "filterpublicids"; public static final String PARAMETER_NO_AUTHENTICATION = "noauthentication"; public static final String REQUEST_PARAMETER_SEPARATOR = "#"; - protected static final String SMP_ID = "smp-id"; - protected static final String SERVLET_RESOLVER_BY_ID = "id"; + + public static final String PARAMETER_SMP_ID = "smp-id"; + public static final String SERVLET_STORAGE_ID = "id"; + + public static final String PARAMETER_CATALOGUE_LINK = "cl"; + public static final String SERVLET_CATALOGUE = "/catalogue"; + protected static final Logger logger = LoggerFactory.getLogger(UriResolverRewriteFilter.class); private FilterConfig config; @@ -64,20 +76,25 @@ public class UriResolverRewriteFilter implements Filter{ logger.debug("Request URI: " + requestURI + ", QueryString: " +queryString+ ", Servlet path: "+multiReadRequest.getServletPath()); //IS A REQUEST FOR GEONETWORK AUTHENTICATION? (CKAN HARVESTING?) - if(isGeonetworkRequest(multiReadRequest.getServletPath())){ + if(multiReadRequest.getServletPath().startsWith(SERVLET_GEONETWORK) || multiReadRequest.getServletPath().startsWith(SERVLET_URI_RESOLVER+SERVLET_GEONETWORK)){ logger.debug("is geonetwork request"); GeonetworkRequestDecoder grd = new GeonetworkRequestDecoder(multiReadRequest.getServletPath(), queryString); logger.debug("forward to: "+grd.getNewURI()); multiReadRequest.getRequestDispatcher(grd.getNewURI()).forward(multiReadRequest, response); - }else if(multiReadRequest.getServletPath().compareTo("/catalogue")==0){ + }else if(multiReadRequest.getServletPath().startsWith(SERVLET_CATALOGUE) || multiReadRequest.getServletPath().startsWith(SERVLET_URI_RESOLVER+SERVLET_CATALOGUE)){ logger.debug("is a catalogue request"); - chain.doFilter(multiReadRequest, response); + int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); + String toCatalogueLink = requestURI.substring(lastSlash + 1, requestURI.length()); + String newURI = SERVLET_CATALOGUE + "?" + PARAMETER_CATALOGUE_LINK + "=" + toCatalogueLink; + logger.debug("forward to: " + newURI); + multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); + //chain.doFilter(multiReadRequest, response); }else{ //IS WORKSPACE REQUEST? if (queryString == null) { // IS A /XXXXX logger.debug("QueryString is null, is It a new SMP public uri by ID?"); - int lastSlash = requestURI.lastIndexOf("/"); + int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); if (lastSlash + 1 == requestURI.length()) { logger.debug("'/' is last index, doFilter Request"); // req.getRequestDispatcher("/").forward(req, res); @@ -87,7 +104,7 @@ public class UriResolverRewriteFilter implements Filter{ String toStorageID = requestURI.substring(lastSlash + 1, requestURI.length()); // String newURI = requestURI.replace(toReplace, // SERVLET_RESOLVER_BY_ID+"?"+SMP_ID+"="+toReplace); - String newURI = SERVLET_RESOLVER_BY_ID + "?" + SMP_ID + "=" + toStorageID; + String newURI = SERVLET_STORAGE_ID + "?" + PARAMETER_SMP_ID + "=" + toStorageID; logger.debug("forward to: " + newURI); multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); } @@ -108,17 +125,7 @@ public class UriResolverRewriteFilter implements Filter{ private static String getScope(String scope){ logger.debug("Read scope path: "+scope); // String scope = servletPath.substring(servletPath.indexOf("/"), servletPath.length()); - return "/"+scope.replaceAll("_", "/"); - } - - /** - * Checks if is geonetwork request. - * - * @param servletPath the servlet path - * @return true, if is geonetwork request - */ - private boolean isGeonetworkRequest(String servletPath){ - return servletPath.startsWith(SERVLET_GEONETWORK); + return PATH_SEPARATOR+scope.replaceAll("_", PATH_SEPARATOR); } /* (non-Javadoc) diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java index e128035..f3ce038 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java +++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java @@ -16,7 +16,7 @@ import java.util.Map; public class CatalogueEntityRequest { - Map parameters = new HashMap(); + private Map parameters = new HashMap(); /** * Instantiates a new catalogue entity request. diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java index d5007da..5e1ab4e 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java @@ -17,6 +17,7 @@ import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.io.IOUtils; import org.gcube.common.encryption.StringEncrypter; import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.datatransfer.resolver.UriResolverRewriteFilter; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -37,7 +38,11 @@ public class CatalogueResolver extends HttpServlet{ private static final String TEXT_PALIN_CHARSET_UTF_8 = "text/plain;charset=UTF-8"; public static final String UTF_8 = "UTF-8"; - public static final String CATALOGUE_LINK_PARAM = "CL"; //CATALOGUE LINK + public static final String CATALOGUE_LINK_PARAM = UriResolverRewriteFilter.PARAMETER_CATALOGUE_LINK; + + private static final String PATH_SEPARATOR = "/"; + + public static final String PARAMETER_PATH = "path"; public static final String ENV_SCOPE = "SCOPE"; //Environment Variable @@ -88,40 +93,72 @@ public class CatalogueResolver extends HttpServlet{ logger.info("Trying to decode encoded catalogue query link: "+catalogueQueryLink); if(catalogueQueryLink==null || catalogueQueryLink.isEmpty()){ - logger.error(""); - sendError(resp, HttpStatus.SC_BAD_REQUEST, "Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+"parameter"); + logger.error("Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+" parameter"); + sendError(resp, HttpStatus.SC_BAD_REQUEST, "Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+" parameter"); + return; } + String base64DecodedId = ""; + String decryptedDCId = ""; try { - String base64DecodedId = base64DecodeString(catalogueQueryLink); + + base64DecodedId = base64DecodeString(catalogueQueryLink); logger.info("Base 64 decoded Data Catalogue Link: "+base64DecodedId +", now decrypting..."); if(scopeToEncDecr==null) initScopeFromEnv(); ScopeProvider.instance.set(scopeToEncDecr); - String decryptedDCId = StringEncrypter.getEncrypter().decrypt(base64DecodedId); + decryptedDCId = StringEncrypter.getEncrypter().decrypt(base64DecodedId); logger.info("Decrypted Data Catalogue Link: "+decryptedDCId); }catch (Exception e) { - - e.printStackTrace(); + logger.error("An error occurred during decrypting data catalogue link: "+base64DecodedId+", using the scope: "+scopeToEncDecr, e); + sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "The system cannot decrypt the Catalogue Link"); + return; } - /*String scope = cer.getValueOfParameter(CatalogueRequestParameter.GCUBE_SCOPE.getKey()); - logger.info("Using scope "+scope+ " to search Ckan Portlet URL from IS"); - ScopeProvider.instance.set(scope); - String ckanPorltetUrl = CkanPorltetApplicationProfile.getPortletUrlFromInfrastrucure(); - if(ckanPorltetUrl == null || ckanPorltetUrl.isEmpty()){ - sendError(null, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later"); + CatalogueEntityRequest cer = new CatalogueEntityRequest(); + for (CatalogueRequestParameter parameter : CatalogueRequestParameter.values()) { + String value = getValueOfParameter(parameter.getKey(), decryptedDCId); + cer.addParameterToRequest(parameter.getKey(), value); + } + + logger.debug("Read parameters: "+cer.toString()); + + String scope = cer.getValueOfParameter(CatalogueRequestParameter.GCUBE_SCOPE.getKey()); + if(scope==null || scope.isEmpty()){ + logger.error("An error occurred during resolving data catalogue link: "+base64DecodedId+", the scope to search CKan Portlet is null or empty"); + sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "The system cannot resolve the Catalogue Link, the scope is null or empty"); return; - }*/ - resp.getWriter().write("Get AVAILABLE"); + } + + String ckanPorltetUrl = ""; + try{ + logger.info("Using scope "+scope+ " to search Ckan Portlet URL from IS"); + ScopeProvider.instance.set(scope); + ckanPorltetUrl = CkanPorltetApplicationProfile.getPortletUrlFromInfrastrucure(); + if(ckanPorltetUrl == null || ckanPorltetUrl.isEmpty()){ + sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later"); + return; + } + }catch(Exception e){ + logger.error("An error occurred during discovery Data Catalogue URL: ",e); + sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later"); + return; + } + + //UrlEncoderUtil.encodeQuery(cer.getParameters()); + String buildPath = PARAMETER_PATH +"="; + buildPath+= PATH_SEPARATOR+cer.getValueOfParameter(CatalogueRequestParameter.ENTITY_CONTEXT.getKey()) + PATH_SEPARATOR; + buildPath+=cer.getValueOfParameter(CatalogueRequestParameter.ENTITY_NAME.getKey()); + + String finalUrl = ckanPorltetUrl+"?"+buildPath; + logger.info("Builded final URL: "+finalUrl); + resp.sendRedirect(resp.encodeRedirectURL(finalUrl)); } - - /* (non-Javadoc) * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @@ -194,14 +231,18 @@ public class CatalogueResolver extends HttpServlet{ String buildLink = getServerURL(req); buildLink += req.getRequestURI(); - String query = UrlEncoderUtil.encodeQuery(cer.getParameters()); + //String query = UrlEncoderUtil.encodeQuery(cer.getParameters()); + String query = ""; + for (String key : cer.getParameters().keySet()) { + query+=key+"="+ cer.getParameters().get(key) +"&"; + } + query = UrlEncoderUtil.removeLastChar(query); logger.info("Builded query string: "+query); String encriptedQuery = StringEncrypter.getEncrypter().encrypt(query); logger.info("Encrypted query: "+encriptedQuery); String encodedQuery = base64EncodeStringURLSafe(encriptedQuery); - String catalogueQueryLink = CATALOGUE_LINK_PARAM+"="+encodedQuery; - logger.info("Catalogue Query Link: "+catalogueQueryLink); - buildLink+="?"+catalogueQueryLink; + logger.info("Catalogue Query Link: "+encodedQuery); + buildLink+=PATH_SEPARATOR+encodedQuery; logger.info("Writing Catalogue Link: "+buildLink); resp.setContentType(TEXT_PALIN_CHARSET_UTF_8); @@ -281,6 +322,33 @@ public class CatalogueResolver extends HttpServlet{ return uToS; } + + /** + * Gets the value of parameter in the passed query string, null otherwise + * + * @param parameter the parameter + * @param httpQueryString the http query string + * @return the value of parameter if exists, null otherwise + */ + public static String getValueOfParameter(String parameter, String httpQueryString) { +// logger.trace("finding: "+wmsParam +" into "+url); + int index = httpQueryString.toLowerCase().indexOf(parameter.toLowerCase()+"="); //ADDING CHAR "=" IN TAIL TO BE SECURE IT IS A PARAMETER +// logger.trace("start index of "+wmsParam+ " is: "+index); + String value = ""; + if(index > -1){ + + int start = index + parameter.length()+1; //add +1 for char '=' + String sub = httpQueryString.substring(start, httpQueryString.length()); + int indexOfSeparator = sub.indexOf("&"); + int end = indexOfSeparator!=-1?indexOfSeparator:sub.length(); + value = sub.substring(0, end); + }else + return null; + +// logger.trace("return value: "+value); + return value; + } + /** * Base64 encode string url safe. *