From d4652c439fd002ab03bed5cbc4b5d3dc2f888fab Mon Sep 17 00:00:00 2001 From: Zlatin Todorinski Date: Thu, 27 Oct 2022 17:56:50 +0300 Subject: [PATCH] Removed unnecessary project references from BOM; Aligned URI encoding; Added support for WrappingWebScriptRequest for transaction required configuration in webscript descriptors; Added MultipartRespolver for "unorthodox" multipart processing (e.g. with PUT methods); Added escaping for special characters in the URI when comparing with regex; --- alfresco-mvc-bom/pom.xml | 5 --- ...lfrescoMvcServletContextConfiguration.java | 16 ++++++--- .../mvc/webscript/DispatcherWebscript.java | 35 +++++++++++++++---- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/alfresco-mvc-bom/pom.xml b/alfresco-mvc-bom/pom.xml index d8620be..967c5a1 100644 --- a/alfresco-mvc-bom/pom.xml +++ b/alfresco-mvc-bom/pom.xml @@ -44,11 +44,6 @@ UTF-8 - - alfresco-mvc-rest - alfresco-mvc-aop - - diff --git a/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/rest/config/DefaultAlfrescoMvcServletContextConfiguration.java b/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/rest/config/DefaultAlfrescoMvcServletContextConfiguration.java index a358270..97b0603 100644 --- a/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/rest/config/DefaultAlfrescoMvcServletContextConfiguration.java +++ b/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/rest/config/DefaultAlfrescoMvcServletContextConfiguration.java @@ -38,6 +38,7 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.lang.Nullable; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -51,6 +52,8 @@ import com.gradecak.alfresco.mvc.rest.jackson.Jackson2QnameDeserializer; import com.gradecak.alfresco.mvc.rest.jackson.Jackson2QnameSerializer; +import javax.servlet.http.HttpServletRequest; + @Configuration public class DefaultAlfrescoMvcServletContextConfiguration implements WebMvcConfigurer { @@ -75,15 +78,20 @@ public AlfrescoApiResponseInterceptor alfrescoResponseInterceptor(ResourceWebScr } @Bean - public CommonsMultipartResolver multipartResolver() { - final CommonsMultipartResolver resolver = new CommonsMultipartResolver(); + public MultipartResolver multipartResolver() { + MultipartResolver resolver = createMultipartResolver(); + configureMultipartResolver(resolver); + return resolver; + } + + protected MultipartResolver createMultipartResolver() { + CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(-1); resolver.setDefaultEncoding("utf-8"); - configureMultipartResolver(resolver); return resolver; } - void configureMultipartResolver(final CommonsMultipartResolver resolver) { + protected void configureMultipartResolver(final MultipartResolver resolver) { } @Bean diff --git a/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/webscript/DispatcherWebscript.java b/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/webscript/DispatcherWebscript.java index 9fd80b2..16f56e0 100644 --- a/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/webscript/DispatcherWebscript.java +++ b/alfresco-mvc-rest/src/main/java/com/gradecak/alfresco/mvc/webscript/DispatcherWebscript.java @@ -17,6 +17,9 @@ package com.gradecak.alfresco.mvc.webscript; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; @@ -52,6 +55,7 @@ import org.springframework.extensions.webscripts.AbstractWebScript; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; +import org.springframework.extensions.webscripts.WrappingWebScriptRequest; import org.springframework.extensions.webscripts.WrappingWebScriptResponse; import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest; import org.springframework.extensions.webscripts.servlet.WebScriptServletResponse; @@ -94,10 +98,14 @@ public DispatcherWebscript(final String servletName, boolean inheritGlobalProper } public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException { + WebScriptServletRequest origReq; + if(req instanceof WrappingWebScriptRequest) { + origReq = (WebScriptServletRequest)((WrappingWebScriptRequest) req).getNext(); + } else { + origReq = (WebScriptServletRequest) req; + } - final WebScriptServletRequest origReq = (WebScriptServletRequest) req; - - WebScriptServletResponse wsr = null; + WebScriptServletResponse wsr; if (res instanceof WrappingWebScriptResponse) { wsr = (WebScriptServletResponse) ((WrappingWebScriptResponse) res).getNext(); } else { @@ -113,6 +121,7 @@ public void execute(WebScriptRequest req, WebScriptResponse res) throws IOExcept s.service(wrapper, sr); } catch (Throwable e) { + LOGGER.error("Failed to call {}", origReq.getURL()); throw new IOException(e); } } @@ -253,6 +262,15 @@ public WebscriptRequestWrapper(WebScriptServletRequest request) { @Override public String getRequestURI() { String uri = super.getRequestURI(); + try { + uri = URLDecoder.decode(uri, StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + LOGGER.error(e.getMessage(), e); + return ""; + } + + LOGGER.debug("Processing [{}] {}", super.getMethod(), uri); + if (uri.contains("$")) { uri = uri.replaceAll("\\$", "%24"); } @@ -263,12 +281,17 @@ public String getRequestURI() { } Pattern pattern = Pattern - .compile("(^" + origReq.getServiceContextPath() + "/)(.*)(/" + Pattern.quote(origUri) + ")"); + .compile( + "(^" + origReq.getServiceContextPath() + "/)" + + "(.*)" + + "(/" + Pattern.quote(origUri) + ")" + ); Matcher matcher = pattern.matcher(uri); - if (matcher.find()) { try { - return matcher.group(EXTENSION_PATH_REGEXP_GROUP_INDEX); + String result = matcher.group(EXTENSION_PATH_REGEXP_GROUP_INDEX); + LOGGER.debug("Found [{}] {} ---> {}", super.getMethod(), uri, result); + return result; } catch (Exception e) { // let an empty string be returned LOGGER.warn("no such group (3) in regexp while URI evaluation", e);