diff --git a/config/alfresco/remote-api-context.xml b/config/alfresco/remote-api-context.xml index 018dd362f6..e2ed0d8293 100644 --- a/config/alfresco/remote-api-context.xml +++ b/config/alfresco/remote-api-context.xml @@ -65,6 +65,9 @@ + + ${system.content.maximumFileSizeLimit} + diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java index 963c09dccd..91ba5cbb3d 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java @@ -115,6 +115,29 @@ public class WebDAVHelper private String m_urlPathPrefix; + private long sizeLimit = -1L; + + /** + * This method sets a value for the limit. If the string does not {@link Long#parseLong(String) parse} to a + * java long. + * + * @param limit a String representing a valid Java long. + */ + public void setSizeLimitString(String limit) + { + // A string parameter is used here in order to not to require end users to provide a value for the limit in a property + // file. This results in the empty string being injected to this method. + long longLimit = -1L; + try + { + longLimit = Long.parseLong(limit); + } catch (NumberFormatException ignored) + { + // Intentionally empty + } + this.sizeLimit = longLimit; + } + /** * Set the regular expression that will be applied to filenames during renames * to detect whether clients are performing a renaming shuffle - common during @@ -129,6 +152,14 @@ public class WebDAVHelper this.m_renameShufflePattern = renameShufflePattern; } + /** + * @return Return the limit size + */ + public long getSizeLimit() + { + return sizeLimit; + } + /** * @return Return the authentication service */ diff --git a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java index d3e32f7cb7..b7b70e0c4b 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java @@ -25,7 +25,6 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.io.OutputStream; import java.net.SocketException; import java.util.Date; import java.util.HashMap; @@ -46,8 +45,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.alfresco.model.ContentModel; -import org.alfresco.repo.model.filefolder.HiddenAspect; -import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility; +import org.alfresco.repo.content.LimitedStreamCopier; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.permissions.AccessDeniedException; @@ -68,15 +66,12 @@ import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.transaction.TransactionService; -import org.alfresco.util.FileFilterMode; -import org.alfresco.util.FileFilterMode.Client; import org.alfresco.util.TempFileProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; -import org.springframework.util.FileCopyUtils; import org.w3c.dom.Document; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -289,12 +284,15 @@ public abstract class WebDAVMethod if (this.m_requestBody == null) { this.m_requestBody = TempFileProvider.createTempFile("webdav_" + req.getMethod() + "_", ".bin"); - OutputStream out = new FileOutputStream(this.m_requestBody); - int bytesRead = FileCopyUtils.copy(req.getInputStream(), out); + // copy the streams + LimitedStreamCopier streamCopier = new LimitedStreamCopier(); + long bytes = streamCopier.copyStreamsLong(req.getInputStream(), new FileOutputStream(this.m_requestBody), m_davHelper.getSizeLimit()); + + // get content length + long contentLength = Long.valueOf(req.getHeader(WebDAV.HEADER_CONTENT_LENGTH)); // ALF-7377: check for corrupt request - int contentLength = req.getIntHeader(WebDAV.HEADER_CONTENT_LENGTH); - if (contentLength >= 0 && contentLength != bytesRead) + if (contentLength >= 0 && contentLength != bytes) { throw new IOException("Request body does not have specified Content Length"); }