From 55019252ca78072fbcce3ee9e2fb6aa7b5e846f6 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 29 May 2012 16:10:11 +0000 Subject: [PATCH] THOR-1459: WebDAV: site names cannot start with 'webdav' Core changes to ensure that path extraction is performed correctly. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@37157 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/webdav/HierarchicalMethod.java | 2 +- .../alfresco/repo/webdav/WebDAVHelper.java | 14 ++- .../repo/webdav/WebDAVHelperTest.java | 99 +++++++++++++++++++ .../alfresco/repo/webdav/WebDAVMethod.java | 10 +- 4 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 source/java/org/alfresco/repo/webdav/WebDAVHelperTest.java diff --git a/source/java/org/alfresco/repo/webdav/HierarchicalMethod.java b/source/java/org/alfresco/repo/webdav/HierarchicalMethod.java index e2cecdc2f8..0b624dbb6c 100644 --- a/source/java/org/alfresco/repo/webdav/HierarchicalMethod.java +++ b/source/java/org/alfresco/repo/webdav/HierarchicalMethod.java @@ -84,7 +84,7 @@ public abstract class HierarchicalMethod extends WebDAVMethod // path, if not then return an error getDAVHelper().checkDestinationURL(m_request, destURL); - m_strDestinationPath = getDAVHelper().getDestinationPath(getServletPath(), destURL); + m_strDestinationPath = getDAVHelper().getDestinationPath(getContextPath(), getServletPath(), destURL); // Failed to fix the destination path, return an error diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java index 796696391e..a58b285268 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVHelper.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelper.java @@ -691,7 +691,7 @@ public class WebDAVHelper * @param destURL The Destination header. * @return The path to move/copy the file to. */ - public String getDestinationPath(String servletPath, String destURL) + public String getDestinationPath(String contextPath, String servletPath, String destURL) { if (destURL != null && destURL.length() > 0) { @@ -715,10 +715,16 @@ public class WebDAVHelper offset = destURL.indexOf(WebDAV.PathSeperator, offset); if (offset != -1) { + // Strip the host from the beginning String strPath = destURL.substring(offset); - offset = strPath.indexOf(servletPath); - if (offset != -1) - strPath = strPath.substring(offset + servletPath.length()); + + // If it starts with /contextPath/servletPath/ (e.g. /alfresco/webdav/path/to/file) - then + // strip the servlet path from the start of the path. + String pathPrefix = contextPath + servletPath + WebDAV.PathSeperator; + if (strPath.startsWith(pathPrefix)) + { + strPath = strPath.substring(pathPrefix.length()); + } return WebDAV.decodeURL(strPath); } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVHelperTest.java b/source/java/org/alfresco/repo/webdav/WebDAVHelperTest.java new file mode 100644 index 0000000000..1494d0131b --- /dev/null +++ b/source/java/org/alfresco/repo/webdav/WebDAVHelperTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2005-2012 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + +import static org.junit.Assert.*; + +import org.alfresco.repo.tenant.TenantService; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.security.AuthenticationService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +/** + * Tests for the WebDAVHelper class. + * + * @author Matt Ward + */ +@RunWith(MockitoJUnitRunner.class) +public class WebDAVHelperTest +{ + private WebDAVHelper davHelper; + private @Mock ServiceRegistry serviceRegistry; + private @Mock AuthenticationService authService; + private @Mock TenantService tenantService; + + @Before + public void setUp() throws Exception + { + davHelper = new WebDAVHelper(serviceRegistry, authService, tenantService); + } + + @Test + public void canGetDestinationPathWhenNoServletName() + { + assertPathForURL("/the-tenant.com/the-site/path/to/file", + "http://webdav.alfresco.com/the-tenant.com/the-site/path/to/file"); + + } + + /** + * THOR-1459: WebDAV: site names cannot start with 'webdav'. + *

+ * /webdav-test begins with servlet path /webdav + */ + @Test + public void canGetDestinationPathWhenPathElementStartsWithServletPath() + { + assertPathForURL("/t/webdav-test/path/to/file", + "http://webdav.alfresco.com/t/webdav-test/path/to/file"); + + // Looks like /contextPath/servletName in URL's path prefix, but isn't + assertPathForURL("/alfresco/webdav-test/path/to/file", + "http://webdav.alfresco.com/alfresco/webdav-test/path/to/file"); + } + + @Test + public void canGetDestinationPathWhenPrefixedWithContextPathAndServletName() + { + assertPathForURL("/path/to/file", + "http://webdav.alfresco.com/alfresco/webdav/path/to/file"); + + assertPathForURL("/alfresco/webdav/path/to/file", + "http://webdav.alfresco.com/alfresco/webdav/alfresco/webdav/path/to/file"); + + assertPathForURL("/my/folder/alfresco/webdav/path/to/file", + "http://webdav.alfresco.com/alfresco/webdav/my/folder/alfresco/webdav/path/to/file"); + } + + /** + * Check that the expected path was extracted from a given URL. + * + * @param path The expected path. + * @param url URL to extract the path from. + */ + private void assertPathForURL(String path, String url) + { + assertEquals(path, davHelper.getDestinationPath("/alfresco", "/webdav", url)); + } +} diff --git a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java index 5e5cc6587a..db548e3925 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java @@ -796,13 +796,21 @@ public abstract class WebDAVMethod } /** - * @return Returns the path of the servlet + * @return Returns the path of the servlet, e.g. /webdav */ protected final String getServletPath() { return m_request.getServletPath(); } + /** + * @return Returns the context path of the servlet, e.g. /alfresco + */ + protected final String getContextPath() + { + return m_request.getContextPath(); + } + /** * Return the root node *