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);
+ }
+
}