diff --git a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
index f0841c946..158deae66 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
+++ b/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
@@ -31,11 +31,19 @@
org.apache.archiva
archiva-configuration
+
+
+ org.apache.archiva
+ archiva-security
org.apache.archiva
archiva-scheduler-repository
+
+ org.apache.archiva
+ audit
+
javax.inject
javax.inject
@@ -79,6 +87,26 @@
org.codehaus.redback.components
spring-quartz
+
+ org.codehaus.redback
+ redback-rbac-role-manager
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.codehaus.redback
+ redback-authentication-api
+
+
+ commons-logging
+ commons-logging
+
+
+
junit
junit
@@ -90,6 +118,33 @@
test
+
+ org.codehaus.redback
+ redback-users-memory
+ test
+ ${redback.version}
+
+
+
+ org.codehaus.redback
+ redback-keys-memory
+ test
+ ${redback.version}
+
+
+
+ org.codehaus.redback
+ redback-rbac-cached
+ ${redback.version}
+ test
+
+
+ commons-logging
+ commons-logging
+
+
+
+
org.apache.derby
derby
@@ -118,6 +173,7 @@
${project.build.outputDirectory}
+ ${project.build.outputDirectory}
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
index c2f3a9db2..26f0bb69f 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
+++ b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
@@ -19,6 +19,8 @@
*/
import org.apache.archiva.admin.repository.RepositoryAdminException;
+import org.apache.archiva.audit.AuditEvent;
+import org.apache.archiva.audit.AuditListener;
import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataRepositoryException;
import org.apache.archiva.metadata.repository.RepositorySession;
@@ -34,6 +36,10 @@
import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
+import org.apache.maven.archiva.security.ArchivaRoleConstants;
+import org.codehaus.plexus.redback.role.RoleManager;
+import org.codehaus.plexus.redback.role.RoleManagerException;
+import org.codehaus.plexus.redback.users.User;
import org.codehaus.plexus.registry.Registry;
import org.codehaus.plexus.registry.RegistryException;
import org.codehaus.plexus.taskqueue.TaskQueueException;
@@ -82,10 +88,15 @@ public class DefaultManagedRepositoryAdmin
@Inject
private RepositorySessionFactory repositorySessionFactory;
-
@Inject
private RepositoryStatisticsManager repositoryStatisticsManager;
+ @Inject
+ private List auditListeners = new ArrayList();
+
+ @Inject
+ protected RoleManager roleManager;
+
public List getManagedRepositories()
throws RepositoryAdminException
{
@@ -122,7 +133,7 @@ public ManagedRepository getManagedRepository( String repositoryId )
return null;
}
- public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
+ public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException
{
return
@@ -241,7 +252,7 @@ else if ( config.getRepositoryGroupsAsMap().containsKey( repoId ) )
}
- public Boolean deleteManagedRepository( String repositoryId )
+ public Boolean deleteManagedRepository( String repositoryId, User user )
throws RepositoryAdminException
{
Configuration config = archivaConfiguration.getConfiguration();
@@ -314,16 +325,118 @@ public Boolean deleteManagedRepository( String repositoryId )
}
- public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
+ public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException
{
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ // Ensure that the fields are valid.
+ Configuration configuration = archivaConfiguration.getConfiguration();
+
+ ManagedRepositoryConfiguration toremove = configuration.findManagedRepositoryById( managedRepository.getId() );
+
+ if ( toremove != null )
+ {
+ configuration.removeManagedRepository( toremove );
+ }
+ // FIXME the case of the attached staging repository
+ /*
+ if ( stagingRepository != null )
+ {
+ removeRepository( stagingRepository.getId(), configuration );
+ }*/
+
+ // Save the repository configuration.
+ String result;
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ ManagedRepositoryConfiguration managedRepositoryConfiguration =
+ addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),
+ managedRepository.getLocation(), managedRepository.isBlockRedeployments(),
+ managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,
+ managedRepository.getCronExpression() );
+
+ // FIXME only location has changed from previous
+ boolean resetStats = true;
+
+ try
+ {
+ triggerAuditEvent( managedRepository.getId(), null, AuditEvent.MODIFY_MANAGED_REPO, user );
+ addRepositoryRoles( managedRepositoryConfiguration );
+
+ // FIXME this staging part !!
+
+ //update changes of the staging repo
+ /*if ( stageNeeded )
+ {
+
+ stagingRepository = getStageRepoConfig( configuration );
+ addRepository( stagingRepository, configuration );
+ addRepositoryRoles( stagingRepository );
+
+ }*/
+ //delete staging repo when we dont need it
+ /*
+ if ( !stageNeeded )
+ {
+ stagingRepository = getStageRepoConfig( configuration );
+ removeRepository( stagingRepository.getId(), configuration );
+ removeContents( stagingRepository );
+ removeRepositoryRoles( stagingRepository );
+ }*/
+
+ saveConfiguration( this.archivaConfiguration.getConfiguration() );
+ if ( resetStats )
+ {
+ repositoryStatisticsManager.deleteStatistics( repositorySession.getRepository(),
+ managedRepository.getId() );
+ repositorySession.save();
+ }
+
+ //MRM-1342 Repository statistics report doesn't appear to be working correctly
+ //scan repository when modification of repository is successful
+ // olamy : IMHO we are fine to ignore issue with scheduling scanning
+ // as here the repo has been updated
+ scanRepository( managedRepository.getId(), true );
+ // FIXME staging !!
+ /*
+ if ( stageNeeded )
+ {
+ executeRepositoryScanner( stagingRepository.getId() );
+ }*/
+
+ }
+ catch ( RoleManagerException e )
+ {
+ throw new RepositoryAdminException( e.getMessage(), e );
+ }
+ catch ( MetadataRepositoryException e )
+ {
+ throw new RepositoryAdminException( e.getMessage(), e );
+ }
+ finally
+ {
+ repositorySession.close();
+ }
+
+ return true;
}
//--------------------------
// utils methods
//--------------------------
+ protected void triggerAuditEvent( String repositoryId, String resource, String action, User user )
+ {
+ log.warn( "no user found in triggerAuditEvent" );
+ AuditEvent event = new AuditEvent( repositoryId, user == null ? "null" : user.getUsername(), resource, action );
+ // FIXME use a thread local through cxf interceptors to store this
+ //event.setRemoteIP( getRemoteAddr() );
+
+ for ( AuditListener listener : auditListeners )
+ {
+ listener.auditEvent( event );
+ }
+
+ }
+
private String removeExpressions( String directory )
{
String value = StringUtils.replace( directory, "${appserver.base}",
@@ -410,4 +523,23 @@ public Boolean scanRepository( String repositoryId, boolean fullScan )
}
return true;
}
+
+ protected void addRepositoryRoles( ManagedRepositoryConfiguration newRepository )
+ throws RoleManagerException
+ {
+ String repoId = newRepository.getId();
+
+ // TODO: double check these are configured on start up
+ // TODO: belongs in the business logic
+
+ if ( !roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )
+ {
+ roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );
+ }
+
+ if ( !roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )
+ {
+ roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );
+ }
+ }
}
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
index b425574f4..3c97583ef 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
+++ b/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
@@ -20,6 +20,7 @@
import org.apache.archiva.admin.repository.RepositoryAdminException;
+import org.codehaus.plexus.redback.users.User;
import java.util.List;
@@ -35,14 +36,14 @@ List getManagedRepositories()
ManagedRepository getManagedRepository( String repositoryId )
throws RepositoryAdminException;
- Boolean deleteManagedRepository( String repositoryId )
+ Boolean deleteManagedRepository( String repositoryId, User user )
throws RepositoryAdminException;
- Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
+ Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException;
- Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo )
+ Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo, User user )
throws RepositoryAdminException;
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java b/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
index 393696ace..bab5e5e83 100644
--- a/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
@@ -19,9 +19,12 @@
*/
import org.apache.commons.lang.StringUtils;
+import org.codehaus.plexus.redback.users.User;
+import org.codehaus.plexus.redback.users.memory.SimpleUser;
import org.junit.Test;
import javax.inject.Inject;
+import java.io.File;
import java.util.List;
/**
@@ -71,20 +74,53 @@ public void addDeleteManagedRepo()
repo.setId( "test-new-one" );
repo.setName( "test repo" );
repo.setLocation( APPSERVER_BASE_PATH + repo.getId() );
- managedRepositoryAdmin.addManagedRepository( repo, false );
+ managedRepositoryAdmin.addManagedRepository( repo, false, getFakeUser() );
repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
assertEquals( initialSize + 1, repos.size() );
assertNotNull( managedRepositoryAdmin.getManagedRepository( "test-new-one" ) );
- managedRepositoryAdmin.deleteManagedRepository( "test-new-one" );
+ managedRepositoryAdmin.deleteManagedRepository( "test-new-one", getFakeUser() );
repos = managedRepositoryAdmin.getManagedRepositories();
assertNotNull( repos );
assertEquals( initialSize, repos.size() );
}
+ @Test
+ public void updateDeleteManagedRepo()
+ throws Exception
+ {
+ List repos = managedRepositoryAdmin.getManagedRepositories();
+ assertNotNull( repos );
+ int initialSize = repos.size();
+ assertTrue( initialSize > 0 );
+
+ ManagedRepository repo = new ManagedRepository();
+ repo.setId( "test-new-one" );
+ repo.setName( "test repo" );
+ repo.setLocation( APPSERVER_BASE_PATH + repo.getId() );
+ managedRepositoryAdmin.addManagedRepository( repo, false, getFakeUser() );
+ repos = managedRepositoryAdmin.getManagedRepositories();
+ assertNotNull( repos );
+ assertEquals( initialSize + 1, repos.size() );
+
+ String newName = "test repo update";
+
+ repo.setName( newName );
+
+ repo.setLocation( APPSERVER_BASE_PATH + "new-path" );
+
+ managedRepositoryAdmin.updateManagedRepository( repo, false, getFakeUser() );
+
+ repo = managedRepositoryAdmin.getManagedRepository( "test-new-one" );
+ assertNotNull( repo );
+ assertEquals( newName, repo.getName() );
+ assertEquals( APPSERVER_BASE_PATH + "new-path", repo.getLocation() );
+ assertTrue( new File( APPSERVER_BASE_PATH + "new-path" ).exists() );
+ }
+
private ManagedRepository findManagedRepoById( List repos, String id )
{
@@ -98,4 +134,12 @@ private ManagedRepository findManagedRepoById( List repos, St
return null;
}
+ User getFakeUser()
+ {
+ SimpleUser user = new SimpleUser();
+ user.setUsername( "root" );
+ user.setFullName( "The top user" );
+ return user;
+ }
+
}
diff --git a/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml b/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
new file mode 100644
index 000000000..ecc1de8fb
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
@@ -0,0 +1,213 @@
+
+ 1.0.0
+
+
+ System
+ Roles that apply system-wide, across all of the applications
+ 1.0.0
+
+
+ global
+ *
+ true
+ global resource implies full access for authorization
+
+
+ username
+ ${username}
+ true
+ replaced with the username of the principal at authorization check time
+
+
+
+
+ configuration-edit
+ configuration-edit
+ edit configuration
+ true
+
+
+ user-management-user-create
+ user-management-user-create
+ create user
+ true
+
+
+ user-management-user-edit
+ user-management-user-edit
+ edit user
+ true
+
+
+ user-management-user-role
+ user-management-user-role
+ user roles
+ true
+
+
+ user-management-user-delete
+ user-management-user-delete
+ delete user
+ true
+
+
+ user-management-user-list
+ user-management-user-list
+ list users
+ true
+
+
+ user-management-role-grant
+ user-management-role-grant
+ grant role
+ true
+
+
+ user-management-role-drop
+ user-management-role-drop
+ drop role
+ true
+
+
+ user-management-rbac-admin
+ user-management-rbac-admin
+ administer rbac
+ true
+
+
+ guest-access
+ guest-access
+ access guest
+ true
+
+
+ user-management-manage-data
+ user-management-manage-data
+ manage data
+ true
+
+
+
+
+ system-administrator
+ System Administrator
+ true
+ true
+
+
+ edit-redback-configuration
+ Edit Redback Configuration
+ configuration-edit
+ global
+ true
+
+
+ manage-rbac-setup
+ User RBAC Management
+ user-management-rbac-admin
+ global
+ true
+
+
+ manage-rbac-data
+ RBAC Manage Data
+ user-management-manage-data
+ global
+ true
+
+
+
+ user-administrator
+
+
+
+ user-administrator
+ User Administrator
+ true
+ true
+
+
+ drop-roles-for-anyone
+ Drop Roles for Anyone
+ user-management-role-drop
+ global
+ true
+
+
+ grant-roles-for-anyone
+ Grant Roles for Anyone
+ user-management-role-grant
+ global
+ true
+
+
+ user-create
+ Create Users
+ user-management-user-create
+ global
+ true
+
+
+ user-delete
+ Delete Users
+ user-management-user-delete
+ global
+ true
+
+
+ user-edit
+ Edit Users
+ user-management-user-edit
+ global
+ true
+
+
+ access-users-roles
+ Access Users Roles
+ user-management-user-role
+ global
+ true
+
+
+ access-user-list
+ Access User List
+ user-management-user-list
+ global
+ true
+
+
+
+
+ registered-user
+ Registered User
+ true
+ true
+
+
+ edit-user-by-username
+ Edit User Data by Username
+ user-management-user-edit
+ username
+ true
+
+
+
+
+ guest
+ Guest
+ true
+ true
+
+
+ guest-permission
+ Guest Permission
+ guest-access
+ global
+ true
+
+
+
+
+
+
+
\ No newline at end of file