Author: olamy
Date: Tue Jan 15 13:22:03 2013
New Revision: 1433396

URL: http://svn.apache.org/viewvc?rev=1433396&view=rev
Log:
fix some unit test for Ldap rbacmanager impl

Modified:
    archiva/redback/redback-core/trunk/pom.xml
    
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
    
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
    
archiva/redback/redback-core/trunk/redback-configuration/src/main/java/org/apache/archiva/redback/configuration/UserConfigurationKeys.java
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/RBACManager.java
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-cached/src/main/java/org/apache/archiva/redback/rbac/cached/CachedRbacManager.java
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/pom.xml
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManagerTest.java
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/security.properties
    archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/pom.xml
    
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/src/main/java/org/apache/archiva/redback/tests/AbstractRbacManagerTestCase.java
    
archiva/redback/redback-core/trunk/redback-users/redback-users-api/src/main/java/org/apache/archiva/redback/users/UserManager.java
    
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/LdapUserManager.java
    
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/DefaultLdapController.java
    
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/LdapController.java

Modified: archiva/redback/redback-core/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/pom.xml?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- archiva/redback/redback-core/trunk/pom.xml (original)
+++ archiva/redback/redback-core/trunk/pom.xml Tue Jan 15 13:22:03 2013
@@ -654,7 +654,6 @@
         <groupId>org.easytesting</groupId>
         <artifactId>fest-assert</artifactId>
         <version>1.4</version>
-        <scope>test</scope>
       </dependency>
     </dependencies>
   </dependencyManagement>

Modified: 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/DefaultLdapRoleMapper.java
 Tue Jan 15 13:22:03 2013
@@ -40,9 +40,11 @@ import javax.naming.directory.Attributes
 import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
+import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -165,6 +167,33 @@ public class DefaultLdapRoleMapper
         }
     }
 
+    public List<String> getAllRoles()
+        throws MappingException
+    {
+        // TODO read from ldap ?
+        List<String> groups = getAllGroups();
+
+        if ( groups.isEmpty() )
+        {
+            return Collections.emptyList();
+        }
+
+        List<String> roles = new ArrayList<String>( groups.size() );
+
+        Map<String, String> mapping = getLdapGroupMappings();
+
+        for ( String group : groups )
+        {
+            String role = mapping.get( group );
+            if ( role != null )
+            {
+                roles.add( role );
+            }
+        }
+
+        return roles;
+    }
+
     public List<String> getGroupsMember( String group )
         throws MappingException
     {
@@ -405,7 +434,7 @@ public class DefaultLdapRoleMapper
         String groupName = HashBiMap.create( getLdapGroupMappings() 
).inverse().get( roleName );
         if ( groupName == null )
         {
-            log.warn( "skip group creation as no mapping fro roleName:'{}", 
roleName );
+            log.warn( "skip group creation as no mapping fro roleName:'{}'", 
roleName );
             return false;
         }
 
@@ -426,9 +455,7 @@ public class DefaultLdapRoleMapper
         // attribute mandatory when created a group so add admin as default 
member
         // TODO make this default configurable
         BasicAttribute basicAttribute = new BasicAttribute( "uniquemember" );
-        //
         basicAttribute.add( "uid=admin," + getBaseDn() );
-
         attributes.put( basicAttribute );
 
         LdapConnection ldapConnection = null;
@@ -443,7 +470,7 @@ public class DefaultLdapRoleMapper
 
             context.createSubcontext( dn, attributes );
 
-            log.debug( "created group with dn:'{}", dn );
+            log.info( "created group with dn:'{}", dn );
 
             return true;
         }
@@ -465,6 +492,89 @@ public class DefaultLdapRoleMapper
         }
     }
 
+    public boolean saveUserRole( String roleName, String username )
+        throws MappingException
+    {
+
+        String groupName = HashBiMap.create( getLdapGroupMappings() 
).inverse().get( roleName );
+
+        if ( groupName == null )
+        {
+            log.warn( "no group found for role '{}", roleName );
+            return false;
+        }
+
+        LdapConnection ldapConnection = null;
+
+        NamingEnumeration<SearchResult> namingEnumeration = null;
+        try
+        {
+            ldapConnection = ldapConnectionFactory.getConnection();
+
+            DirContext context = ldapConnection.getDirContext();
+
+            SearchControls searchControls = new SearchControls();
+
+            searchControls.setDerefLinkFlag( true );
+            searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+
+            String filter = "objectClass=" + getLdapGroupClass();
+
+            namingEnumeration = context.search( "cn=" + groupName + "," + 
getGroupsDn(), filter, searchControls );
+
+            while ( namingEnumeration.hasMore() )
+            {
+                SearchResult searchResult = namingEnumeration.next();
+                Attribute attribute = searchResult.getAttributes().get( 
"uniquemember" );
+                if ( attribute == null )
+                {
+                    BasicAttribute basicAttribute = new BasicAttribute( 
"uniquemember" );
+                    basicAttribute.add( "uid=" + username + "," + 
getGroupsDn() );
+                    context.modifyAttributes( "cn=" + groupName + "," + 
getGroupsDn(), new ModificationItem[]{
+                        new ModificationItem( DirContext.ADD_ATTRIBUTE, 
basicAttribute ) } );
+                }
+                else
+                {
+                    attribute.add( "uid=" + username + "," + getGroupsDn() );
+                    context.modifyAttributes( "cn=" + groupName + "," + 
getGroupsDn(), new ModificationItem[]{
+                        new ModificationItem( DirContext.REPLACE_ATTRIBUTE, 
attribute ) } );
+                }
+                return true;
+            }
+
+            return false;
+        }
+        catch ( LdapException e )
+        {
+            throw new MappingException( e.getMessage(), e );
+        }
+        catch ( NamingException e )
+        {
+            throw new MappingException( e.getMessage(), e );
+        }
+
+        finally
+        {
+            if ( ldapConnection != null )
+            {
+                ldapConnection.close();
+            }
+            if ( namingEnumeration != null )
+            {
+                try
+                {
+                    namingEnumeration.close();
+                }
+                catch ( NamingException e )
+                {
+                    log.warn( "failed to close search results", e );
+                }
+            }
+        }
+
+
+    }
+
     public void removeAllRoles()
         throws MappingException
     {
@@ -524,7 +634,7 @@ public class DefaultLdapRoleMapper
 
             context.unbind( dn );
 
-            log.debug( "deleted group with dn:'{}", dn );
+            log.info( "deleted group with dn:'{}", dn );
 
         }
         catch ( LdapException e )

Modified: 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-common/redback-common-ldap/src/main/java/org/apache/archiva/redback/common/ldap/role/LdapRoleMapper.java
 Tue Jan 15 13:22:03 2013
@@ -43,11 +43,22 @@ public interface LdapRoleMapper
 
 
     /**
+     * read all groups from ldap
+     *
      * @return all LDAP groups
      */
     List<String> getAllGroups()
         throws MappingException;
 
+    /**
+     * read all ldap groups then map to corresponding role (if no mapping 
found group is ignored)
+     *
+     * @return all roles
+     * @throws Exception
+     */
+    List<String> getAllRoles()
+        throws MappingException;
+
 
     /**
      * @return the base dn which contains all ldap groups
@@ -110,6 +121,17 @@ public interface LdapRoleMapper
     boolean saveRole( String roleName )
         throws MappingException;
 
+    /**
+     * associate role to user in ldap
+     *
+     * @param roleName
+     * @param username
+     * @return <code>true</code> if role was added to user, <code>false</code> 
if role already exists for the user
+     * @throws MappingException
+     */
+    boolean saveUserRole( String roleName, String username )
+        throws MappingException;
+
     void removeAllRoles()
         throws MappingException;
 

Modified: 
archiva/redback/redback-core/trunk/redback-configuration/src/main/java/org/apache/archiva/redback/configuration/UserConfigurationKeys.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-configuration/src/main/java/org/apache/archiva/redback/configuration/UserConfigurationKeys.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-configuration/src/main/java/org/apache/archiva/redback/configuration/UserConfigurationKeys.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-configuration/src/main/java/org/apache/archiva/redback/configuration/UserConfigurationKeys.java
 Tue Jan 15 13:22:03 2013
@@ -82,6 +82,8 @@ public interface UserConfigurationKeys
 
     String LDAP_GROUPS_ROLE_START_KEY = "ldap.config.groups.role.";
 
+    String LDAP_WRITABLE = "ldap.config.writable";
+
     String APPLICATION_URL = "application.url";
 
     String EMAIL_URL_PATH = "email.url.path";

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/RBACManager.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/RBACManager.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/RBACManager.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/RBACManager.java
 Tue Jan 15 13:22:03 2013
@@ -29,7 +29,6 @@ import java.util.Set;
  *
  * @author Jesse McConnell <[email protected]>
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
- *
  * @todo expand on javadoc
  */
 public interface RBACManager
@@ -60,9 +59,11 @@ public interface RBACManager
      * @return true if role exists in store.
      * @throws RbacManagerException
      */
-    boolean roleExists( String name );
+    boolean roleExists( String name )
+        throws RbacManagerException;
 
-    boolean roleExists( Role role );
+    boolean roleExists( Role role )
+        throws RbacManagerException;
 
     Role saveRole( Role role )
         throws RbacObjectInvalidException, RbacManagerException;

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-cached/src/main/java/org/apache/archiva/redback/rbac/cached/CachedRbacManager.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-cached/src/main/java/org/apache/archiva/redback/rbac/cached/CachedRbacManager.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-cached/src/main/java/org/apache/archiva/redback/rbac/cached/CachedRbacManager.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-cached/src/main/java/org/apache/archiva/redback/rbac/cached/CachedRbacManager.java
 Tue Jan 15 13:22:03 2013
@@ -46,7 +46,7 @@ import java.util.Set;
  *
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
  */
-@Service("rbacManager#cached")
+@Service( "rbacManager#cached" )
 public class CachedRbacManager
     implements RBACManager, RBACManagerListener
 {
@@ -54,35 +54,35 @@ public class CachedRbacManager
     private Logger log = LoggerFactory.getLogger( getClass() );
 
     @Inject
-    @Named(value = "rbacManager#jdo")
+    @Named( value = "rbacManager#jdo" )
     private RBACManager rbacImpl;
 
     @Inject
-    @Named(value = "cache#operations")
+    @Named( value = "cache#operations" )
     private Cache<String, Operation> operationsCache;
 
     @Inject
-    @Named(value = "cache#permissions")
+    @Named( value = "cache#permissions" )
     private Cache<String, Permission> permissionsCache;
 
     @Inject
-    @Named(value = "cache#resources")
+    @Named( value = "cache#resources" )
     private Cache<String, Resource> resourcesCache;
 
     @Inject
-    @Named(value = "cache#roles")
+    @Named( value = "cache#roles" )
     private Cache<String, Role> rolesCache;
 
     @Inject
-    @Named(value = "cache#userAssignments")
+    @Named( value = "cache#userAssignments" )
     private Cache<String, UserAssignment> userAssignmentsCache;
 
     @Inject
-    @Named(value = "cache#userPermissions")
+    @Named( value = "cache#userPermissions" )
     private Cache<String, Map<String, List<Permission>>> userPermissionsCache;
 
     @Inject
-    @Named(value = "cache#effectiveRoleSet")
+    @Named( value = "cache#effectiveRoleSet" )
     private Cache<String, Set<Role>> effectiveRoleSetCache;
 
     public void addChildRole( Role role, Role childRole )
@@ -206,7 +206,7 @@ public class CachedRbacManager
     /**
      * @see 
org.apache.archiva.redback.rbac.RBACManager#getAssignedPermissionMap(java.lang.String)
      */
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public Map<String, List<Permission>> getAssignedPermissionMap( String 
principal )
         throws RbacObjectNotFoundException, RbacManagerException
     {
@@ -274,7 +274,7 @@ public class CachedRbacManager
         return this.rbacImpl.getEffectivelyUnassignedRoles( principal );
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public Set<Role> getEffectiveRoles( Role role )
         throws RbacObjectNotFoundException, RbacManagerException
     {
@@ -624,6 +624,7 @@ public class CachedRbacManager
     }
 
     public boolean roleExists( Role role )
+        throws RbacManagerException
     {
         if ( rolesCache.hasKey( role.getName() ) )
         {
@@ -634,6 +635,7 @@ public class CachedRbacManager
     }
 
     public boolean roleExists( String name )
+        throws RbacManagerException
     {
         if ( rolesCache.hasKey( name ) )
         {

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/pom.xml
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/pom.xml?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/pom.xml
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/pom.xml
 Tue Jan 15 13:22:03 2013
@@ -70,6 +70,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva.redback</groupId>
+      <artifactId>redback-users-ldap</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva.redback</groupId>
       <artifactId>redback-rbac-jdo</artifactId>      
     </dependency>
     <dependency>

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
 Tue Jan 15 13:22:03 2013
@@ -20,8 +20,14 @@ package org.apache.archiva.redback.rbac.
  */
 
 import org.apache.archiva.redback.common.ldap.MappingException;
+import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
+import org.apache.archiva.redback.common.ldap.connection.LdapConnectionFactory;
+import org.apache.archiva.redback.common.ldap.connection.LdapException;
 import org.apache.archiva.redback.common.ldap.role.LdapRoleMapper;
 import org.apache.archiva.redback.components.cache.Cache;
+import org.apache.archiva.redback.configuration.UserConfiguration;
+import org.apache.archiva.redback.configuration.UserConfigurationKeys;
+import org.apache.archiva.redback.rbac.AbstractRole;
 import org.apache.archiva.redback.rbac.Operation;
 import org.apache.archiva.redback.rbac.Permission;
 import org.apache.archiva.redback.rbac.RBACManager;
@@ -32,10 +38,17 @@ import org.apache.archiva.redback.rbac.R
 import org.apache.archiva.redback.rbac.Resource;
 import org.apache.archiva.redback.rbac.Role;
 import org.apache.archiva.redback.rbac.UserAssignment;
+import org.apache.archiva.redback.users.User;
+import org.apache.archiva.redback.users.UserManager;
+import org.apache.archiva.redback.users.UserManagerException;
+import org.apache.archiva.redback.users.ldap.ctl.LdapController;
+import org.apache.archiva.redback.users.ldap.ctl.LdapControllerException;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 import java.util.ArrayList;
@@ -66,11 +79,28 @@ public class LdapRbacManager
     @Named( value = "ldapRoleMapper#default" )
     private LdapRoleMapper ldapRoleMapper;
 
-    /**
-     * limited to role / group write
-     */
+    @Inject
+    @Named( value = "userConfiguration#default" )
+    private UserConfiguration userConf;
+
+    @Inject
+    @Named( value = "userManager#ldap" )
+    private UserManager userManager;
+
+    @Inject
+    private LdapConnectionFactory ldapConnectionFactory;
+
+    @Inject
+    private LdapController ldapController;
+
     private boolean writableLdap = false;
 
+    @PostConstruct
+    public void initialize()
+    {
+        this.writableLdap = userConf.getBoolean( 
UserConfigurationKeys.LDAP_WRITABLE, this.writableLdap );
+    }
+
 
     public void addChildRole( Role role, Role childRole )
         throws RbacObjectInvalidException, RbacManagerException
@@ -141,8 +171,23 @@ public class LdapRbacManager
     public List<Role> getAllAssignableRoles()
         throws RbacManagerException, RbacObjectNotFoundException
     {
-        // TODO FROM ldap or from real impl ?
-        return this.rbacImpl.getAllAssignableRoles();
+        try
+        {
+            Collection<String> roleNames = 
ldapRoleMapper.getLdapGroupMappings().values();
+
+            List<Role> roles = new ArrayList<Role>();
+
+            for ( String name : roleNames )
+            {
+                roles.add( new RoleImpl( name ) );
+            }
+
+            return roles;
+        }
+        catch ( MappingException e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
     }
 
     public List<Operation> getAllOperations()
@@ -166,7 +211,6 @@ public class LdapRbacManager
     public List<Role> getAllRoles()
         throws RbacManagerException
     {
-        // TODO FROM ldap or from real impl ?
         try
         {
             List<String> groups = ldapRoleMapper.getAllGroups();
@@ -183,7 +227,38 @@ public class LdapRbacManager
         throws RbacManagerException
     {
         // TODO FROM ldap or from real impl ?
-        return this.rbacImpl.getAllUserAssignments();
+        //return this.rbacImpl.getAllUserAssignments();
+        LdapConnection ldapConnection = null;
+        try
+        {
+            ldapConnection = ldapConnectionFactory.getConnection();
+            Map<String, Collection<String>> usersWithRoles =
+                ldapController.findUsersWithRoles( 
ldapConnection.getDirContext() );
+            List<UserAssignment> userAssignments = new 
ArrayList<UserAssignment>( usersWithRoles.size() );
+
+            for ( Map.Entry<String, Collection<String>> entry : 
usersWithRoles.entrySet() )
+            {
+                UserAssignment userAssignment = new UserAssignmentImpl( 
entry.getKey(), entry.getValue() );
+                userAssignments.add( userAssignment );
+            }
+
+            return userAssignments;
+        }
+        catch ( LdapControllerException e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
+        catch ( LdapException e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
+        finally
+        {
+            if ( ldapConnection != null )
+            {
+                ldapConnection.close();
+            }
+        }
     }
 
     public Map<String, List<Permission>> getAssignedPermissionMap( String 
username )
@@ -241,15 +316,9 @@ public class LdapRbacManager
 
             List<Role> roles = new ArrayList<Role>( roleNames.size() );
 
-            // TODO normally new Role with name must be enough
-
             for ( String name : roleNames )
             {
-                Role role = rbacImpl.getRole( name );
-                if ( role != null )
-                {
-                    roles.add( role );
-                }
+                roles.add( new RoleImpl( name ) );
             }
 
             return roles;
@@ -263,8 +332,8 @@ public class LdapRbacManager
     public Collection<Role> getAssignedRoles( UserAssignment userAssignment )
         throws RbacObjectNotFoundException, RbacManagerException
     {
-        // TODO here !!
-        return this.rbacImpl.getAssignedRoles( userAssignment );
+        return getAssignedRoles( userAssignment.getPrincipal() );
+        //return this.rbacImpl.getAssignedRoles( userAssignment );
     }
 
     public Map<String, Role> getChildRoles( Role role )
@@ -516,13 +585,30 @@ public class LdapRbacManager
     }
 
     public boolean roleExists( Role role )
+        throws RbacManagerException
     {
-        return this.rbacImpl.roleExists( role );
+        if ( role == null )
+        {
+            return false;
+        }
+        return roleExists( role.getName() );
     }
 
     public boolean roleExists( String name )
+        throws RbacManagerException
     {
-        return this.rbacImpl.roleExists( name );
+        if ( StringUtils.isEmpty( name ) )
+        {
+            return false;
+        }
+        try
+        {
+            return ldapRoleMapper.getAllRoles().contains( name );
+        }
+        catch ( Exception e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
     }
 
     public Operation saveOperation( Operation operation )
@@ -583,7 +669,44 @@ public class LdapRbacManager
     public UserAssignment saveUserAssignment( UserAssignment userAssignment )
         throws RbacObjectInvalidException, RbacManagerException
     {
-        return this.rbacImpl.saveUserAssignment( userAssignment );
+        try
+        {
+            if ( !userManager.userExists( userAssignment.getPrincipal() ) )
+            {
+                User user = userManager.createUser( 
userAssignment.getPrincipal(), null, null );
+                user = userManager.addUser( user );
+            }
+
+            List<String> allRoles = ldapRoleMapper.getAllRoles();
+
+            List<String> currentUserRoles = ldapRoleMapper.getRoles( 
userAssignment.getPrincipal() );
+
+            for ( String role : userAssignment.getRoleNames() )
+            {
+                if ( !currentUserRoles.contains( role ) && writableLdap )
+                {
+                    // role exists in ldap ?
+                    if ( !allRoles.contains( role ) )
+                    {
+                        ldapRoleMapper.saveRole( role );
+                    }
+                    ldapRoleMapper.saveUserRole( role, 
userAssignment.getPrincipal() );
+                }
+
+            }
+
+            return userAssignment;
+        }
+        catch ( UserManagerException e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
+        catch ( MappingException e )
+        {
+            throw new RbacManagerException( e.getMessage(), e );
+        }
+
+        //return this.rbacImpl.saveUserAssignment( userAssignment );
     }
 
     public boolean userAssignmentExists( String principal )
@@ -627,4 +750,180 @@ public class LdapRbacManager
     {
         this.ldapRoleMapper = ldapRoleMapper;
     }
+
+    private static class RoleImpl
+        extends AbstractRole
+    {
+        private String name;
+
+        private RoleImpl( String name )
+        {
+            this.name = name;
+        }
+
+        public void addPermission( Permission permission )
+        {
+            // no op
+        }
+
+        public void addChildRoleName( String name )
+        {
+            // no op
+        }
+
+        public List<String> getChildRoleNames()
+        {
+            return Collections.emptyList();
+        }
+
+        public String getDescription()
+        {
+            return null;
+        }
+
+        public String getName()
+        {
+            return this.name;
+        }
+
+        public List<Permission> getPermissions()
+        {
+            return Collections.emptyList();
+        }
+
+        public boolean isAssignable()
+        {
+            return true;
+        }
+
+        public void removePermission( Permission permission )
+        {
+            // no op
+        }
+
+        public void setAssignable( boolean assignable )
+        {
+            // no op
+        }
+
+        public void setChildRoleNames( List<String> names )
+        {
+            // no op
+        }
+
+        public void setDescription( String description )
+        {
+            // no op
+        }
+
+        public void setName( String name )
+        {
+            this.name = name;
+        }
+
+        public void setPermissions( List<Permission> permissions )
+        {
+            // no op
+        }
+
+        public boolean isPermanent()
+        {
+            return true;
+        }
+
+        public void setPermanent( boolean permanent )
+        {
+            // no op
+        }
+    }
+
+    private static class UserAssignmentImpl
+        implements UserAssignment
+    {
+        private String username;
+
+        private List<String> roleNames;
+
+        private boolean permanent;
+
+        private UserAssignmentImpl( String username, Collection<String> 
roleNames )
+        {
+            this.username = username;
+
+            if ( roleNames == null )
+            {
+                this.roleNames = new ArrayList<String>();
+            }
+            else
+            {
+                this.roleNames = new ArrayList<String>( roleNames );
+            }
+        }
+
+        public String getPrincipal()
+        {
+            return this.username;
+        }
+
+        public List<String> getRoleNames()
+        {
+            return this.roleNames;
+        }
+
+        public void addRoleName( Role role )
+        {
+            if ( role == null )
+            {
+                return;
+            }
+            this.roleNames.add( role.getName() );
+        }
+
+        public void addRoleName( String roleName )
+        {
+            if ( roleName == null )
+            {
+                return;
+            }
+            this.roleNames.add( roleName );
+        }
+
+        public void removeRoleName( Role role )
+        {
+            if ( role == null )
+            {
+                return;
+            }
+            this.roleNames.remove( role.getName() );
+        }
+
+        public void removeRoleName( String roleName )
+        {
+            if ( roleName == null )
+            {
+                return;
+            }
+            this.roleNames.remove( roleName );
+        }
+
+        public void setPrincipal( String principal )
+        {
+            this.username = principal;
+        }
+
+        public void setRoleNames( List<String> roles )
+        {
+            this.roleNames = roles;
+        }
+
+        public boolean isPermanent()
+        {
+            return this.permanent;
+        }
+
+        public void setPermanent( boolean permanent )
+        {
+            this.permanent = permanent;
+        }
+    }
 }

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManagerTest.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManagerTest.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManagerTest.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManagerTest.java
 Tue Jan 15 13:22:03 2013
@@ -52,7 +52,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-//@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )
+@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )
 public class LdapRbacManagerTest
     extends AbstractRbacManagerTestCase
 {
@@ -286,4 +286,15 @@ public class LdapRbacManagerTest
     {
         assertTrue( ( ( eventTracker.initCount > 0 ) && ( 
eventTracker.initCount <= 2 ) ) );
     }
+
+    /**
+     * it's mandatory to have at least 1 user when creating a group so unit 
test result need to be changed.
+     *
+     * @param size
+     * @return
+     */
+    protected int incAssignements( int size )
+    {
+        return size + 1;
+    }
 }

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/security.properties
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/security.properties?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/security.properties
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/test/security.properties
 Tue Jan 15 13:22:03 2013
@@ -16,4 +16,14 @@
 # under the License.
 ldap.config.groups.role.theADMIN=ADMIN
 ldap.config.groups.role.thePROJECT_ADMIN=PROJECT_ADMIN
-ldap.config.groups.role.theDEVELOPER=DEVELOPER
\ No newline at end of file
+ldap.config.groups.role.theDEVELOPER=DEVELOPER
+ldap.config.groups.role.user-admin=User Administrator
+ldap.config.groups.role.sys-admin=System Administrator
+ldap.config.groups.role.trusted-dev=Trusted Developer
+ldap.config.groups.role.developer=Developer
+
+
+ldap.config.base.dn=dc=archiva,dc=apache,dc=org
+ldap.config.writable=true
+ldap.bind.authenticator.allowEmptyPasswords=true
+ldap.config.groups.base.dn=dc=archiva,dc=apache,dc=org
\ No newline at end of file

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/pom.xml
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/pom.xml?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/pom.xml 
(original)
+++ archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/pom.xml 
Tue Jan 15 13:22:03 2013
@@ -47,5 +47,9 @@
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.easytesting</groupId>
+      <artifactId>fest-assert</artifactId>
+    </dependency>
   </dependencies>
 </project>

Modified: 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/src/main/java/org/apache/archiva/redback/tests/AbstractRbacManagerTestCase.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/src/main/java/org/apache/archiva/redback/tests/AbstractRbacManagerTestCase.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/src/main/java/org/apache/archiva/redback/tests/AbstractRbacManagerTestCase.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-rbac/redback-rbac-tests/src/main/java/org/apache/archiva/redback/tests/AbstractRbacManagerTestCase.java
 Tue Jan 15 13:22:03 2013
@@ -16,6 +16,7 @@ package org.apache.archiva.redback.tests
  * limitations under the License.
  */
 
+import org.fest.assertions.Assertions;
 import junit.framework.TestCase;
 import org.apache.archiva.redback.rbac.Operation;
 import org.apache.archiva.redback.rbac.RBACManager;
@@ -45,8 +46,8 @@ import org.springframework.test.annotati
  *
  * @author <a href="mailto:[email protected]";>Joakim Erdfelt</a>
  */
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", 
"classpath*:/spring-context.xml" })
+@RunWith( SpringJUnit4ClassRunner.class )
+@ContextConfiguration( locations = { 
"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
 public abstract class AbstractRbacManagerTestCase
     extends TestCase
 {
@@ -658,17 +659,30 @@ public abstract class AbstractRbacManage
         assignment.addRoleName( adminRole.getName() );
         assignment = manager.saveUserAssignment( assignment );
 
-        assertEquals( 3, assignment.getRoleNames().size() );
-        assertEquals( 1, manager.getAllUserAssignments().size() );
-        assertEquals( 3, manager.getAllRoles().size() );
+        Assertions.assertThat( assignment.getRoleNames() 
).isNotNull().isNotEmpty().hasSize( 3 );
+        Assertions.assertThat( manager.getAllUserAssignments() 
).isNotNull().isNotEmpty().hasSize(
+            incAssignements( 1 ) );
+
+        Assertions.assertThat( manager.getAllRoles() 
).isNotNull().isNotEmpty().hasSize( 3 );
 
         afterSetup();
 
         // Get the List of Assigned Roles for user bob.
         Collection<Role> assignedRoles = manager.getAssignedRoles( username );
 
-        assertNotNull( assignedRoles );
-        assertEquals( 3, assignedRoles.size() );
+        Assertions.assertThat( assignedRoles 
).isNotNull().isNotEmpty().hasSize( 3 );
+    }
+
+    /**
+     * getAllUserAssignments() can return more for ldap as when creating a 
group
+     * it's mandatory to have at leat 1 user in the group
+     *
+     * @param size
+     * @return
+     */
+    protected int incAssignements( int size )
+    {
+        return size;
     }
 
     @Test
@@ -683,8 +697,8 @@ public abstract class AbstractRbacManage
         Role added = manager.saveRole( getDeveloperRole() );
         String roleName = added.getName();
 
-        assertEquals( 3, manager.getAllRoles().size() );
-        assertEquals( 3, manager.getAllPermissions().size() );
+        Assertions.assertThat( manager.getAllRoles() 
).isNotNull().isNotEmpty().hasSize( 3 );
+        Assertions.assertThat( manager.getAllPermissions() 
).isNotNull().isNotEmpty().hasSize( 3 );
 
         // Setup User / Assignment with 1 role.
         String username = "bob";
@@ -693,15 +707,14 @@ public abstract class AbstractRbacManage
         assignment.addRoleName( roleName );
         manager.saveUserAssignment( assignment );
 
-        assertEquals( 1, manager.getAllUserAssignments().size() );
-        assertEquals( 3, manager.getAllRoles().size() );
-        assertEquals( 3, manager.getAllPermissions().size() );
+        Assertions.assertThat( manager.getAllUserAssignments() 
).isNotNull().isNotEmpty().hasSize( 1 );
+        Assertions.assertThat( manager.getAllRoles() 
).isNotNull().isNotEmpty().hasSize( 3 );
+        Assertions.assertThat( manager.getAllPermissions() 
).isNotNull().isNotEmpty().hasSize( 3 );
 
         // Get the List of Assigned Roles for user bob.
         Collection<Permission> assignedPermissions = 
manager.getAssignedPermissions( username );
 
-        assertNotNull( assignedPermissions );
-        assertEquals( 1, assignedPermissions.size() );
+        Assertions.assertThat( assignedPermissions 
).isNotNull().isNotEmpty().hasSize( 1 );
     }
 
     public Role getChildRole( RBACManager manager, Role role, String 
expectedChildRoleName, int childRoleCount )

Modified: 
archiva/redback/redback-core/trunk/redback-users/redback-users-api/src/main/java/org/apache/archiva/redback/users/UserManager.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-users/redback-users-api/src/main/java/org/apache/archiva/redback/users/UserManager.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-users/redback-users-api/src/main/java/org/apache/archiva/redback/users/UserManager.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-users/redback-users-api/src/main/java/org/apache/archiva/redback/users/UserManager.java
 Tue Jan 15 13:22:03 2013
@@ -215,4 +215,5 @@ public interface UserManager
      * @since 2.1
      */
     String getDescriptionKey();
+
 }

Modified: 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/LdapUserManager.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/LdapUserManager.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/LdapUserManager.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/LdapUserManager.java
 Tue Jan 15 13:22:03 2013
@@ -22,6 +22,8 @@ package org.apache.archiva.redback.users
 
 import org.apache.archiva.redback.common.ldap.user.LdapUser;
 import org.apache.archiva.redback.common.ldap.user.UserMapper;
+import org.apache.archiva.redback.configuration.UserConfiguration;
+import org.apache.archiva.redback.configuration.UserConfigurationKeys;
 import org.apache.archiva.redback.users.AbstractUserManager;
 import org.apache.archiva.redback.users.User;
 import org.apache.archiva.redback.users.UserManager;
@@ -37,6 +39,7 @@ import org.apache.archiva.redback.users.
 import org.apache.archiva.redback.users.ldap.service.LdapCacheService;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.naming.directory.DirContext;
@@ -47,27 +50,40 @@ import java.util.List;
 /**
  * @author <a href="[email protected]"> jesse
  */
-@Service("userManager#ldap")
+@Service( "userManager#ldap" )
 public class LdapUserManager
     extends AbstractUserManager
     implements UserManager
 {
     @Inject
-    @Named(value = "ldapConnectionFactory#configurable")
+    @Named( value = "ldapConnectionFactory#configurable" )
     private LdapConnectionFactory connectionFactory;
 
     @Inject
     private LdapController controller;
 
     @Inject
-    @Named(value = "userMapper#ldap")
+    @Named( value = "userMapper#ldap" )
     private UserMapper mapper;
 
     @Inject
+    @Named( value = "userConfiguration#default" )
+    private UserConfiguration userConf;
+
+    @Inject
     private LdapCacheService ldapCacheService;
 
     private User guestUser;
 
+    private boolean writableLdap = false;
+
+    @PostConstruct
+    public void initialize()
+    {
+        this.writableLdap = userConf.getBoolean( 
UserConfigurationKeys.LDAP_WRITABLE, this.writableLdap );
+        controller.initialize();
+    }
+
     public boolean isReadOnly()
     {
         return true;

Modified: 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/DefaultLdapController.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/DefaultLdapController.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/DefaultLdapController.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/DefaultLdapController.java
 Tue Jan 15 13:22:03 2013
@@ -19,27 +19,43 @@ package org.apache.archiva.redback.users
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
+import javax.naming.directory.BasicAttributes;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 
+import org.apache.archiva.redback.common.ldap.connection.LdapConnection;
+import org.apache.archiva.redback.common.ldap.connection.LdapException;
 import org.apache.archiva.redback.common.ldap.user.LdapUser;
 import org.apache.archiva.redback.common.ldap.user.LdapUserMapper;
 import org.apache.archiva.redback.common.ldap.user.UserMapper;
+import org.apache.archiva.redback.configuration.UserConfiguration;
+import org.apache.archiva.redback.configuration.UserConfigurationKeys;
+import org.apache.archiva.redback.policy.PasswordEncoder;
+import org.apache.archiva.redback.policy.encoders.SHA1PasswordEncoder;
 import org.apache.archiva.redback.users.User;
 import org.apache.archiva.redback.users.UserManager;
 import org.apache.archiva.redback.common.ldap.MappingException;
 import org.apache.archiva.redback.users.ldap.LdapUserQuery;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -55,9 +71,33 @@ public class DefaultLdapController
     private Logger log = LoggerFactory.getLogger( getClass() );
 
     @Inject
-    @Named( value = "userMapper#ldap" )
+    @Named(value = "userMapper#ldap")
     private UserMapper mapper;
 
+    @Inject
+    @Named( value = "userConfiguration#default" )
+    private UserConfiguration userConf;
+
+    private boolean writableLdap = false;
+
+    private PasswordEncoder passwordEncoder;
+
+    private String baseDn;
+
+    private String groupsDn;
+
+    private String ldapGroupClass = "groupOfUniqueNames";
+
+    @PostConstruct
+    public void initialize()
+    {
+        this.writableLdap = userConf.getBoolean( 
UserConfigurationKeys.LDAP_WRITABLE, this.writableLdap );
+        this.baseDn = userConf.getConcatenatedList( 
UserConfigurationKeys.LDAP_BASEDN, null );
+        this.passwordEncoder = new SHA1PasswordEncoder();
+        this.groupsDn = userConf.getConcatenatedList( 
UserConfigurationKeys.LDAP_GROUPS_BASEDN, this.groupsDn );
+        this.ldapGroupClass = userConf.getString( 
UserConfigurationKeys.LDAP_GROUPS_CLASS, this.ldapGroupClass );
+    }
+
     /**
      * @see 
org.apache.archiva.redback.users.ldap.ctl.LdapController#removeUser(String, 
javax.naming.directory.DirContext)
      */
@@ -250,10 +290,55 @@ public class DefaultLdapController
         }
         if ( user.getUsername().equals( UserManager.GUEST_USERNAME ) )
         {
+            log.debug( "skip user '{}' creation" );
             //We don't store guest
             return;
         }
+        boolean userExists = userExists( user.getUsername(), context );
+        if ( userExists )
+        {
+            log.debug( "user '{}' exists skip creation", user.getUsername() );
+            return;
+        }
+        if ( writableLdap )
+        {
+            try
+            {
+                bindUserObject( context, user );
+                log.info( "user {} created in ldap", user.getUsername() );
+            }
+            catch ( NamingException e )
+            {
+                throw new LdapControllerException( e.getMessage(), e );
+            }
+        }
+    }
+
+
+    private void bindUserObject( DirContext context, User user )
+        throws NamingException
+    {
+        Attributes attributes = new BasicAttributes( true );
+        BasicAttribute objectClass = new BasicAttribute( "objectClass" );
+        objectClass.add( "top" );
+        objectClass.add( "inetOrgPerson" );
+        objectClass.add( "person" );
+        objectClass.add( "organizationalperson" );
+        attributes.put( objectClass );
+        attributes.put( "cn", user.getUsername() );
+        attributes.put( "sn", "foo" );
+        if ( StringUtils.isNotEmpty( user.getEmail() ) )
+        {
+            attributes.put( "mail", user.getEmail() );
+        }
 
+        if ( userConf.getBoolean( 
UserConfigurationKeys.LDAP_BIND_AUTHENTICATOR_ALLOW_EMPTY_PASSWORDS, false )
+            && StringUtils.isNotEmpty( user.getPassword() ) )
+        {
+            attributes.put( "userPassword", passwordEncoder.encodePassword( 
user.getPassword() ) );
+        }
+        attributes.put( "givenName", "foo" );
+        context.createSubcontext( "cn=" + user.getUsername() + "," + 
this.getBaseDn(), attributes );
     }
 
     /**
@@ -308,4 +393,154 @@ public class DefaultLdapController
         }
     }
 
+    public Map<String, Collection<String>> findUsersWithRoles( DirContext 
dirContext )
+        throws LdapControllerException
+    {
+        Map<String, Collection<String>> usersWithRoles = new HashMap<String, 
Collection<String>>();
+
+        NamingEnumeration<SearchResult> namingEnumeration = null;
+        try
+        {
+
+            SearchControls searchControls = new SearchControls();
+
+            searchControls.setDerefLinkFlag( true );
+            searchControls.setSearchScope( SearchControls.SUBTREE_SCOPE );
+
+            String filter = "objectClass=" + getLdapGroupClass();
+
+            namingEnumeration = dirContext.search( getGroupsDn(), filter, 
searchControls );
+
+            while ( namingEnumeration.hasMore() )
+            {
+                SearchResult searchResult = namingEnumeration.next();
+
+                String groupName = searchResult.getName();
+                // cn=blabla we only want bla bla
+                groupName = StringUtils.substringAfter( groupName, "=" );
+
+                Attribute uniqueMemberAttr = searchResult.getAttributes().get( 
"uniquemember" );
+
+                if ( uniqueMemberAttr != null )
+                {
+                    NamingEnumeration<String> allMembersEnum = 
(NamingEnumeration<String>) uniqueMemberAttr.getAll();
+                    while ( allMembersEnum.hasMore() )
+                    {
+                        String userName = allMembersEnum.next();
+                        // uid=blabla we only want bla bla
+                        userName = StringUtils.substringAfter( userName, "=" );
+                        userName = StringUtils.substringBefore( userName, "," 
);
+                        Collection<String> roles = usersWithRoles.get( 
userName );
+                        if ( roles == null )
+                        {
+                            roles = new HashSet<String>();
+                        }
+
+                        roles.add( groupName );
+
+                        usersWithRoles.put( userName, roles );
+
+                    }
+                }
+
+                log.debug( "found groupName: '{}' with users: {}", groupName );
+
+            }
+
+            return usersWithRoles;
+        }
+        catch ( NamingException e )
+        {
+            throw new LdapControllerException( e.getMessage(), e );
+        }
+
+        finally
+        {
+
+            if ( namingEnumeration != null )
+            {
+                try
+                {
+                    namingEnumeration.close();
+                }
+                catch ( NamingException e )
+                {
+                    log.warn( "failed to close search results", e );
+                }
+            }
+        }
+    }
+
+    //-----------------------------
+    // setters/getters
+    //-----------------------------
+    public UserMapper getMapper()
+    {
+        return mapper;
+    }
+
+    public void setMapper( UserMapper mapper )
+    {
+        this.mapper = mapper;
+    }
+
+    public UserConfiguration getUserConf()
+    {
+        return userConf;
+    }
+
+    public void setUserConf( UserConfiguration userConf )
+    {
+        this.userConf = userConf;
+    }
+
+    public boolean isWritableLdap()
+    {
+        return writableLdap;
+    }
+
+    public void setWritableLdap( boolean writableLdap )
+    {
+        this.writableLdap = writableLdap;
+    }
+
+    public PasswordEncoder getPasswordEncoder()
+    {
+        return passwordEncoder;
+    }
+
+    public void setPasswordEncoder( PasswordEncoder passwordEncoder )
+    {
+        this.passwordEncoder = passwordEncoder;
+    }
+
+    public String getBaseDn()
+    {
+        return baseDn;
+    }
+
+    public void setBaseDn( String baseDn )
+    {
+        this.baseDn = baseDn;
+    }
+
+    public String getGroupsDn()
+    {
+        return groupsDn;
+    }
+
+    public void setGroupsDn( String groupsDn )
+    {
+        this.groupsDn = groupsDn;
+    }
+
+    public String getLdapGroupClass()
+    {
+        return ldapGroupClass;
+    }
+
+    public void setLdapGroupClass( String ldapGroupClass )
+    {
+        this.ldapGroupClass = ldapGroupClass;
+    }
 }

Modified: 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/LdapController.java
URL: 
http://svn.apache.org/viewvc/archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/LdapController.java?rev=1433396&r1=1433395&r2=1433396&view=diff
==============================================================================
--- 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/LdapController.java
 (original)
+++ 
archiva/redback/redback-core/trunk/redback-users/redback-users-providers/redback-users-ldap/src/main/java/org/apache/archiva/redback/users/ldap/ctl/LdapController.java
 Tue Jan 15 13:22:03 2013
@@ -27,6 +27,7 @@ import org.apache.archiva.redback.users.
 import javax.naming.directory.DirContext;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  *
@@ -54,4 +55,14 @@ public interface LdapController
 
     List<User> getUsersByQuery( LdapUserQuery query, DirContext context )
         throws LdapControllerException, MappingException;
+
+    void initialize();
+
+    /**
+     * @param dirContext
+     * @return Map key == username and value == list of role names
+     * @throws LdapControllerException
+     */
+    Map<String, Collection<String>> findUsersWithRoles( DirContext dirContext )
+        throws LdapControllerException;
 }


Reply via email to