1   package com.atlassian.user.impl.delegation;
2   
3   import com.atlassian.ldap.server.LdapServer;
4   import com.atlassian.user.*;
5   import com.atlassian.user.impl.delegation.security.authentication.DelegatingAuthenticator;
6   import com.atlassian.user.impl.DuplicateEntityException;
7   import com.atlassian.user.generic.AbstractTestExternalGroupManager;
8   import com.atlassian.user.search.page.PagerUtils;
9   import com.atlassian.user.security.authentication.Authenticator;
10  
11  import java.util.Arrays;
12  import java.util.List;
13  
14  import net.sf.hibernate.HibernateException;
15  
16  /**
17   * Test the most common LDAP situation: where LDAP and Hibernate are chained together.
18   */
19  public class TestDelegatingGroupManagerWithLdapAndHibernate extends AbstractTestExternalGroupManager
20  {
21      private GroupManager ldapGroupManager;
22      private UserManager ldapUserManager;
23      private Authenticator ldapAuthenticator;
24      private GroupManager hibernateGroupManager;
25      private UserManager hibernateUserManager;
26      private Authenticator hibernateAuthenticator;
27      private LdapServer ldapServer;
28      private GroupManager delegatingGroupManager;
29      private UserManager delegatingUserManager;
30  
31      protected String[] getConfigLocations()
32      {
33          return new String[]{
34              "classpath:com/atlassian/user/impl/ldap/ldapTestContext.xml",
35              "classpath:com/atlassian/user/impl/ldap/ldapTestServerContext.xml",
36              "classpath:com/atlassian/user/impl/ldap/static/flat/ldapTestStaticFlatContext.xml",
37              "classpath:com/atlassian/user/impl/hibernate/hibernateTestContext.xml",
38              "classpath:com/atlassian/user/dataSourceTestContext.xml"
39          };
40      }
41  
42      protected void onSetUp() throws Exception
43      {
44          super.onSetUp();
45          ldapServer.start();
46          delegatingGroupManager = new DelegatingGroupManager(Arrays.asList(new GroupManager[]{
47              ldapGroupManager,
48              hibernateGroupManager,
49          }));
50          delegatingUserManager = new DelegatingUserManager(Arrays.asList(new UserManager[]{
51              ldapUserManager,
52              hibernateUserManager,
53          }));
54      }
55  
56  
57      protected void onTearDown() throws Exception
58      {
59          ldapServer.stop();
60          super.onTearDown();
61      }
62  
63      public void setLdapServer(LdapServer ldapServer)
64      {
65          this.ldapServer = ldapServer;
66      }
67  
68      public void setHibernateGroupManager(GroupManager hibernateGroupManager)
69      {
70          this.hibernateGroupManager = hibernateGroupManager;
71      }
72  
73      public void setHibernateUserManager(UserManager hibernateUserManager)
74      {
75          this.hibernateUserManager = hibernateUserManager;
76      }
77  
78      public void setHibernateAuthenticator(Authenticator hibernateAuthenticator)
79      {
80          this.hibernateAuthenticator = hibernateAuthenticator;
81      }
82  
83      public void setLdapGroupManager(GroupManager ldapGroupManager)
84      {
85          this.ldapGroupManager = ldapGroupManager;
86      }
87  
88      public void setLdapUserManager(UserManager ldapUserManager)
89      {
90          this.ldapUserManager = ldapUserManager;
91      }
92  
93      public void setLdapAuthenticator(Authenticator ldapAuthenticator)
94      {
95          this.ldapAuthenticator = ldapAuthenticator;
96      }
97  
98      protected UserManager getUserManager()
99      {
100         return delegatingUserManager;
101     }
102 
103     protected GroupManager getGroupManager()
104     {
105         return delegatingGroupManager;
106     }
107 
108     public void testLdapExternalMembership() throws Exception
109     {
110         Group localGroup = delegatingGroupManager.createGroup("local-group");
111         User localUser = delegatingUserManager.createUser("local-user");
112         User externalUser = ldapUserManager.getUser("user1");
113         delegatingGroupManager.addMembership(localGroup, localUser);
114         delegatingGroupManager.addMembership(localGroup, externalUser);
115 
116         List members = PagerUtils.toList(delegatingGroupManager.getMemberNames(localGroup));
117         assertEquals(2, members.size());
118         assertEquals("user1", members.get(0)); // external users are returned first by HibernateGroupManager
119         assertEquals("local-user", members.get(1));
120 
121         List externalMembers = PagerUtils.toList(delegatingGroupManager.getExternalMemberNames(localGroup));
122         assertEquals(1, externalMembers.size());
123         assertEquals("user1", externalMembers.get(0));
124 
125         List localMembers = PagerUtils.toList(delegatingGroupManager.getLocalMemberNames(localGroup));
126         assertEquals(1, localMembers.size());
127         assertEquals("local-user", localMembers.get(0));
128 
129         List groupsForExternalUser = PagerUtils.toList(delegatingGroupManager.getGroups(externalUser));
130         assertEquals(2, groupsForExternalUser.size());
131         // groups are returned in delegation order
132         assertEquals(ldapGroupManager.getGroup("group1"), groupsForExternalUser.get(0));
133         assertEquals(localGroup, groupsForExternalUser.get(1));
134     }
135 
136     public void testAuthenticateAgainstLdap() throws Exception
137     {
138         assertTrue(ldapAuthenticator.authenticate("user1", "pass1"));
139 
140         Authenticator delegatingAuthenticator = new DelegatingAuthenticator(delegatingUserManager, Arrays.asList(new Authenticator[] {
141             ldapAuthenticator,
142             hibernateAuthenticator
143         }));
144 
145         assertTrue(delegatingAuthenticator.authenticate("user1", "pass1"));
146 
147         User hibernateUser = hibernateUserManager.createUser("user1");
148         hibernateUserManager.alterPassword(hibernateUser, "anotherpass");
149 
150         assertTrue(delegatingAuthenticator.authenticate("user1", "pass1"));
151     }
152 
153     /**
154      * Overridden because this LDAP server has existing groups. Eight existing groups, to be exact.
155      */
156     public void testCreateGroup() throws EntityException, HibernateException
157     {
158         Group group = getGroupManager().createGroup("group");
159         assertNotNull(group);
160 
161         try
162         {
163             getGroupManager().createGroup("group");
164             fail("Expected DuplicateEntityException when trying to create a duplicate group");
165         }
166         catch (DuplicateEntityException expected)
167         {
168         }
169 
170         assertEquals(9, PagerUtils.count(getGroupManager().getGroups()));
171     }
172 }