mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-08-21 06:36:01 +00:00
- check locks, even when no if-header is present
- updated Jackrabbit
This commit is contained in:
@@ -19,7 +19,7 @@
|
|||||||
<description>Provides access via WebDAV to filesystems</description>
|
<description>Provides access via WebDAV to filesystems</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<jackrabbit.version>2.11.0</jackrabbit.version>
|
<jackrabbit.version>2.11.3</jackrabbit.version>
|
||||||
<jetty.version>9.3.3.v20150827</jetty.version>
|
<jetty.version>9.3.3.v20150827</jetty.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|||||||
+4
@@ -21,6 +21,7 @@ import java.util.Optional;
|
|||||||
import org.apache.jackrabbit.webdav.DavException;
|
import org.apache.jackrabbit.webdav.DavException;
|
||||||
import org.apache.jackrabbit.webdav.DavResource;
|
import org.apache.jackrabbit.webdav.DavResource;
|
||||||
import org.apache.jackrabbit.webdav.DavResourceLocator;
|
import org.apache.jackrabbit.webdav.DavResourceLocator;
|
||||||
|
import org.apache.jackrabbit.webdav.DavServletResponse;
|
||||||
import org.apache.jackrabbit.webdav.DavSession;
|
import org.apache.jackrabbit.webdav.DavSession;
|
||||||
import org.apache.jackrabbit.webdav.MultiStatusResponse;
|
import org.apache.jackrabbit.webdav.MultiStatusResponse;
|
||||||
import org.apache.jackrabbit.webdav.lock.ActiveLock;
|
import org.apache.jackrabbit.webdav.lock.ActiveLock;
|
||||||
@@ -226,6 +227,9 @@ abstract class DavNode<T extends FileSystemResourceLocator> implements DavResour
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActiveLock lock(LockInfo reqLockInfo) throws DavException {
|
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);
|
return lockManager.createLock(reqLockInfo, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
@@ -8,13 +8,19 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.cryptomator.webdav.jackrabbitservlet;
|
package org.cryptomator.webdav.jackrabbitservlet;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
|
||||||
|
import org.apache.jackrabbit.webdav.DavException;
|
||||||
import org.apache.jackrabbit.webdav.DavLocatorFactory;
|
import org.apache.jackrabbit.webdav.DavLocatorFactory;
|
||||||
import org.apache.jackrabbit.webdav.DavResource;
|
import org.apache.jackrabbit.webdav.DavResource;
|
||||||
import org.apache.jackrabbit.webdav.DavResourceFactory;
|
import org.apache.jackrabbit.webdav.DavResourceFactory;
|
||||||
|
import org.apache.jackrabbit.webdav.DavServletResponse;
|
||||||
import org.apache.jackrabbit.webdav.DavSessionProvider;
|
import org.apache.jackrabbit.webdav.DavSessionProvider;
|
||||||
import org.apache.jackrabbit.webdav.WebdavRequest;
|
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.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
|
||||||
import org.cryptomator.filesystem.Folder;
|
import org.cryptomator.filesystem.Folder;
|
||||||
import org.cryptomator.filesystem.jackrabbit.FileSystemResourceLocatorFactory;
|
import org.cryptomator.filesystem.jackrabbit.FileSystemResourceLocatorFactory;
|
||||||
@@ -68,4 +74,46 @@ public class WebDavServlet extends AbstractWebdavServlet {
|
|||||||
throw new UnsupportedOperationException("Setting resourceFactory not supported.");
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user