package org.apache.archiva.webdav; /* * 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 junit.framework.TestCase; import org.apache.archiva.admin.model.RepositoryAdminException; import org.apache.archiva.admin.model.beans.ManagedRepository; import org.apache.archiva.admin.model.beans.RepositoryGroup; import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin; import org.apache.archiva.admin.repository.DefaultRepositoryCommonValidator; import org.apache.archiva.admin.repository.group.DefaultRepositoryGroupAdmin; import org.apache.archiva.admin.repository.managed.DefaultManagedRepositoryAdmin; import org.apache.archiva.common.plexusbridge.PlexusSisuBridge; import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException; import org.apache.archiva.configuration.ArchivaConfiguration; import org.apache.archiva.configuration.Configuration; import org.apache.archiva.configuration.FileTypes; import org.apache.archiva.configuration.RepositoryGroupConfiguration; import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider; import org.apache.archiva.proxy.ProxyRegistry; import org.apache.archiva.repository.EditableManagedRepository; import org.apache.archiva.repository.ManagedRepositoryContent; import org.apache.archiva.repository.RemoteRepository; import org.apache.archiva.repository.RemoteRepositoryContent; import org.apache.archiva.repository.Repository; import org.apache.archiva.repository.RepositoryContent; import org.apache.archiva.repository.RepositoryContentFactory; import org.apache.archiva.repository.RepositoryContentProvider; import org.apache.archiva.repository.RepositoryException; import org.apache.archiva.repository.RepositoryRegistry; import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent; import org.apache.archiva.repository.content.maven2.MavenRepositoryRequestInfo; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavResourceLocator; import org.apache.jackrabbit.webdav.DavServletRequest; import org.apache.jackrabbit.webdav.DavServletResponse; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import javax.inject.Inject; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import static org.easymock.EasyMock.*; /** * ArchivaDavResourceFactoryTest */ @RunWith( ArchivaSpringJUnit4ClassRunner.class ) @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } ) public class ArchivaDavResourceFactoryTest extends TestCase { private AtomicReference projectBase = new AtomicReference<>(); private static final String RELEASES_REPO = "releases"; private static final String INTERNAL_REPO = "internal"; private static final String LOCAL_MIRROR_REPO = "local-mirror"; private static final String LEGACY_REPO = "legacy-repo"; private static final String LOCAL_REPO_GROUP = "local"; private OverridingArchivaDavResourceFactory resourceFactory; private IMocksControl requestControl; private DavServletRequest request; private IMocksControl repoRequestControl; private MavenRepositoryRequestInfo repoRequest; private IMocksControl responseControl; private DavServletResponse response; private IMocksControl archivaConfigurationControl; private ArchivaConfiguration archivaConfiguration; private Configuration config; private IMocksControl repoContentFactoryControl; private RepositoryContentFactory repoFactory; @Inject ApplicationContext applicationContext; @Inject PlexusSisuBridge plexusSisuBridge; @Inject DefaultManagedRepositoryAdmin defaultManagedRepositoryAdmin; @Inject RepositoryRegistry repositoryRegistry; @Inject RemoteRepositoryAdmin remoteRepositoryAdmin; @Inject ProxyRegistry proxyRegistry; @Inject DefaultRepositoryGroupAdmin defaultRepositoryGroupAdmin; @Inject List artifactMappingProviders; @Inject FileTypes fileTypes; public Path getProjectBase() { if (this.projectBase.get()==null) { String pathVal = System.getProperty("mvn.project.base.dir"); Path baseDir; if (StringUtils.isEmpty(pathVal)) { baseDir= Paths.get("").toAbsolutePath(); } else { baseDir = Paths.get(pathVal).toAbsolutePath(); } this.projectBase.compareAndSet(null, baseDir); } return this.projectBase.get(); } @Before @Override public void setUp() throws Exception { super.setUp(); requestControl = createControl(); request = requestControl.createMock( DavServletRequest.class ); responseControl = createControl(); response = responseControl.createMock( DavServletResponse.class ); //responseControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER ); archivaConfigurationControl = createControl(); archivaConfiguration = archivaConfigurationControl.createMock( ArchivaConfiguration.class ); config = new Configuration(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2, 20 ); expect (archivaConfiguration.getDefaultLocale()).andReturn( Locale.getDefault() ).anyTimes(); archivaConfiguration.addListener( EasyMock.anyObject( ) ); expectLastCall().times(0, 4); archivaConfiguration.save( config ); expectLastCall().times( 0, 4 ); archivaConfigurationControl.replay(); defaultManagedRepositoryAdmin.setArchivaConfiguration( archivaConfiguration ); repositoryRegistry.setArchivaConfiguration( archivaConfiguration ); repositoryRegistry.reload(); ( (DefaultRepositoryCommonValidator) defaultManagedRepositoryAdmin.getRepositoryCommonValidator() ).setArchivaConfiguration( archivaConfiguration ); if ( defaultManagedRepositoryAdmin.getManagedRepository( RELEASES_REPO ) == null ) { defaultManagedRepositoryAdmin.addManagedRepository( createManagedRepository( RELEASES_REPO, getProjectBase().resolve( "target/test-classes/" + RELEASES_REPO ).toString(), "default" ), false, null ); } if ( defaultManagedRepositoryAdmin.getManagedRepository( INTERNAL_REPO ) == null ) { defaultManagedRepositoryAdmin.addManagedRepository( createManagedRepository( INTERNAL_REPO, getProjectBase().resolve( "target/test-classes/" + INTERNAL_REPO ).toString(), "default" ), false, null ); } RepositoryGroup repoGroupConfig = new RepositoryGroup(); repoGroupConfig.setId( LOCAL_REPO_GROUP ); repoGroupConfig.addRepository( RELEASES_REPO ); repoGroupConfig.addRepository( INTERNAL_REPO ); defaultRepositoryGroupAdmin.setArchivaConfiguration( archivaConfiguration ); if ( defaultManagedRepositoryAdmin.getManagedRepository( LOCAL_REPO_GROUP ) == null ) { defaultRepositoryGroupAdmin.addRepositoryGroup( repoGroupConfig, null ); } repoContentFactoryControl = createControl(); repoFactory = repoContentFactoryControl.createMock( RepositoryContentFactory.class ); repoRequestControl = createControl(); repoRequest = repoRequestControl.createMock( MavenRepositoryRequestInfo.class ); resourceFactory = new OverridingArchivaDavResourceFactory( applicationContext, plexusSisuBridge, archivaConfiguration ); resourceFactory.setArchivaConfiguration( archivaConfiguration ); proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).clear(); proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).add(new OverridingRepositoryProxyHandler(this)); resourceFactory.setProxyRegistry(proxyRegistry); resourceFactory.setRemoteRepositoryAdmin( remoteRepositoryAdmin ); resourceFactory.setManagedRepositoryAdmin( defaultManagedRepositoryAdmin ); resourceFactory.setRepositoryRegistry( repositoryRegistry ); } private ManagedRepository createManagedRepository( String id, String location, String layout ) { ManagedRepository repoConfig = new ManagedRepository( Locale.getDefault()); repoConfig.setId( id ); repoConfig.setName( id ); repoConfig.setLocation( location ); repoConfig.setLayout( layout ); return repoConfig; } private ManagedRepositoryContent createManagedRepositoryContent( String repoId ) throws RepositoryAdminException { ManagedRepositoryContent repoContent = new ManagedDefaultRepositoryContent(artifactMappingProviders, fileTypes); org.apache.archiva.repository.ManagedRepository repo = repositoryRegistry.getManagedRepository( repoId ); repoContent.setRepository( repo ); if (repo!=null && repo instanceof EditableManagedRepository) { ( (EditableManagedRepository) repo ).setContent( repoContent ); } return repoContent; } private RepositoryContentProvider createRepositoryContentProvider(ManagedRepositoryContent content) { Set TYPES = new HashSet<>( ); TYPES.add(RepositoryType.MAVEN); return new RepositoryContentProvider( ) { @Override public boolean supportsLayout( String layout ) { return true; } @Override public Set getSupportedRepositoryTypes( ) { return TYPES; } @Override public boolean supports( RepositoryType type ) { return true; } @Override public RemoteRepositoryContent createRemoteContent( RemoteRepository repository ) throws RepositoryException { return null; } @Override public ManagedRepositoryContent createManagedContent( org.apache.archiva.repository.ManagedRepository repository ) throws RepositoryException { content.setRepository( repository ); return content; } @Override public T createContent( Class clazz, V repository ) throws RepositoryException { return null; } }; } @After @Override public void tearDown() throws Exception { super.tearDown(); String appserverBase = System.getProperty( "appserver.base" ); if ( StringUtils.isNotEmpty( appserverBase ) ) { org.apache.archiva.common.utils.FileUtils.deleteDirectory( Paths.get( appserverBase ) ); } } // MRM-1232 - Unable to get artifacts from repositories which requires Repository Manager role using repository group @Test public void testRepositoryGroupFirstRepositoryRequiresAuthentication() throws Exception { DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP, new ArchivaDavLocatorFactory() ); ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO ); ManagedRepositoryContent releasesRepo = createManagedRepositoryContent( RELEASES_REPO ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 ); expect( request.getMethod() ).andReturn( "GET" ).times( 3 ); expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 ); expect( repoFactory.getManagedRepositoryContent( RELEASES_REPO ) ).andReturn( releasesRepo ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 2 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 ); expect( request.getContextPath() ).andReturn( "" ).times( 2 ); expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( true ); expect( repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( "legacy" ); expect( repoRequest.toArtifactReference( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null ); expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(), "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString()); expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo ); expect( repoRequest.isArchetypeCatalog( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ); archivaConfigurationControl.replay(); requestControl.replay(); repoContentFactoryControl.replay(); repoRequestControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); requestControl.verify(); repoContentFactoryControl.verify(); repoRequestControl.verify(); fail( "A DavException with 401 error code should have been thrown." ); } catch ( DavException e ) { assertEquals( 401, e.getErrorCode() ); } } @Test public void testRepositoryGroupLastRepositoryRequiresAuthentication() throws Exception { DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP, new ArchivaDavLocatorFactory() ); List repoGroups = new ArrayList<>(); RepositoryGroupConfiguration repoGroup = new RepositoryGroupConfiguration(); repoGroup.setId( LOCAL_REPO_GROUP ); repoGroup.addRepository( INTERNAL_REPO ); repoGroup.addRepository( RELEASES_REPO ); repoGroups.add( repoGroup ); config.setRepositoryGroups( repoGroups ); ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO ); ManagedRepositoryContent releasesRepo = createManagedRepositoryContent( RELEASES_REPO ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 ); expect( request.getMethod() ).andReturn( "GET" ).times( 3 ); expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 ); expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo ); expect( repoFactory.getManagedRepositoryContent( RELEASES_REPO ) ).andReturn( releasesRepo ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 2 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 ); expect( request.getContextPath() ).andReturn( "" ).times( 2 ); expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ); expect( repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( "legacy" ); expect( repoRequest.toArtifactReference( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null ); expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(), "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString()); expect( repoRequest.isArchetypeCatalog( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ); archivaConfigurationControl.replay(); requestControl.replay(); repoContentFactoryControl.replay(); repoRequestControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); requestControl.verify(); repoContentFactoryControl.verify(); repoRequestControl.verify(); fail( "A DavException with 401 error code should have been thrown." ); } catch ( DavException e ) { assertEquals( 401, e.getErrorCode() ); } } @Test public void testRepositoryGroupArtifactDoesNotExistInAnyOfTheReposAuthenticationDisabled() throws Exception { DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP, new ArchivaDavLocatorFactory() ); defaultManagedRepositoryAdmin.addManagedRepository( createManagedRepository( LOCAL_MIRROR_REPO, Paths.get( "target/test-classes/local-mirror" ).toString(), "default" ), false, null ); List repoGroups = new ArrayList<>(); RepositoryGroupConfiguration repoGroup = new RepositoryGroupConfiguration(); repoGroup.setId( LOCAL_REPO_GROUP ); repoGroup.addRepository( INTERNAL_REPO ); repoGroup.addRepository( LOCAL_MIRROR_REPO ); repoGroups.add( repoGroup ); config.setRepositoryGroups( repoGroups ); ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO ); ManagedRepositoryContent localMirrorRepo = createManagedRepositoryContent( LOCAL_MIRROR_REPO ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 ); expect( request.getMethod() ).andReturn( "GET" ).times( 5 ); expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 ); expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo ); expect( repoFactory.getManagedRepositoryContent( LOCAL_MIRROR_REPO ) ).andReturn( localMirrorRepo ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 4 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 4 ); expect( request.getContextPath() ).andReturn( "" ).times( 2 ); expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ).times( 2 ); expect( repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( "legacy" ).times( 2 ); expect( repoRequest.toArtifactReference( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null ).times( 2 ); expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(), "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString() ); expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ) .andReturn( Paths.get( config.findManagedRepositoryById( LOCAL_MIRROR_REPO ).getLocation(), "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString()); expect( repoRequest.isArchetypeCatalog( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ).times( 2 ); archivaConfigurationControl.replay(); requestControl.replay(); repoContentFactoryControl.replay(); repoRequestControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); requestControl.verify(); repoContentFactoryControl.verify(); repoRequestControl.verify(); fail( "A DavException with 404 error code should have been thrown." ); } catch ( DavException e ) { assertEquals( 404, e.getErrorCode() ); } } // MRM-1239 @Test public void testRequestArtifactMetadataThreePartsRepoHasDefaultLayout() throws Exception { // should fetch metadata DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + INTERNAL_REPO + "/eclipse/jdtcore/maven-metadata.xml", INTERNAL_REPO, new ArchivaDavLocatorFactory() ); ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO ); // use actual object (this performs the isMetadata, isDefault and isSupportFile check!) MavenRepositoryRequestInfo repoRequest = new MavenRepositoryRequestInfo(internalRepo.getRepository() ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 1 ); expect( request.getMethod() ).andReturn( "GET" ).times( 4 ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 ); expect( request.getContextPath() ).andReturn( "" ).times( 1 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 ); expect( request.getRequestURI() ).andReturn( "http://localhost:8080/archiva/repository/" + INTERNAL_REPO + "/eclipse/jdtcore/maven-metadata.xml" ); response.setHeader( "Pragma", "no-cache" ); expectLastCall(); response.setHeader( "Cache-Control", "no-cache" ); expectLastCall(); response.setDateHeader( eq("Last-Modified"), anyLong() ); expectLastCall(); archivaConfigurationControl.replay(); repoContentFactoryControl.replay(); requestControl.replay(); responseControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); repoContentFactoryControl.verify(); requestControl.verify(); responseControl.verify(); } catch ( DavException e ) { e.printStackTrace(); fail( "A DavException should not have been thrown! "+e.getMessage() ); } } @Test public void testRequestArtifactMetadataTwoPartsRepoHasDefaultLayout() throws Exception { // should not fetch metadata DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + INTERNAL_REPO + "/eclipse/maven-metadata.xml", INTERNAL_REPO, new ArchivaDavLocatorFactory() ); ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2 ); expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo ); expect( request.getMethod() ).andReturn( "GET" ).times( 3 ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 ); expect( request.getContextPath() ).andReturn( "" ).times( 2 ); archivaConfigurationControl.replay(); repoContentFactoryControl.replay(); requestControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); repoContentFactoryControl.verify(); requestControl.verify(); fail( "A 404 error should have been thrown!" ); } catch ( DavException e ) { assertEquals( 404, e.getErrorCode() ); } } @Test public void testRequestMetadataRepoIsLegacy() throws Exception { ManagedRepositoryContent legacyRepo = createManagedRepositoryContent( LEGACY_REPO ); ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); RepositoryContentProvider provider = createRepositoryContentProvider(legacyRepo ); beanFactory.registerSingleton("repositoryContentProvider#legacy", provider); RepositoryContentFactory repoContentFactory = applicationContext.getBean( "repositoryContentFactory#default", RepositoryContentFactory.class ); repoContentFactory.getRepositoryContentProviders().add(provider); defaultManagedRepositoryAdmin.addManagedRepository( createManagedRepository( LEGACY_REPO, getProjectBase().resolve( "target/test-classes/" + LEGACY_REPO ).toString(), "legacy" ), false, null ); DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LEGACY_REPO + "/eclipse/maven-metadata.xml", LEGACY_REPO, new ArchivaDavLocatorFactory() ); try { archivaConfigurationControl.reset(); expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2 ); expect( repoFactory.getManagedRepositoryContent( LEGACY_REPO ) ).andReturn( legacyRepo ); expect( request.getMethod() ).andReturn( "GET" ).times( 3 ); expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 ); expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 ); expect( request.getContextPath() ).andReturn( "" ).times( 2 ); archivaConfigurationControl.replay(); repoContentFactoryControl.replay(); requestControl.replay(); resourceFactory.createResource( locator, request, response ); archivaConfigurationControl.verify(); repoContentFactoryControl.verify(); requestControl.verify(); fail( "A 404 error should have been thrown!" ); } catch ( DavException e ) { assertEquals( 404, e.getErrorCode() ); } } class OverridingArchivaDavResourceFactory extends ArchivaDavResourceFactory { OverridingArchivaDavResourceFactory( ApplicationContext applicationContext, PlexusSisuBridge plexusSisuBridge, ArchivaConfiguration archivaConfiguration ) throws PlexusSisuBridgeException { super( applicationContext, plexusSisuBridge, archivaConfiguration ); } @Override protected boolean isAuthorized( DavServletRequest request, String repositoryId ) throws DavException { if ( RELEASES_REPO.equals( repositoryId ) ) { throw new UnauthorizedDavException( repositoryId, "You are not authenticated and authorized to access any repository." ); } else { return true; } } @Override protected String getActivePrincipal( DavServletRequest request ) { return "guest"; } } }