Author: oching
Date: Sun Nov 22 09:28:36 2009
New Revision: 883051

URL: http://svn.apache.org/viewvc?rev=883051&view=rev
Log:
[MRM-747] Archiva should prevent re-deployment of released or non-snapshot 
versioned artifacts
o make blocking of re-dployments configurable per repository
o added test

Modified:
    
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
    
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/resources/org/apache/maven/archiva/configuration/default-archiva.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/repositoryForm.jspf
    
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/AbstractRepositoryServletTestCase.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletDeployTest.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java

Modified: 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
 Sun Nov 22 09:28:36 2009
@@ -476,6 +476,13 @@
           <defaultValue>true</defaultValue>
         </field>
         <field>
+          <name>blockRedeployments</name>
+          <version>1.0.0+</version>
+          <type>boolean</type>
+          <description>True if re-deployment of artifacts already in the 
repository will be blocked.</description>
+          <defaultValue>false</defaultValue>
+        </field>
+        <field>
           <name>snapshots</name>
           <version>1.0.0+</version>
           <type>boolean</type>

Modified: 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/resources/org/apache/maven/archiva/configuration/default-archiva.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/resources/org/apache/maven/archiva/configuration/default-archiva.xml?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/resources/org/apache/maven/archiva/configuration/default-archiva.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-base/archiva-configuration/src/main/resources/org/apache/maven/archiva/configuration/default-archiva.xml
 Sun Nov 22 09:28:36 2009
@@ -9,6 +9,7 @@
       <layout>default</layout>
       <releases>true</releases>
       <snapshots>false</snapshots>
+      <blockRedeployments>true</blockRedeployments>
       <scanned>true</scanned>
       <refreshCronExpression>0 0 * * * ?</refreshCronExpression>
       <daysOlder>30</daysOlder>
@@ -20,6 +21,7 @@
       <layout>default</layout>
       <releases>false</releases>
       <snapshots>true</snapshots>
+      <blockRedeployments>false</blockRedeployments>
       <scanned>true</scanned>
       <refreshCronExpression>0 0\,30 * * * ?</refreshCronExpression>
       <daysOlder>30</daysOlder>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java
 Sun Nov 22 09:28:36 2009
@@ -52,13 +52,15 @@
     {
         this.repository = new ManagedRepositoryConfiguration();
         this.repository.setReleases( false );
-        this.repository.setScanned( false );
+        this.repository.setScanned( false );      
+        this.repository.setBlockRedeployments( false );
     }
 
     public String input()
     {
         this.repository.setReleases( true );
         this.repository.setScanned( true );
+        this.repository.setBlockRedeployments( true );
 
         return INPUT;
     }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/repositoryForm.jspf
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/repositoryForm.jspf?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/repositoryForm.jspf
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/include/repositoryForm.jspf
 Sun Nov 22 09:28:36 2009
@@ -28,6 +28,7 @@
 <s:textfield name="repository.daysOlder" label="Repository Purge By Days Older 
Than" size="5"/>
 <s:textfield name="repository.retentionCount" label="Repository Purge By 
Retention Count" size="5"/>
 <s:checkbox name="repository.releases" value="repository.releases" 
label="Releases Included"/>
+<s:checkbox name="repository.blockRedeployments" 
value="repository.blockRedeployments" label="Block Re-deployments of Released 
Artifacts"/>
 <s:checkbox name="repository.snapshots" value="repository.snapshots" 
label="Snapshots Included"/>
 <s:checkbox name="repository.scanned" value="repository.scanned" 
label="Scannable"/>
 <s:checkbox name="repository.deleteReleasedSnapshots" 
value="repository.deleteReleasedSnapshots"

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
 Sun Nov 22 09:28:36 2009
@@ -485,7 +485,7 @@
                 String resourcePath = logicalResource.getPath();
                 
                 // check if target repo is enabled for releases
-                // we suppose that release-artifacts can deployed only to 
repos enabled for releases
+                // we suppose that release-artifacts can be deployed only to 
repos enabled for releases
                 if ( managedRepository.getRepository().isReleases() && 
!repositoryRequest.isMetadata( resourcePath ) &&
                     !repositoryRequest.isSupportFile( resourcePath ) )
                 {
@@ -496,10 +496,10 @@
                         
                         if ( !VersionUtil.isSnapshot( artifact.getVersion() ) )
                         {
-                            // check if artifact already exists
-                            if ( managedRepository.hasContent( artifact ) )
+                            // check if artifact already exists and if 
artifact re-deployment to the repository is allowed
+                            if ( managedRepository.hasContent( artifact ) && 
managedRepository.getRepository().isBlockRedeployments() )
                             {
-                                log.warn( "Overwriting released artifacts is 
not allowed." );
+                                log.warn( "Overwriting released artifacts in 
repository '" + managedRepository.getId() + "' is not allowed." );
                                 throw new DavException( 
HttpServletResponse.SC_CONFLICT,
                                                         "Overwriting released 
artifacts is not allowed." );
                             }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/AbstractRepositoryServletTestCase.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/AbstractRepositoryServletTestCase.java?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/AbstractRepositoryServletTestCase.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/AbstractRepositoryServletTestCase.java
 Sun Nov 22 09:28:36 2009
@@ -119,12 +119,14 @@
                              response.getResponseCode() );
     }
 
-    protected ManagedRepositoryConfiguration createManagedRepository( String 
id, String name, File location )
+    protected ManagedRepositoryConfiguration createManagedRepository( String 
id, String name, File location, boolean blockRedeployments )
     {
         ManagedRepositoryConfiguration repo = new 
ManagedRepositoryConfiguration();
         repo.setId( id );
         repo.setName( name );
         repo.setLocation( location.getAbsolutePath() );
+        repo.setBlockRedeployments( blockRedeployments );
+        
         return repo;
     }
 
@@ -182,7 +184,7 @@
         repoRootInternal = new File( appserverBase, 
"data/repositories/internal" );
         Configuration config = archivaConfiguration.getConfiguration();
 
-        config.addManagedRepository( createManagedRepository( REPOID_INTERNAL, 
"Internal Test Repo", repoRootInternal ) );
+        config.addManagedRepository( createManagedRepository( REPOID_INTERNAL, 
"Internal Test Repo", repoRootInternal, true ) );
         saveConfiguration( archivaConfiguration );
 
         CacheManager.getInstance().removeCache( "url-failures-cache" );

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletDeployTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletDeployTest.java?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletDeployTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletDeployTest.java
 Sun Nov 22 09:28:36 2009
@@ -27,6 +27,8 @@
 import java.io.InputStream;
 
 import javax.servlet.http.HttpServletResponse;
+
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.webdav.httpunit.MkColMethodWebRequest;
 
 
@@ -98,6 +100,46 @@
         assertResponseConflictError( response );        
     }
     
+    public void testReleaseArtifactsRedeploymentIsAllowed()
+        throws Exception
+    {
+        setupCleanRepo( repoRootInternal );
+        
+        ManagedRepositoryConfiguration managedRepo = 
archivaConfiguration.getConfiguration().findManagedRepositoryById( 
REPOID_INTERNAL );
+        managedRepo.setBlockRedeployments( false );
+        
+        saveConfiguration( archivaConfiguration );
+    
+        String putUrl = "http://machine.com/repository/internal"; + 
ARTIFACT_DEFAULT_LAYOUT;
+        String metadataUrl = 
"http://machine.com/repository/internal/path/to/artifact/maven-metadata.xml";;
+        String checksumUrl = "http://machine.com/repository/internal"; + 
ARTIFACT_DEFAULT_LAYOUT + ".sha1";
+        
+        InputStream is = getClass().getResourceAsStream( "/artifact.jar" );
+        // verify that the file exists in resources-dir
+        assertNotNull( "artifact.jar inputstream", is );
+    
+        // send request #1 and verify it's successful
+        WebRequest request = new PutMethodWebRequest( putUrl, is, 
"application/octet-stream" );
+        WebResponse response = sc.getResponse( request );
+        assertResponseCreated( response );
+        
+        is = getClass().getResourceAsStream( "/artifact.jar.sha1" );
+        request = new PutMethodWebRequest( checksumUrl, is, 
"application/octet-stream" );
+        response = sc.getResponse( request );
+        assertResponseCreated( response );
+        
+        is = getClass().getResourceAsStream( "/maven-metadata.xml" );
+        request = new PutMethodWebRequest( metadataUrl, is, 
"application/octet-stream" );
+        response = sc.getResponse( request );
+        assertResponseCreated( response );
+        
+        // send request #2 and verify it's blocked
+        is = getClass().getResourceAsStream( "/artifact.jar" );
+        request = new PutMethodWebRequest( putUrl, is, 
"application/octet-stream" );
+        response = sc.getResponse( request );
+        assertResponseNoContent( response );        
+    }
+    
     public void testReleaseArtifactsRedeploymentInvalidPath()
         throws Exception
     {

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java?rev=883051&r1=883050&r2=883051&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
 Sun Nov 22 09:28:36 2009
@@ -90,8 +90,8 @@
         repoRootFirst = new File( appserverBase, "data/repositories/" + 
MANAGED_REPO_FIRST );
         repoRootLast = new File( appserverBase, "data/repositories/" + 
MANAGED_REPO_LAST );
         
-        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst ) );
-        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_LAST, "Last Test Repo", repoRootLast ) );
+        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
+        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
         
         List<String> managedRepoIds = new ArrayList<String>();
         managedRepoIds.add( MANAGED_REPO_FIRST );
@@ -101,11 +101,11 @@
         
         // Create the repository group with an invalid managed repository
         repoRootInvalid = new File( appserverBase, "data/repositories/" + 
MANAGED_REPO_INVALID );
-        ManagedRepositoryConfiguration managedRepositoryConfiguration = 
createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", 
repoRootInvalid );
+        ManagedRepositoryConfiguration managedRepositoryConfiguration = 
createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test Repo", 
repoRootInvalid, true );
         
-        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst ) );
+        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_FIRST, "First Test Repo", repoRootFirst, true ) );
         configuration.addManagedRepository( managedRepositoryConfiguration );
-        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_LAST, "Last Test Repo", repoRootLast ) );
+        configuration.addManagedRepository( createManagedRepository( 
MANAGED_REPO_LAST, "Last Test Repo", repoRootLast, true ) );
         
         List<String> invalidManagedRepoIds = new ArrayList<String>();
         invalidManagedRepoIds.add( MANAGED_REPO_FIRST );


Reply via email to