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

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. }