You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ArchivaDavResourceFactoryTest.java 30KB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. package org.apache.archiva.webdav;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import junit.framework.TestCase;
  21. import org.apache.archiva.admin.model.RepositoryAdminException;
  22. import org.apache.archiva.admin.model.beans.ManagedRepository;
  23. import org.apache.archiva.admin.model.beans.RepositoryGroup;
  24. import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
  25. import org.apache.archiva.admin.repository.DefaultRepositoryCommonValidator;
  26. import org.apache.archiva.admin.repository.group.DefaultRepositoryGroupAdmin;
  27. import org.apache.archiva.admin.repository.managed.DefaultManagedRepositoryAdmin;
  28. import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
  29. import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
  30. import org.apache.archiva.configuration.ArchivaConfiguration;
  31. import org.apache.archiva.configuration.Configuration;
  32. import org.apache.archiva.configuration.FileTypes;
  33. import org.apache.archiva.configuration.RepositoryGroupConfiguration;
  34. import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider;
  35. import org.apache.archiva.proxy.ProxyRegistry;
  36. import org.apache.archiva.repository.EditableManagedRepository;
  37. import org.apache.archiva.repository.ManagedRepositoryContent;
  38. import org.apache.archiva.repository.RemoteRepository;
  39. import org.apache.archiva.repository.RemoteRepositoryContent;
  40. import org.apache.archiva.repository.Repository;
  41. import org.apache.archiva.repository.RepositoryContent;
  42. import org.apache.archiva.repository.RepositoryContentFactory;
  43. import org.apache.archiva.repository.RepositoryContentProvider;
  44. import org.apache.archiva.repository.RepositoryException;
  45. import org.apache.archiva.repository.RepositoryRegistry;
  46. import org.apache.archiva.repository.RepositoryType;
  47. import org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent;
  48. import org.apache.archiva.repository.content.maven2.MavenRepositoryRequestInfo;
  49. import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
  50. import org.apache.commons.lang.StringUtils;
  51. import org.apache.jackrabbit.webdav.DavException;
  52. import org.apache.jackrabbit.webdav.DavResourceLocator;
  53. import org.apache.jackrabbit.webdav.DavServletRequest;
  54. import org.apache.jackrabbit.webdav.DavServletResponse;
  55. import org.easymock.EasyMock;
  56. import org.easymock.IMocksControl;
  57. import org.junit.After;
  58. import org.junit.Before;
  59. import org.junit.Test;
  60. import org.junit.runner.RunWith;
  61. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  62. import org.springframework.context.ApplicationContext;
  63. import org.springframework.context.ConfigurableApplicationContext;
  64. import org.springframework.test.context.ContextConfiguration;
  65. import javax.inject.Inject;
  66. import java.nio.file.Path;
  67. import java.nio.file.Paths;
  68. import java.util.ArrayList;
  69. import java.util.HashSet;
  70. import java.util.List;
  71. import java.util.Locale;
  72. import java.util.Set;
  73. import java.util.concurrent.atomic.AtomicReference;
  74. import static org.easymock.EasyMock.*;
  75. /**
  76. * ArchivaDavResourceFactoryTest
  77. */
  78. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  79. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
  80. public class ArchivaDavResourceFactoryTest
  81. extends TestCase
  82. {
  83. private AtomicReference<Path> projectBase = new AtomicReference<>();
  84. private static final String RELEASES_REPO = "releases";
  85. private static final String INTERNAL_REPO = "internal";
  86. private static final String LOCAL_MIRROR_REPO = "local-mirror";
  87. private static final String LEGACY_REPO = "legacy-repo";
  88. private static final String LOCAL_REPO_GROUP = "local";
  89. private OverridingArchivaDavResourceFactory resourceFactory;
  90. private IMocksControl requestControl;
  91. private DavServletRequest request;
  92. private IMocksControl repoRequestControl;
  93. private MavenRepositoryRequestInfo repoRequest;
  94. private IMocksControl responseControl;
  95. private DavServletResponse response;
  96. private IMocksControl archivaConfigurationControl;
  97. private ArchivaConfiguration archivaConfiguration;
  98. private Configuration config;
  99. private IMocksControl repoContentFactoryControl;
  100. private RepositoryContentFactory repoFactory;
  101. @Inject
  102. ApplicationContext applicationContext;
  103. @Inject
  104. PlexusSisuBridge plexusSisuBridge;
  105. @Inject
  106. DefaultManagedRepositoryAdmin defaultManagedRepositoryAdmin;
  107. @Inject
  108. RepositoryRegistry repositoryRegistry;
  109. @Inject
  110. RemoteRepositoryAdmin remoteRepositoryAdmin;
  111. @Inject
  112. ProxyRegistry proxyRegistry;
  113. @Inject
  114. DefaultRepositoryGroupAdmin defaultRepositoryGroupAdmin;
  115. @Inject
  116. List<? extends ArtifactMappingProvider> artifactMappingProviders;
  117. @Inject
  118. FileTypes fileTypes;
  119. public Path getProjectBase() {
  120. if (this.projectBase.get()==null) {
  121. String pathVal = System.getProperty("mvn.project.base.dir");
  122. Path baseDir;
  123. if (StringUtils.isEmpty(pathVal)) {
  124. baseDir= Paths.get("").toAbsolutePath();
  125. } else {
  126. baseDir = Paths.get(pathVal).toAbsolutePath();
  127. }
  128. this.projectBase.compareAndSet(null, baseDir);
  129. }
  130. return this.projectBase.get();
  131. }
  132. @Before
  133. @Override
  134. public void setUp()
  135. throws Exception
  136. {
  137. super.setUp();
  138. requestControl = createControl();
  139. request = requestControl.createMock( DavServletRequest.class );
  140. responseControl = createControl();
  141. response = responseControl.createMock( DavServletResponse.class );
  142. //responseControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
  143. archivaConfigurationControl = createControl();
  144. archivaConfiguration = archivaConfigurationControl.createMock( ArchivaConfiguration.class );
  145. config = new Configuration();
  146. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2, 20 );
  147. expect (archivaConfiguration.getDefaultLocale()).andReturn( Locale.getDefault() ).anyTimes();
  148. archivaConfiguration.addListener( EasyMock.anyObject( ) );
  149. expectLastCall().times(0, 4);
  150. archivaConfiguration.save( config );
  151. expectLastCall().times( 0, 4 );
  152. archivaConfigurationControl.replay();
  153. defaultManagedRepositoryAdmin.setArchivaConfiguration( archivaConfiguration );
  154. repositoryRegistry.setArchivaConfiguration( archivaConfiguration );
  155. repositoryRegistry.reload();
  156. ( (DefaultRepositoryCommonValidator) defaultManagedRepositoryAdmin.getRepositoryCommonValidator() ).setArchivaConfiguration(
  157. archivaConfiguration );
  158. if ( defaultManagedRepositoryAdmin.getManagedRepository( RELEASES_REPO ) == null )
  159. {
  160. defaultManagedRepositoryAdmin.addManagedRepository(
  161. createManagedRepository( RELEASES_REPO, getProjectBase().resolve( "target/test-classes/" + RELEASES_REPO ).toString(),
  162. "default" ), false, null );
  163. }
  164. if ( defaultManagedRepositoryAdmin.getManagedRepository( INTERNAL_REPO ) == null )
  165. {
  166. defaultManagedRepositoryAdmin.addManagedRepository(
  167. createManagedRepository( INTERNAL_REPO, getProjectBase().resolve( "target/test-classes/" + INTERNAL_REPO ).toString(),
  168. "default" ), false, null );
  169. }
  170. RepositoryGroup repoGroupConfig = new RepositoryGroup();
  171. repoGroupConfig.setId( LOCAL_REPO_GROUP );
  172. repoGroupConfig.addRepository( RELEASES_REPO );
  173. repoGroupConfig.addRepository( INTERNAL_REPO );
  174. defaultRepositoryGroupAdmin.setArchivaConfiguration( archivaConfiguration );
  175. if ( defaultManagedRepositoryAdmin.getManagedRepository( LOCAL_REPO_GROUP ) == null )
  176. {
  177. defaultRepositoryGroupAdmin.addRepositoryGroup( repoGroupConfig, null );
  178. }
  179. repoContentFactoryControl = createControl();
  180. repoFactory = repoContentFactoryControl.createMock( RepositoryContentFactory.class );
  181. repoRequestControl = createControl();
  182. repoRequest = repoRequestControl.createMock( MavenRepositoryRequestInfo.class );
  183. resourceFactory =
  184. new OverridingArchivaDavResourceFactory( applicationContext, plexusSisuBridge, archivaConfiguration );
  185. resourceFactory.setArchivaConfiguration( archivaConfiguration );
  186. proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).clear();
  187. proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).add(new OverridingRepositoryProxyHandler(this));
  188. resourceFactory.setProxyRegistry(proxyRegistry);
  189. resourceFactory.setRemoteRepositoryAdmin( remoteRepositoryAdmin );
  190. resourceFactory.setManagedRepositoryAdmin( defaultManagedRepositoryAdmin );
  191. resourceFactory.setRepositoryRegistry( repositoryRegistry );
  192. }
  193. private ManagedRepository createManagedRepository( String id, String location, String layout )
  194. {
  195. ManagedRepository repoConfig = new ManagedRepository( Locale.getDefault());
  196. repoConfig.setId( id );
  197. repoConfig.setName( id );
  198. repoConfig.setLocation( location );
  199. repoConfig.setLayout( layout );
  200. return repoConfig;
  201. }
  202. private ManagedRepositoryContent createManagedRepositoryContent( String repoId )
  203. throws RepositoryAdminException
  204. {
  205. ManagedRepositoryContent repoContent = new ManagedDefaultRepositoryContent(artifactMappingProviders, fileTypes);
  206. org.apache.archiva.repository.ManagedRepository repo = repositoryRegistry.getManagedRepository( repoId );
  207. repoContent.setRepository( repo );
  208. if (repo!=null && repo instanceof EditableManagedRepository)
  209. {
  210. ( (EditableManagedRepository) repo ).setContent( repoContent );
  211. }
  212. return repoContent;
  213. }
  214. private RepositoryContentProvider createRepositoryContentProvider(ManagedRepositoryContent content) {
  215. Set<RepositoryType> TYPES = new HashSet<>( );
  216. TYPES.add(RepositoryType.MAVEN);
  217. return new RepositoryContentProvider( )
  218. {
  219. @Override
  220. public boolean supportsLayout( String layout )
  221. {
  222. return true;
  223. }
  224. @Override
  225. public Set<RepositoryType> getSupportedRepositoryTypes( )
  226. {
  227. return TYPES;
  228. }
  229. @Override
  230. public boolean supports( RepositoryType type )
  231. {
  232. return true;
  233. }
  234. @Override
  235. public RemoteRepositoryContent createRemoteContent( RemoteRepository repository ) throws RepositoryException
  236. {
  237. return null;
  238. }
  239. @Override
  240. public ManagedRepositoryContent createManagedContent( org.apache.archiva.repository.ManagedRepository repository ) throws RepositoryException
  241. {
  242. content.setRepository( repository );
  243. return content;
  244. }
  245. @Override
  246. public <T extends RepositoryContent, V extends Repository> T createContent( Class<T> clazz, V repository ) throws RepositoryException
  247. {
  248. return null;
  249. }
  250. };
  251. }
  252. @After
  253. @Override
  254. public void tearDown()
  255. throws Exception
  256. {
  257. super.tearDown();
  258. String appserverBase = System.getProperty( "appserver.base" );
  259. if ( StringUtils.isNotEmpty( appserverBase ) )
  260. {
  261. org.apache.archiva.common.utils.FileUtils.deleteDirectory( Paths.get( appserverBase ) );
  262. }
  263. }
  264. // MRM-1232 - Unable to get artifacts from repositories which requires Repository Manager role using repository group
  265. @Test
  266. public void testRepositoryGroupFirstRepositoryRequiresAuthentication()
  267. throws Exception
  268. {
  269. DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP
  270. + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP,
  271. new ArchivaDavLocatorFactory() );
  272. ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO );
  273. ManagedRepositoryContent releasesRepo = createManagedRepositoryContent( RELEASES_REPO );
  274. try
  275. {
  276. archivaConfigurationControl.reset();
  277. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 );
  278. expect( request.getMethod() ).andReturn( "GET" ).times( 3 );
  279. expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 );
  280. expect( repoFactory.getManagedRepositoryContent( RELEASES_REPO ) ).andReturn( releasesRepo );
  281. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 2 );
  282. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 );
  283. expect( request.getContextPath() ).andReturn( "" ).times( 2 );
  284. expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( true );
  285. expect(
  286. repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn(
  287. "legacy" );
  288. expect( repoRequest.toArtifactReference(
  289. "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null );
  290. expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar"
  291. ) ).andReturn(
  292. Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(),
  293. "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString());
  294. expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo );
  295. expect( repoRequest.isArchetypeCatalog(
  296. "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false );
  297. archivaConfigurationControl.replay();
  298. requestControl.replay();
  299. repoContentFactoryControl.replay();
  300. repoRequestControl.replay();
  301. resourceFactory.createResource( locator, request, response );
  302. archivaConfigurationControl.verify();
  303. requestControl.verify();
  304. repoContentFactoryControl.verify();
  305. repoRequestControl.verify();
  306. fail( "A DavException with 401 error code should have been thrown." );
  307. }
  308. catch ( DavException e )
  309. {
  310. assertEquals( 401, e.getErrorCode() );
  311. }
  312. }
  313. @Test
  314. public void testRepositoryGroupLastRepositoryRequiresAuthentication()
  315. throws Exception
  316. {
  317. DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP
  318. + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP,
  319. new ArchivaDavLocatorFactory() );
  320. List<RepositoryGroupConfiguration> repoGroups = new ArrayList<>();
  321. RepositoryGroupConfiguration repoGroup = new RepositoryGroupConfiguration();
  322. repoGroup.setId( LOCAL_REPO_GROUP );
  323. repoGroup.addRepository( INTERNAL_REPO );
  324. repoGroup.addRepository( RELEASES_REPO );
  325. repoGroups.add( repoGroup );
  326. config.setRepositoryGroups( repoGroups );
  327. ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO );
  328. ManagedRepositoryContent releasesRepo = createManagedRepositoryContent( RELEASES_REPO );
  329. try
  330. {
  331. archivaConfigurationControl.reset();
  332. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 );
  333. expect( request.getMethod() ).andReturn( "GET" ).times( 3 );
  334. expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 );
  335. expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo );
  336. expect( repoFactory.getManagedRepositoryContent( RELEASES_REPO ) ).andReturn( releasesRepo );
  337. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 2 );
  338. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 );
  339. expect( request.getContextPath() ).andReturn( "" ).times( 2 );
  340. expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false );
  341. expect(
  342. repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn(
  343. "legacy" );
  344. expect( repoRequest.toArtifactReference(
  345. "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null );
  346. expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar"
  347. ) ).andReturn(
  348. Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(),
  349. "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString());
  350. expect( repoRequest.isArchetypeCatalog(
  351. "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false );
  352. archivaConfigurationControl.replay();
  353. requestControl.replay();
  354. repoContentFactoryControl.replay();
  355. repoRequestControl.replay();
  356. resourceFactory.createResource( locator, request, response );
  357. archivaConfigurationControl.verify();
  358. requestControl.verify();
  359. repoContentFactoryControl.verify();
  360. repoRequestControl.verify();
  361. fail( "A DavException with 401 error code should have been thrown." );
  362. }
  363. catch ( DavException e )
  364. {
  365. assertEquals( 401, e.getErrorCode() );
  366. }
  367. }
  368. @Test
  369. public void testRepositoryGroupArtifactDoesNotExistInAnyOfTheReposAuthenticationDisabled()
  370. throws Exception
  371. {
  372. DavResourceLocator locator = new ArchivaDavResourceLocator( "", "/repository/" + LOCAL_REPO_GROUP
  373. + "/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar", LOCAL_REPO_GROUP,
  374. new ArchivaDavLocatorFactory() );
  375. defaultManagedRepositoryAdmin.addManagedRepository(
  376. createManagedRepository( LOCAL_MIRROR_REPO, Paths.get( "target/test-classes/local-mirror" ).toString(),
  377. "default" ), false, null );
  378. List<RepositoryGroupConfiguration> repoGroups = new ArrayList<>();
  379. RepositoryGroupConfiguration repoGroup = new RepositoryGroupConfiguration();
  380. repoGroup.setId( LOCAL_REPO_GROUP );
  381. repoGroup.addRepository( INTERNAL_REPO );
  382. repoGroup.addRepository( LOCAL_MIRROR_REPO );
  383. repoGroups.add( repoGroup );
  384. config.setRepositoryGroups( repoGroups );
  385. ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO );
  386. ManagedRepositoryContent localMirrorRepo = createManagedRepositoryContent( LOCAL_MIRROR_REPO );
  387. try
  388. {
  389. archivaConfigurationControl.reset();
  390. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 3 );
  391. expect( request.getMethod() ).andReturn( "GET" ).times( 5 );
  392. expect( request.getPathInfo() ).andReturn( "org/apache/archiva" ).times( 0, 2 );
  393. expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo );
  394. expect( repoFactory.getManagedRepositoryContent( LOCAL_MIRROR_REPO ) ).andReturn( localMirrorRepo );
  395. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 4 );
  396. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 4 );
  397. expect( request.getContextPath() ).andReturn( "" ).times( 2 );
  398. expect( repoRequest.isSupportFile( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ).times( 2 );
  399. expect(
  400. repoRequest.getLayout( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn(
  401. "legacy" ).times( 2 );
  402. expect( repoRequest.toArtifactReference(
  403. "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( null ).times( 2 );
  404. expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar"
  405. ) ).andReturn(
  406. Paths.get( config.findManagedRepositoryById( INTERNAL_REPO ).getLocation(),
  407. "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString() );
  408. expect( repoRequest.toNativePath( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar"
  409. ) )
  410. .andReturn( Paths.get( config.findManagedRepositoryById( LOCAL_MIRROR_REPO ).getLocation(),
  411. "target/test-classes/internal/org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ).toString());
  412. expect( repoRequest.isArchetypeCatalog( "org/apache/archiva/archiva/1.2-SNAPSHOT/archiva-1.2-SNAPSHOT.jar" ) ).andReturn( false ).times( 2 );
  413. archivaConfigurationControl.replay();
  414. requestControl.replay();
  415. repoContentFactoryControl.replay();
  416. repoRequestControl.replay();
  417. resourceFactory.createResource( locator, request, response );
  418. archivaConfigurationControl.verify();
  419. requestControl.verify();
  420. repoContentFactoryControl.verify();
  421. repoRequestControl.verify();
  422. fail( "A DavException with 404 error code should have been thrown." );
  423. }
  424. catch ( DavException e )
  425. {
  426. assertEquals( 404, e.getErrorCode() );
  427. }
  428. }
  429. // MRM-1239
  430. @Test
  431. public void testRequestArtifactMetadataThreePartsRepoHasDefaultLayout()
  432. throws Exception
  433. {
  434. // should fetch metadata
  435. DavResourceLocator locator =
  436. new ArchivaDavResourceLocator( "", "/repository/" + INTERNAL_REPO + "/eclipse/jdtcore/maven-metadata.xml",
  437. INTERNAL_REPO, new ArchivaDavLocatorFactory() );
  438. ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO );
  439. // use actual object (this performs the isMetadata, isDefault and isSupportFile check!)
  440. MavenRepositoryRequestInfo repoRequest = new MavenRepositoryRequestInfo(internalRepo.getRepository() );
  441. try
  442. {
  443. archivaConfigurationControl.reset();
  444. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 1 );
  445. expect( request.getMethod() ).andReturn( "GET" ).times( 4 );
  446. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 );
  447. expect( request.getContextPath() ).andReturn( "" ).times( 1 );
  448. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 );
  449. expect( request.getRequestURI() ).andReturn( "http://localhost:8080/archiva/repository/" + INTERNAL_REPO + "/eclipse/jdtcore/maven-metadata.xml" );
  450. response.setHeader( "Pragma", "no-cache" );
  451. expectLastCall();
  452. response.setHeader( "Cache-Control", "no-cache" );
  453. expectLastCall();
  454. response.setDateHeader( eq("Last-Modified"), anyLong() );
  455. expectLastCall();
  456. archivaConfigurationControl.replay();
  457. repoContentFactoryControl.replay();
  458. requestControl.replay();
  459. responseControl.replay();
  460. resourceFactory.createResource( locator, request, response );
  461. archivaConfigurationControl.verify();
  462. repoContentFactoryControl.verify();
  463. requestControl.verify();
  464. responseControl.verify();
  465. }
  466. catch ( DavException e )
  467. {
  468. e.printStackTrace();
  469. fail( "A DavException should not have been thrown! "+e.getMessage() );
  470. }
  471. }
  472. @Test
  473. public void testRequestArtifactMetadataTwoPartsRepoHasDefaultLayout()
  474. throws Exception
  475. {
  476. // should not fetch metadata
  477. DavResourceLocator locator =
  478. new ArchivaDavResourceLocator( "", "/repository/" + INTERNAL_REPO + "/eclipse/maven-metadata.xml",
  479. INTERNAL_REPO, new ArchivaDavLocatorFactory() );
  480. ManagedRepositoryContent internalRepo = createManagedRepositoryContent( INTERNAL_REPO );
  481. try
  482. {
  483. archivaConfigurationControl.reset();
  484. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2 );
  485. expect( repoFactory.getManagedRepositoryContent( INTERNAL_REPO ) ).andReturn( internalRepo );
  486. expect( request.getMethod() ).andReturn( "GET" ).times( 3 );
  487. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 );
  488. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 );
  489. expect( request.getContextPath() ).andReturn( "" ).times( 2 );
  490. archivaConfigurationControl.replay();
  491. repoContentFactoryControl.replay();
  492. requestControl.replay();
  493. resourceFactory.createResource( locator, request, response );
  494. archivaConfigurationControl.verify();
  495. repoContentFactoryControl.verify();
  496. requestControl.verify();
  497. fail( "A 404 error should have been thrown!" );
  498. }
  499. catch ( DavException e )
  500. {
  501. assertEquals( 404, e.getErrorCode() );
  502. }
  503. }
  504. @Test
  505. public void testRequestMetadataRepoIsLegacy()
  506. throws Exception
  507. {
  508. ManagedRepositoryContent legacyRepo = createManagedRepositoryContent( LEGACY_REPO );
  509. ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
  510. RepositoryContentProvider provider = createRepositoryContentProvider(legacyRepo );
  511. beanFactory.registerSingleton("repositoryContentProvider#legacy", provider);
  512. RepositoryContentFactory repoContentFactory = applicationContext.getBean( "repositoryContentFactory#default", RepositoryContentFactory.class );
  513. repoContentFactory.getRepositoryContentProviders().add(provider);
  514. defaultManagedRepositoryAdmin.addManagedRepository(
  515. createManagedRepository( LEGACY_REPO, getProjectBase().resolve( "target/test-classes/" + LEGACY_REPO ).toString(),
  516. "legacy" ), false, null );
  517. DavResourceLocator locator =
  518. new ArchivaDavResourceLocator( "", "/repository/" + LEGACY_REPO + "/eclipse/maven-metadata.xml",
  519. LEGACY_REPO, new ArchivaDavLocatorFactory() );
  520. try
  521. {
  522. archivaConfigurationControl.reset();
  523. expect( archivaConfiguration.getConfiguration() ).andReturn( config ).times( 2 );
  524. expect( repoFactory.getManagedRepositoryContent( LEGACY_REPO ) ).andReturn( legacyRepo );
  525. expect( request.getMethod() ).andReturn( "GET" ).times( 3 );
  526. expect( request.getRemoteAddr() ).andReturn( "http://localhost:8080" ).times( 3 );
  527. expect( request.getDavSession() ).andReturn( new ArchivaDavSession() ).times( 2 );
  528. expect( request.getContextPath() ).andReturn( "" ).times( 2 );
  529. archivaConfigurationControl.replay();
  530. repoContentFactoryControl.replay();
  531. requestControl.replay();
  532. resourceFactory.createResource( locator, request, response );
  533. archivaConfigurationControl.verify();
  534. repoContentFactoryControl.verify();
  535. requestControl.verify();
  536. fail( "A 404 error should have been thrown!" );
  537. }
  538. catch ( DavException e )
  539. {
  540. assertEquals( 404, e.getErrorCode() );
  541. }
  542. }
  543. class OverridingArchivaDavResourceFactory
  544. extends ArchivaDavResourceFactory
  545. {
  546. OverridingArchivaDavResourceFactory( ApplicationContext applicationContext, PlexusSisuBridge plexusSisuBridge,
  547. ArchivaConfiguration archivaConfiguration )
  548. throws PlexusSisuBridgeException
  549. {
  550. super( applicationContext, plexusSisuBridge, archivaConfiguration );
  551. }
  552. @Override
  553. protected boolean isAuthorized( DavServletRequest request, String repositoryId )
  554. throws DavException
  555. {
  556. if ( RELEASES_REPO.equals( repositoryId ) )
  557. {
  558. throw new UnauthorizedDavException( repositoryId,
  559. "You are not authenticated and authorized to access any repository." );
  560. }
  561. else
  562. {
  563. return true;
  564. }
  565. }
  566. @Override
  567. protected String getActivePrincipal( DavServletRequest request )
  568. {
  569. return "guest";
  570. }
  571. }
  572. }