Parcourir la source

- check locks, even when no if-header is present
- updated Jackrabbit

Sebastian Stenzel il y a 9 ans
Parent
commit
cbcefc4eb5

+ 1 - 1
main/frontend-webdav/pom.xml

@@ -19,7 +19,7 @@
 	<description>Provides access via WebDAV to filesystems</description>
 
 	<properties>
-		<jackrabbit.version>2.11.0</jackrabbit.version>
+		<jackrabbit.version>2.11.3</jackrabbit.version>
 		<jetty.version>9.3.3.v20150827</jetty.version>
 	</properties>
 

+ 4 - 0
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<T extends FileSystemResourceLocator> 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);
 	}
 

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