diff --git a/main/frontend-webdav/pom.xml b/main/frontend-webdav/pom.xml index a6189170f..14f8a8fcd 100644 --- a/main/frontend-webdav/pom.xml +++ b/main/frontend-webdav/pom.xml @@ -19,7 +19,7 @@ Provides access via WebDAV to filesystems - 2.11.0 + 2.11.3 9.3.3.v20150827 diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java b/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java index f33f2f960..4aee0f277 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/DavNode.java @@ -21,6 +21,7 @@ import java.util.Optional; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavResource; import org.apache.jackrabbit.webdav.DavResourceLocator; +import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.lock.ActiveLock; @@ -226,6 +227,9 @@ abstract class DavNode implements DavResour @Override public ActiveLock lock(LockInfo reqLockInfo) throws DavException { + if (Scope.SHARED.equals(reqLockInfo.getScope())) { + throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "Only exclusive write locks supported."); + } return lockManager.createLock(reqLockInfo, this); } diff --git a/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/WebDavServlet.java b/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/WebDavServlet.java index 93e605f07..2b1a840a8 100644 --- a/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/WebDavServlet.java +++ b/main/frontend-webdav/src/main/java/org/cryptomator/webdav/jackrabbitservlet/WebDavServlet.java @@ -8,13 +8,19 @@ *******************************************************************************/ package org.cryptomator.webdav.jackrabbitservlet; +import java.io.IOException; import java.net.URI; +import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavLocatorFactory; import org.apache.jackrabbit.webdav.DavResource; import org.apache.jackrabbit.webdav.DavResourceFactory; +import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSessionProvider; import org.apache.jackrabbit.webdav.WebdavRequest; +import org.apache.jackrabbit.webdav.WebdavResponse; +import org.apache.jackrabbit.webdav.lock.Scope; +import org.apache.jackrabbit.webdav.lock.Type; import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet; import org.cryptomator.filesystem.Folder; import org.cryptomator.filesystem.jackrabbit.FileSystemResourceLocatorFactory; @@ -68,4 +74,46 @@ public class WebDavServlet extends AbstractWebdavServlet { throw new UnsupportedOperationException("Setting resourceFactory not supported."); } + /* LOCK stuff */ + + @Override + protected int validateDestination(DavResource destResource, WebdavRequest request, boolean checkHeader) throws DavException { + if (destResource.hasLock(Type.WRITE, Scope.EXCLUSIVE) && (request.getHeader(HEADER_IF) == null || !request.matchesIfHeader(destResource))) { + throw new DavException(DavServletResponse.SC_LOCKED, "The destination resource was locked"); + } + return super.validateDestination(destResource, request, checkHeader); + } + + @Override + protected void doPut(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { + if (resource.hasLock(Type.WRITE, Scope.EXCLUSIVE) && (request.getHeader(HEADER_IF) == null || !request.matchesIfHeader(resource))) { + throw new DavException(DavServletResponse.SC_LOCKED, "The resource was locked"); + } + super.doPut(request, response, resource); + } + + @Override + protected void doDelete(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { + if (resource.hasLock(Type.WRITE, Scope.EXCLUSIVE) && (request.getHeader(HEADER_IF) == null || !request.matchesIfHeader(resource))) { + throw new DavException(DavServletResponse.SC_LOCKED, "The resource was locked"); + } + super.doDelete(request, response, resource); + } + + @Override + protected void doMove(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { + if (resource.hasLock(Type.WRITE, Scope.EXCLUSIVE) && (request.getHeader(HEADER_IF) == null || !request.matchesIfHeader(resource))) { + throw new DavException(DavServletResponse.SC_LOCKED, "The source resource was locked"); + } + super.doMove(request, response, resource); + } + + @Override + protected void doPropPatch(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { + if (resource.hasLock(Type.WRITE, Scope.EXCLUSIVE) && (request.getHeader(HEADER_IF) == null || !request.matchesIfHeader(resource))) { + throw new DavException(DavServletResponse.SC_LOCKED, "The resource was locked"); + } + super.doPropPatch(request, response, resource); + } + }