diff --git a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java index 63126ae996..bd3ba42b16 100644 --- a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java +++ b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java @@ -794,14 +794,9 @@ public class ADMRemoteStore extends BaseRemoteStore properties.put(ContentModel.PROP_NAME, (Serializable) SURF_CONFIG); ChildAssociationRef ref = this.unprotNodeService.createNode( rootRef, ContentModel.ASSOC_CONTAINS, assocQName, ContentModel.TYPE_FOLDER, properties); - - // surf-config needs to be hidden + + // surf-config needs to be hidden - applies index control aspect as part of the hidden aspect hiddenAspect.hideNode(ref.getChildRef()); - - surfConfigRef = ref.getChildRef(); - Map aspectProperties = new HashMap(1, 1.0f); - aspectProperties.put(ContentModel.PROP_IS_INDEXED, false); - this.unprotNodeService.addAspect(surfConfigRef, ContentModel.ASPECT_INDEX_CONTROL, aspectProperties); } return surfConfigRef; } diff --git a/source/java/org/alfresco/repo/webdav/MoveMethod.java b/source/java/org/alfresco/repo/webdav/MoveMethod.java index 39d4ec5f78..2a145937e1 100644 --- a/source/java/org/alfresco/repo/webdav/MoveMethod.java +++ b/source/java/org/alfresco/repo/webdav/MoveMethod.java @@ -23,6 +23,7 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; @@ -31,6 +32,9 @@ import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.dom4j.DocumentHelper; +import org.dom4j.io.XMLWriter; +import org.xml.sax.Attributes; /** * Implements the WebDAV MOVE method @@ -109,8 +113,25 @@ public class MoveMethod extends AbstractMoveOrCopyMethod { if (sourceParentNodeRef.equals(destParentNodeRef)) { - // It is rename method - fileFolderService.rename(sourceNodeRef, name); + // It is rename method + try + { + fileFolderService.rename(sourceNodeRef, name); + } + catch (AccessDeniedException e) + { + XMLWriter xml = createXMLWriter(); + + Attributes nullAttr = getDAVHelper().getNullAttributes(); + + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR, nullAttr); + // Output error + xml.write(DocumentHelper.createElement(WebDAV.XML_NS_CANNOT_MODIFY_PROTECTED_PROPERTY)); + + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR); + m_response.setStatus(HttpServletResponse.SC_CONFLICT); + return; + } } else { diff --git a/source/java/org/alfresco/repo/webdav/UnlockMethod.java b/source/java/org/alfresco/repo/webdav/UnlockMethod.java index 38d8ae24e3..7095feb16d 100644 --- a/source/java/org/alfresco/repo/webdav/UnlockMethod.java +++ b/source/java/org/alfresco/repo/webdav/UnlockMethod.java @@ -68,17 +68,26 @@ public class UnlockMethod extends WebDAVMethod logger.debug("Parsing Lock-Token header: " + strLockTokenHeader); // Validate the lock token - if (strLockTokenHeader != null && strLockTokenHeader.startsWith("<") && strLockTokenHeader.endsWith(">")) + if (strLockTokenHeader != null) { - try + if (!(strLockTokenHeader.startsWith("<") && strLockTokenHeader.endsWith(">"))) { - m_strLockToken = strLockTokenHeader.substring( - WebDAV.OPAQUE_LOCK_TOKEN.length() + 1, - strLockTokenHeader.length() - 1); + // ALF-13904: Header isn't correctly enclosed in < and > characters. Try correcting this + // to allow for Windows 7 + OpenOffice.org bug. + strLockTokenHeader = "<" + strLockTokenHeader + ">"; } - catch (IndexOutOfBoundsException e) + if (strLockTokenHeader.startsWith("<" + WebDAV.OPAQUE_LOCK_TOKEN) && strLockTokenHeader.endsWith(">")) { - logger.warn("Failed to parse If header: " + strLockTokenHeader); + try + { + m_strLockToken = strLockTokenHeader.substring( + WebDAV.OPAQUE_LOCK_TOKEN.length() + 1, + strLockTokenHeader.length() - 1); + } + catch (IndexOutOfBoundsException e) + { + logger.warn("Failed to parse If header: " + strLockTokenHeader); + } } } diff --git a/source/java/org/alfresco/repo/webdav/UnlockMethodTest.java b/source/java/org/alfresco/repo/webdav/UnlockMethodTest.java new file mode 100644 index 0000000000..8212b2175c --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/UnlockMethodTest.java @@ -0,0 +1,87 @@ +package org.alfresco.repo.webdav; + +import static org.junit.Assert.*; + +import javax.servlet.http.HttpServletResponse; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; + +public class UnlockMethodTest +{ + private UnlockMethod unlockMethod; + private MockHttpServletRequest request; + + @Before + public void setUp() throws Exception + { + request = new MockHttpServletRequest(); + + unlockMethod = new UnlockMethod(); + unlockMethod.setDetails(request, null, null, null); + } + + @Test + public void parseValidLockTokenHeader() throws WebDAVServerException + { + String lockToken = "976e2f82-40ab-4852-a867-986e9ce11f82:admin"; + String lockHeaderValue = "<" + WebDAV.OPAQUE_LOCK_TOKEN + lockToken + ">"; + request.addHeader(WebDAV.HEADER_LOCK_TOKEN, lockHeaderValue); + unlockMethod.parseRequestHeaders(); + + assertEquals(lockToken, unlockMethod.getLockToken()); + } + + @Test + public void parseInvalidLockTokenHeader() + { + String lockToken = "976e2f82-40ab-4852-a867-986e9ce11f82:admin"; + String lockHeaderValue = ""; + request.addHeader(WebDAV.HEADER_LOCK_TOKEN, lockHeaderValue); + try + { + unlockMethod.parseRequestHeaders(); + fail("Exception should have been thrown, but wasn't."); + } + catch (WebDAVServerException e) + { + assertEquals(HttpServletResponse.SC_BAD_REQUEST, e.getHttpStatusCode()); + } + } + + @Test + public void parseMissingLockTokenHeader() + { + // Note: we're not adding the lock token header + try + { + unlockMethod.parseRequestHeaders(); + fail("Exception should have been thrown, but wasn't."); + } + catch (WebDAVServerException e) + { + assertEquals(HttpServletResponse.SC_BAD_REQUEST, e.getHttpStatusCode()); + } + } + + /** + * OpenOffice.org on Windows 7 results in a lock token header that is NOT enclosed in + * the required < and > characters. Whilst technically an invalid header, we treat + * this case specially for reasons of interoperability (ALF-13904) + * + * @throws WebDAVServerException + */ + @Test + public void parseLockTokenHeaderFromOOoOnWindows7() throws WebDAVServerException + { + String lockToken = "976e2f82-40ab-4852-a867-986e9ce11f82:admin"; + // Note the missing enclosing < and > characters + String lockHeaderValue = WebDAV.OPAQUE_LOCK_TOKEN + lockToken; + request.addHeader(WebDAV.HEADER_LOCK_TOKEN, lockHeaderValue); + unlockMethod.parseRequestHeaders(); + + assertEquals(lockToken, unlockMethod.getLockToken()); + } +}