From 26b47e74dd33d5be2237af39efd6f04f78aa5073 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 11 Mar 2016 22:31:09 +0000 Subject: [PATCH] Merged 5.1.N (5.1.1) to HEAD (5.2) 122553 aleahu: Merged 5.0.N (5.0.4) to 5.1.N (5.1.1) 122494 amorarasu: Merged V4.2-BUG-FIX (4.2.7) to 5.0.N (5.0.4) 122434 rneamtu: Merged V4.2.6 (4.2.6) to V4.2-BUG-FIX (4.2.7) 122333 amorarasu: Merged DEV to V4.2.6 (4.2.6) 121922 122190 122271 122292 amorarasu: MNT-13739: Site consumers are able to lock documents (they did not create) via WebDAV - Went back to using the secured lock service - Unlock resource after MOVE only if the it was locked git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@123676 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/remote-api-context.xml | 3 +- .../org/alfresco/repo/webdav/MoveMethod.java | 46 +++++++++++++++---- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/config/alfresco/remote-api-context.xml b/config/alfresco/remote-api-context.xml index b1fddde825..21f6d6b54f 100644 --- a/config/alfresco/remote-api-context.xml +++ b/config/alfresco/remote-api-context.xml @@ -11,8 +11,7 @@ - - + diff --git a/source/java/org/alfresco/repo/webdav/MoveMethod.java b/source/java/org/alfresco/repo/webdav/MoveMethod.java index 6f3fa2728a..e009b4f86b 100644 --- a/source/java/org/alfresco/repo/webdav/MoveMethod.java +++ b/source/java/org/alfresco/repo/webdav/MoveMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2016 Alfresco Software Limited. * * This file is part of Alfresco * @@ -23,7 +23,8 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; -import org.alfresco.repo.security.permissions.AccessDeniedException; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; @@ -31,9 +32,6 @@ import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; -import org.dom4j.DocumentHelper; -import org.dom4j.io.XMLWriter; -import org.xml.sax.Attributes; /** * Implements the WebDAV MOVE method @@ -192,9 +190,10 @@ public class MoveMethod extends HierarchicalMethod throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); } } + LockInfo lockInfo = null; if (isMove) { - checkNode(sourceFileInfo); + lockInfo = checkNode(sourceFileInfo); } // ALF-7079 fix, if destination exists then its content is updated with source content and source is deleted if // this is a move @@ -210,7 +209,7 @@ public class MoveMethod extends HierarchicalMethod // don't delete source that is node with version history fileFolderService.setHidden(sourceNodeRef, true); // As per the WebDAV spec, we make sure the node is unlocked once moved - getDAVHelper().getLockService().unlock(sourceNodeRef); + unlock(sourceNodeRef, lockInfo); } else { @@ -243,7 +242,7 @@ public class MoveMethod extends HierarchicalMethod fileFolderService.setHidden(sourceNodeRef, true); // As per the WebDAV spec, we make sure the node is unlocked once moved - getDAVHelper().getLockService().unlock(sourceNodeRef); + unlock(sourceNodeRef, lockInfo); } else if (sourceParentNodeRef.equals(destParentNodeRef)) { @@ -268,7 +267,7 @@ public class MoveMethod extends HierarchicalMethod } // As per the WebDAV spec, we make sure the node is unlocked once moved - getDAVHelper().getLockService().unlock(sourceNodeRef); + unlock(sourceNodeRef, lockInfo); } else { @@ -287,7 +286,7 @@ public class MoveMethod extends HierarchicalMethod fileFolderService.moveFrom(sourceNodeRef, sourceParentNodeRef, destParentNodeRef, name); // As per the WebDAV spec, we make sure the node is unlocked once moved - getDAVHelper().getLockService().unlock(sourceNodeRef); + unlock(sourceNodeRef, lockInfo); } } @@ -311,4 +310,31 @@ public class MoveMethod extends HierarchicalMethod contentWriter.putContent(reader); } } + + /** + * Unlock only if the node was locked in the first place. + */ + private void unlock(final NodeRef nodeRef, LockInfo lockInfo) + { + if (lockInfo != null && lockInfo.isLocked()) + { + if (lockInfo.isExpired()) + { + // If the lock expired unlock as system user + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + getDAVHelper().getLockService().unlock(nodeRef); + return null; + } + }, AuthenticationUtil.getSystemUserName()); + } + // else unlock as current user + else + { + getDAVHelper().getLockService().unlock(nodeRef); + } + } + } }