diff --git a/src/main/java/org/entando/entando/web/common/exceptions/FileMaxSizeException.java b/src/main/java/org/entando/entando/web/common/exceptions/FileMaxSizeException.java new file mode 100644 index 000000000..40f4c223a --- /dev/null +++ b/src/main/java/org/entando/entando/web/common/exceptions/FileMaxSizeException.java @@ -0,0 +1,14 @@ +package org.entando.entando.web.common.exceptions; + +import com.agiletec.aps.system.exception.EntRuntimeException; + +public class FileMaxSizeException extends EntRuntimeException { + + public FileMaxSizeException(String message) { + super(message); + } + + public FileMaxSizeException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/entando/entando/web/common/handlers/RestExceptionHandler.java b/src/main/java/org/entando/entando/web/common/handlers/RestExceptionHandler.java index dab8573ba..4bb18cece 100644 --- a/src/main/java/org/entando/entando/web/common/handlers/RestExceptionHandler.java +++ b/src/main/java/org/entando/entando/web/common/handlers/RestExceptionHandler.java @@ -146,6 +146,16 @@ public ErrorRestResponse processValidationError(MethodArgumentNotValidException return processAllErrors(result); } + @ExceptionHandler(value = FileMaxSizeException.class) + @ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE) + @ResponseBody + public ErrorRestResponse processTooLargePayload(FileMaxSizeException ex) { + logger.debug("Handling {} error", ex.getClass().getSimpleName()); + ErrorRestResponse dto = new ErrorRestResponse(); + dto.addError(new RestError("1", "File is too large")); + return dto; + } + private ErrorRestResponse processAllErrors(BindingResult result) { return processAllErrors(result.getFieldErrors(), result.getGlobalErrors()); } diff --git a/src/main/java/org/entando/entando/web/common/interceptor/FileBrowserSizeInterceptor.java b/src/main/java/org/entando/entando/web/common/interceptor/FileBrowserSizeInterceptor.java new file mode 100644 index 000000000..9a92ba5dd --- /dev/null +++ b/src/main/java/org/entando/entando/web/common/interceptor/FileBrowserSizeInterceptor.java @@ -0,0 +1,37 @@ +package org.entando.entando.web.common.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.entando.entando.web.common.exceptions.FileMaxSizeException; +import org.springframework.http.HttpMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +public class FileBrowserSizeInterceptor extends HandlerInterceptorAdapter { + + private int fileUploadMaxSize; + + public FileBrowserSizeInterceptor(int maxSize) { + this.fileUploadMaxSize = maxSize; + } + + public void setFileUploadMaxSize(int fileUploadMaxSize) { + this.fileUploadMaxSize = fileUploadMaxSize; + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + return isValidRequest(request); + } + + private boolean isValidRequest(HttpServletRequest request) { + if (isUploadMethod(request) && request.getContentLength() > this.fileUploadMaxSize) { + throw new FileMaxSizeException("Invalid max content-length"); + } + return true; + } + + private boolean isUploadMethod(HttpServletRequest request) { + HttpMethod method = HttpMethod.resolve(request.getMethod()); + return HttpMethod.POST.equals(method) || HttpMethod.POST.equals(method); + } +} diff --git a/src/main/resources/spring/web/servlet-context.xml b/src/main/resources/spring/web/servlet-context.xml index 437fbd881..101334f77 100644 --- a/src/main/resources/spring/web/servlet-context.xml +++ b/src/main/resources/spring/web/servlet-context.xml @@ -105,10 +105,15 @@ class="org.entando.entando.web.common.interceptor.EntandoOauth2Interceptor" /> - + + + + +