Author: olamy
Date: Mon Aug 29 21:42:14 2011
New Revision: 1163025
URL: http://svn.apache.org/viewvc?rev=1163025&view=rev
Log:
[MRM-1504] repository admin module : implements update ManagedRepository
Added:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/pom.xml?rev=1163025&r1=1163024&r2=1163025&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
(original)
+++ archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/pom.xml
Mon Aug 29 21:42:14 2011
@@ -32,11 +32,19 @@
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-configuration</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-security</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-scheduler-repository</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>audit</artifactId>
+ </dependency>
+ <dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
@@ -80,6 +88,26 @@
<artifactId>spring-quartz</artifactId>
</dependency>
<dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-rbac-role-manager</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-authentication-api</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
@@ -91,6 +119,33 @@
</dependency>
<dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-users-memory</artifactId>
+ <scope>test</scope>
+ <version>${redback.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-keys-memory</artifactId>
+ <scope>test</scope>
+ <version>${redback.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-rbac-cached</artifactId>
+ <version>${redback.version}</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<scope>test</scope>
@@ -118,6 +173,7 @@
<configuration>
<systemPropertyVariables>
<appserver.base>${project.build.outputDirectory}</appserver.base>
+ <plexus.home>${project.build.outputDirectory}</plexus.home>
</systemPropertyVariables>
</configuration>
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java?rev=1163025&r1=1163024&r2=1163025&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
(original)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
Mon Aug 29 21:42:14 2011
@@ -19,6 +19,8 @@ package org.apache.archiva.admin.reposit
*/
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.configur
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 DefaultManagedRepositoryAdm
@Inject
private RepositorySessionFactory repositorySessionFactory;
-
@Inject
private RepositoryStatisticsManager repositoryStatisticsManager;
+ @Inject
+ private List<AuditListener> auditListeners = new
ArrayList<AuditListener>();
+
+ @Inject
+ protected RoleManager roleManager;
+
public List<ManagedRepository> getManagedRepositories()
throws RepositoryAdminException
{
@@ -122,7 +133,7 @@ public class DefaultManagedRepositoryAdm
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 @@ public class DefaultManagedRepositoryAdm
}
- public Boolean deleteManagedRepository( String repositoryId )
+ public Boolean deleteManagedRepository( String repositoryId, User user )
throws RepositoryAdminException
{
Configuration config = archivaConfiguration.getConfiguration();
@@ -314,16 +325,118 @@ public class DefaultManagedRepositoryAdm
}
- 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 class DefaultManagedRepositoryAdm
}
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 );
+ }
+ }
}
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java?rev=1163025&r1=1163024&r2=1163025&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
(original)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/main/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdmin.java
Mon Aug 29 21:42:14 2011
@@ -20,6 +20,7 @@ package org.apache.archiva.admin.reposit
import org.apache.archiva.admin.repository.RepositoryAdminException;
+import org.codehaus.plexus.redback.users.User;
import java.util.List;
@@ -35,14 +36,14 @@ public interface ManagedRepositoryAdmin
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;
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java?rev=1163025&r1=1163024&r2=1163025&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
(original)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/java/org/apache/archiva/admin/repository/managed/ManagedRepositoryAdminTest.java
Mon Aug 29 21:42:14 2011
@@ -19,9 +19,12 @@ package org.apache.archiva.admin.reposit
*/
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 class ManagedRepositoryAdminTest
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<ManagedRepository> 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<ManagedRepository>
repos, String id )
{
@@ -98,4 +134,12 @@ public class ManagedRepositoryAdminTest
return null;
}
+ User getFakeUser()
+ {
+ SimpleUser user = new SimpleUser();
+ user.setUsername( "root" );
+ user.setFullName( "The top user" );
+ return user;
+ }
+
}
Added:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml?rev=1163025&view=auto
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
(added)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-admin/src/test/resources/META-INF/redback/redback-core.xml
Mon Aug 29 21:42:14 2011
@@ -0,0 +1,213 @@
+<redback-role-model>
+ <modelVersion>1.0.0</modelVersion>
+ <applications>
+ <application>
+ <id>System</id>
+ <description>Roles that apply system-wide, across all of the
applications</description>
+ <version>1.0.0</version>
+ <resources>
+ <resource>
+ <id>global</id>
+ <name>*</name>
+ <permanent>true</permanent>
+ <description>global resource implies full access for
authorization</description>
+ </resource>
+ <resource>
+ <id>username</id>
+ <name>${username}</name>
+ <permanent>true</permanent>
+ <description>replaced with the username of the principal at
authorization check time</description>
+ </resource>
+ </resources>
+ <operations>
+ <operation>
+ <id>configuration-edit</id>
+ <name>configuration-edit</name>
+ <description>edit configuration</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-create</id>
+ <name>user-management-user-create</name>
+ <description>create user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-edit</id>
+ <name>user-management-user-edit</name>
+ <description>edit user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-role</id>
+ <name>user-management-user-role</name>
+ <description>user roles</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-delete</id>
+ <name>user-management-user-delete</name>
+ <description>delete user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-list</id>
+ <name>user-management-user-list</name>
+ <description>list users</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-role-grant</id>
+ <name>user-management-role-grant</name>
+ <description>grant role</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-role-drop</id>
+ <name>user-management-role-drop</name>
+ <description>drop role</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-rbac-admin</id>
+ <name>user-management-rbac-admin</name>
+ <description>administer rbac</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>guest-access</id>
+ <name>guest-access</name>
+ <description>access guest</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-manage-data</id>
+ <name>user-management-manage-data</name>
+ <description>manage data</description>
+ <permanent>true</permanent>
+ </operation>
+ </operations>
+ <roles>
+ <role>
+ <id>system-administrator</id>
+ <name>System Administrator</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>edit-redback-configuration</id>
+ <name>Edit Redback Configuration</name>
+ <operation>configuration-edit</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>manage-rbac-setup</id>
+ <name>User RBAC Management</name>
+ <operation>user-management-rbac-admin</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>manage-rbac-data</id>
+ <name>RBAC Manage Data</name>
+ <operation>user-management-manage-data</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ <childRoles>
+ <childRole>user-administrator</childRole>
+ </childRoles>
+ </role>
+ <role>
+ <id>user-administrator</id>
+ <name>User Administrator</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>drop-roles-for-anyone</id>
+ <name>Drop Roles for Anyone</name>
+ <operation>user-management-role-drop</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>grant-roles-for-anyone</id>
+ <name>Grant Roles for Anyone</name>
+ <operation>user-management-role-grant</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-create</id>
+ <name>Create Users</name>
+ <operation>user-management-user-create</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-delete</id>
+ <name>Delete Users</name>
+ <operation>user-management-user-delete</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-edit</id>
+ <name>Edit Users</name>
+ <operation>user-management-user-edit</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>access-users-roles</id>
+ <name>Access Users Roles</name>
+ <operation>user-management-user-role</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>access-user-list</id>
+ <name>Access User List</name>
+ <operation>user-management-user-list</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ <role>
+ <id>registered-user</id>
+ <name>Registered User</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>edit-user-by-username</id>
+ <name>Edit User Data by Username</name>
+ <operation>user-management-user-edit</operation>
+ <resource>username</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ <role>
+ <id>guest</id>
+ <name>Guest</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>guest-permission</id>
+ <name>Guest Permission</name>
+ <operation>guest-access</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ </roles>
+ </application>
+ </applications>
+</redback-role-model>
\ No newline at end of file