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
This commit is contained in:
Matt Ward
2012-05-29 16:10:11 +00:00
parent eb0004fce5
commit 55019252ca
4 changed files with 119 additions and 6 deletions

View File

@@ -84,7 +84,7 @@ public abstract class HierarchicalMethod extends WebDAVMethod
// path, if not then return an error // path, if not then return an error
getDAVHelper().checkDestinationURL(m_request, destURL); 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 // Failed to fix the destination path, return an error

View File

@@ -691,7 +691,7 @@ public class WebDAVHelper
* @param destURL The Destination header. * @param destURL The Destination header.
* @return The path to move/copy the file to. * @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) if (destURL != null && destURL.length() > 0)
{ {
@@ -715,10 +715,16 @@ public class WebDAVHelper
offset = destURL.indexOf(WebDAV.PathSeperator, offset); offset = destURL.indexOf(WebDAV.PathSeperator, offset);
if (offset != -1) if (offset != -1)
{ {
// Strip the host from the beginning
String strPath = destURL.substring(offset); String strPath = destURL.substring(offset);
offset = strPath.indexOf(servletPath);
if (offset != -1) // If it starts with /contextPath/servletPath/ (e.g. /alfresco/webdav/path/to/file) - then
strPath = strPath.substring(offset + servletPath.length()); // 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); return WebDAV.decodeURL(strPath);
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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'.
* <p>
* <code>/webdav-test</code> begins with servlet path <code>/webdav</code>
*/
@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));
}
}

View File

@@ -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() protected final String getServletPath()
{ {
return m_request.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 * Return the root node
* *