diff options
author | Maria Odea B. Ching <oching@apache.org> | 2007-11-22 07:38:01 +0000 |
---|---|---|
committer | Maria Odea B. Ching <oching@apache.org> | 2007-11-22 07:38:01 +0000 |
commit | 750d651eee2954c5bd56786bd0f617972d27b6cf (patch) | |
tree | 6c4acf3a2dcc50d761bbe38bed7f4e0f1ff87a6b | |
parent | 177a4c27656058c7cac7bf1991ece73bbc281b06 (diff) | |
download | archiva-750d651eee2954c5bd56786bd0f617972d27b6cf.tar.gz archiva-750d651eee2954c5bd56786bd0f617972d27b6cf.zip |
[MRM-595]
applied patch submitted by nicolas de loof
-change on archiva-webapp ProxiedDavServer to fecth from proxied prior to computing the resource File
-testcase to demonstrate the issue and the Fix.
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@597318 13f79535-47bb-0310-9956-ffa450edef68
2 files changed, 166 insertions, 69 deletions
diff --git a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java index ad9fc7039..027f58f54 100644 --- a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java +++ b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java @@ -19,6 +19,18 @@ package org.apache.maven.archiva.web.repository; * under the License. */ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; + import org.apache.maven.archiva.common.utils.PathUtil; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.model.ProjectReference; @@ -49,21 +61,9 @@ import org.codehaus.plexus.webdav.DavServerListener; import org.codehaus.plexus.webdav.servlet.DavServerRequest; import org.codehaus.plexus.webdav.util.WebdavMethodUtil; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; - /** * ProxiedDavServer - * + * * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> * @version $Id$ * @plexus.component role="org.codehaus.plexus.webdav.DavServerComponent" @@ -77,12 +77,12 @@ public class ProxiedDavServer * @plexus.requirement role-hint="simple" */ private DavServerComponent davServer; - + /** * @plexus.requirement role="org.apache.maven.archiva.repository.audit.AuditListener" */ private List<AuditListener> auditListeners = new ArrayList<AuditListener>(); - + /** * @plexus.requirement */ @@ -102,7 +102,7 @@ public class ProxiedDavServer * @plexus.requirement */ private MetadataTools metadataTools; - + /** * @plexus.requirement role-hint="xwork" */ @@ -155,7 +155,7 @@ public class ProxiedDavServer boolean isGet = WebdavMethodUtil.isReadMethod( request.getRequest().getMethod() ); boolean isPut = WebdavMethodUtil.isWriteMethod( request.getRequest().getMethod() ); String resource = request.getLogicalResource(); - + if ( isGet ) { // Default behaviour is to treat the resource natively. @@ -165,38 +165,47 @@ public class ProxiedDavServer if ( resourceFile.exists() && resourceFile.isDirectory() ) { String requestURL = request.getRequest().getRequestURL().toString(); - - // [MRM-440] - If webdav URL lacks a trailing /, navigating to all links in the listing return 404. - if( !requestURL.endsWith( "/" ) ) + + // [MRM-440] - If webdav URL lacks a trailing /, navigating to + // all links in the listing return 404. + if ( !requestURL.endsWith( "/" ) ) { String redirectToLocation = requestURL + "/"; response.sendRedirect( redirectToLocation ); return; } - + // Process the request. davServer.process( request, response ); - + // All done. return; } - // At this point the incoming request can either be in default or legacy layout format. + // At this point the incoming request can either be in default or + // legacy layout format. try { - // Perform an adjustment of the resource to the managed repository expected path. - resource = repositoryRequest.toNativePath( request.getLogicalResource(), managedRepository ); - resourceFile = new File( managedRepository.getRepoRoot(), resource ); + boolean fromProxy = fetchContentFromProxies( request, resource ); - // Adjust the pathInfo resource to be in the format that the dav server impl expects. - request.getRequest().setPathInfo( resource ); + // Perform an adjustment of the resource to the managed + // repository expected path. + resource = + repositoryRequest + .toNativePath( request.getLogicalResource(), managedRepository ); + resourceFile = new File( managedRepository.getRepoRoot(), resource ); + + // Adjust the pathInfo resource to be in the format that the dav + // server impl expects. + request.setLogicalResource( resource ); boolean previouslyExisted = resourceFile.exists(); - + // Attempt to fetch the resource from any defined proxy. - if( fetchContentFromProxies( request, resource ) ) + if ( fromProxy ) { - processAuditEvents( request, resource, previouslyExisted, resourceFile, " (proxied)" ); + processAuditEvents( request, resource, previouslyExisted, resourceFile, + " (proxied)" ); } } catch ( LayoutException e ) @@ -210,14 +219,16 @@ public class ProxiedDavServer if ( resourceFile.exists() ) { - // [MRM-503] - Metadata file need Pragma:no-cache response header. + // [MRM-503] - Metadata file need Pragma:no-cache response + // header. if ( request.getLogicalResource().endsWith( "/maven-metadata.xml" ) ) { response.addHeader( "Pragma", "no-cache" ); response.addHeader( "Cache-Control", "no-cache" ); } - // TODO: [MRM-524] determine http caching options for other types of files (artifacts, sha1, md5, snapshots) + // TODO: [MRM-524] determine http caching options for other + // types of files (artifacts, sha1, md5, snapshots) davServer.process( request, response ); } @@ -229,41 +240,44 @@ public class ProxiedDavServer if ( isPut ) { - /* Create parent directories that don't exist when writing a file + /* + * Create parent directories that don't exist when writing a file * This actually makes this implementation not compliant to the - * WebDAV RFC - but we have enough knowledge - * about how the collection is being used to do this reasonably and - * some versions of Maven's WebDAV don't - * correctly create the collections themselves. + * WebDAV RFC - but we have enough knowledge about how the + * collection is being used to do this reasonably and some versions + * of Maven's WebDAV don't correctly create the collections + * themselves. */ File rootDirectory = getRootDirectory(); if ( rootDirectory != null ) { File destDir = new File( rootDirectory, resource ).getParentFile(); - if( !destDir.exists() ) + if ( !destDir.exists() ) { destDir.mkdirs(); - String relPath = PathUtil.getRelative( rootDirectory.getAbsolutePath(), destDir ); + String relPath = + PathUtil.getRelative( rootDirectory.getAbsolutePath(), destDir ); triggerAuditEvent( request, relPath, AuditEvent.CREATE_DIR ); } } - + File resourceFile = new File( managedRepository.getRepoRoot(), resource ); - + boolean previouslyExisted = resourceFile.exists(); - + // Allow the dav server to process the put request. davServer.process( request, response ); - + processAuditEvents( request, resource, previouslyExisted, resourceFile, null ); - + // All done. return; } } - private void respondResourceMissing( DavServerRequest request, HttpServletResponse response, Throwable t ) + private void respondResourceMissing( DavServerRequest request, HttpServletResponse response, + Throwable t ) { response.setStatus( HttpServletResponse.SC_NOT_FOUND ); @@ -294,7 +308,7 @@ public class ProxiedDavServer out.println( "\">" ); out.print( missingUrl.toString() ); out.println( "</a></p>" ); - + if ( t != null ) { out.println( "<pre>" ); @@ -318,7 +332,7 @@ public class ProxiedDavServer if ( repositoryRequest.isSupportFile( resource ) ) { // Checksums are fetched with artifact / metadata. - + // Need to adjust the path for the checksum resource. return false; } @@ -334,15 +348,16 @@ public class ProxiedDavServer { // Get the artifact reference in a layout neutral way. ArtifactReference artifact = repositoryRequest.toArtifactReference( resource ); - + if ( artifact != null ) { applyServerSideRelocation( artifact ); File proxiedFile = connectors.fetchFromProxies( managedRepository, artifact ); - - // Set the path to the resource using managed repository specific layout format. - request.getRequest().setPathInfo( managedRepository.toPath( artifact ) ); + + // Set the path to the resource using managed repository + // specific layout format. + request.setLogicalResource( managedRepository.toPath( artifact ) ); return ( proxiedFile != null ); } } @@ -399,7 +414,7 @@ public class ProxiedDavServer { throw new ServletException( "Unable to fetch project metadata resource.", e ); } - + return false; } @@ -433,12 +448,12 @@ public class ProxiedDavServer // Open and read the POM from the managed repo File pom = managedRepository.toFile( pomReference ); - - if( !pom.exists() ) + + if ( !pom.exists() ) { return; } - + try { Model model = new MavenXpp3Reader().read( new FileReader( pom ) ); @@ -477,52 +492,52 @@ public class ProxiedDavServer // Invalid POM : ignore } } - + @Override public void addListener( DavServerListener listener ) { super.addListener( listener ); davServer.addListener( listener ); } - + @Override public boolean isUseIndexHtml() { return davServer.isUseIndexHtml(); } - + @Override public boolean hasResource( String resource ) { return davServer.hasResource( resource ); } - + @Override public void removeListener( DavServerListener listener ) { davServer.removeListener( listener ); } - + @Override public void setUseIndexHtml( boolean useIndexHtml ) { super.setUseIndexHtml( useIndexHtml ); davServer.setUseIndexHtml( useIndexHtml ); } - + public ManagedRepositoryContent getRepository() { return managedRepository; } - - private void processAuditEvents( DavServerRequest request, String resource, boolean previouslyExisted, - File resourceFile, String suffix ) + + private void processAuditEvents( DavServerRequest request, String resource, + boolean previouslyExisted, File resourceFile, String suffix ) { - if( suffix == null ) + if ( suffix == null ) { suffix = ""; } - + // Process Create Audit Events. if ( !previouslyExisted && resourceFile.exists() ) { @@ -556,7 +571,7 @@ public class ProxiedDavServer } } } - + private void triggerAuditEvent( String user, String remoteIP, String resource, String action ) { AuditEvent event = new AuditEvent( this.getPrefix(), user, resource, action ); @@ -570,7 +585,8 @@ public class ProxiedDavServer private void triggerAuditEvent( DavServerRequest request, String resource, String action ) { - triggerAuditEvent( archivaUser.getActivePrincipal(), getRemoteIP( request ), resource, action ); + triggerAuditEvent( archivaUser.getActivePrincipal(), getRemoteIP( request ), resource, + action ); } private String getRemoteIP( DavServerRequest request ) diff --git a/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/RepositoryServletProxiedRelocatedTest.java b/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/RepositoryServletProxiedRelocatedTest.java new file mode 100644 index 000000000..d9e80570f --- /dev/null +++ b/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/RepositoryServletProxiedRelocatedTest.java @@ -0,0 +1,81 @@ +package org.apache.maven.archiva.web.repository; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import com.meterware.httpunit.GetMethodWebRequest; +import com.meterware.httpunit.HttpUnitOptions; +import com.meterware.httpunit.WebRequest; +import com.meterware.httpunit.WebResponse; + +import org.apache.maven.archiva.policies.ReleasesPolicy; + +import java.io.File; + +/** + * RepositoryServlet Tests, Proxied, Get of Release Artifacts, with varying policy settings. + * + * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> + * @version $Id: RepositoryServletProxiedReleasePolicyTest.java 590908 2007-11-01 06:21:26Z joakime $ + */ +public class RepositoryServletProxiedRelocatedTest + extends AbstractRepositoryServletProxiedTestCase +{ + public void testGetProxiedReleaseArtifactPolicyOncePass() + throws Exception + { + // --- Setup + setupCentralRemoteRepo(); + setupCleanInternalRepo(); + + String resourcePath = "org/apache/archiva/test/1.0/test-1.0.jar"; + String expectedRemoteContents = "archiva-test-1.0|jar-remote-contents"; + populateRepo( remoteCentral, resourcePath, expectedRemoteContents ); + + resourcePath = "archiva/test/1.0/test-1.0.pom"; + String pom = "<project>" + + "<modelVersion>4.0.0</modelVersion>" + + "<groupId>archiva</groupId>" + + "<artifactId>test</artifactId>" + + "<version>1.0</version>" + + "<distributionManagement>" + + "<relocation>" + + "<groupId>org.apache.archiva</groupId>" + + "</relocation>" + + "</distributionManagement>" + + "</project>"; + populateRepo( remoteCentral, resourcePath, pom ); + + resourcePath = "archiva/jars/test-1.0.jar"; + + setupReleaseConnector( REPOID_INTERNAL, remoteCentral, ReleasesPolicy.ONCE ); + saveConfiguration(); + + // --- Execution + // process the response code later, not via an exception. + HttpUnitOptions.setExceptionsThrownOnErrorStatus( false ); + + WebRequest request = new GetMethodWebRequest( "http://machine.com/repository/internal/" + resourcePath ); + WebResponse response = sc.getResponse( request ); + + // --- Verification + assertResponseOK( response ); + assertEquals( "Expected remote file contents", expectedRemoteContents, response.getText() ); + } +} |