1   package com.atlassian.user.configuration;
2   
3   
4   import java.io.ByteArrayInputStream;
5   import java.io.InputStream;
6   
7   import junit.framework.TestCase;
8   
9   import com.atlassian.cache.empty.EmptyCacheManager;
10  import com.atlassian.user.User;
11  import com.atlassian.user.configuration.xml.XMLConfiguration;
12  import com.atlassian.user.impl.DefaultGroup;
13  import com.atlassian.user.impl.DefaultUser;
14  import com.atlassian.user.impl.cache.CachingGroupManager;
15  import com.atlassian.user.impl.cache.CachingUserManager;
16  import com.atlassian.user.impl.cache.properties.CachingPropertySetFactory;
17  import com.atlassian.user.impl.hibernate.DefaultHibernateGroup;
18  import com.atlassian.user.impl.hibernate.DefaultHibernateUser;
19  import com.atlassian.user.impl.hibernate.HibernateGroupManager;
20  import com.atlassian.user.impl.hibernate.HibernateUserManager;
21  import com.atlassian.user.impl.hibernate.configuration.HibernateXMLConfiguration;
22  import com.atlassian.user.impl.hibernate.properties.HibernatePropertySetFactory;
23  import com.atlassian.user.impl.hibernate.search.query.HibernateEntityQueryParser;
24  import com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly;
25  import com.atlassian.user.impl.ldap.LDAPUserManagerReadOnly;
26  import com.atlassian.user.impl.ldap.LdapRepositoryAccessor;
27  import com.atlassian.user.impl.ldap.properties.LdapConnectionProperties;
28  import com.atlassian.user.impl.ldap.properties.LdapSearchProperties;
29  import com.atlassian.user.impl.ldap.security.authentication.DefaultLDAPAuthenticator;
30  import com.atlassian.user.impl.memory.MemoryGroupManager;
31  import com.atlassian.user.impl.memory.MemoryGroupManagerReadOnly;
32  import com.atlassian.user.impl.memory.MemoryUserManager;
33  import com.atlassian.user.impl.memory.MemoryUserManagerReadOnly;
34  import com.atlassian.user.impl.memory.properties.MemoryPropertySetFactory;
35  import com.atlassian.user.impl.osuser.OSUGroup;
36  import com.atlassian.user.impl.osuser.OSUGroupManager;
37  import com.atlassian.user.impl.osuser.OSUUser;
38  import com.atlassian.user.impl.osuser.OSUUserManager;
39  import com.atlassian.user.impl.osuser.properties.OSUPropertySetFactory;
40  import com.atlassian.user.impl.osuser.security.authentication.OSUListOfCredentialProvidersAuthenticator;
41  import com.atlassian.user.impl.osuser.security.password.OSUPasswordEncryptor;
42  import com.atlassian.user.repository.RepositoryIdentifier;
43  import com.atlassian.user.search.page.PagerUtils;
44  import com.atlassian.user.search.query.DefaultEntityQueryParser;
45  import com.atlassian.user.security.authentication.DefaultAuthenticator;
46  
47  /**
48   * Testing atlassian-user-defaults.xml and {@link DefaultRepositoryProcessor}.
49   */
50  public class TestDefaultRepositoryConfigurations extends TestCase
51  {
52      private String memoryRepository = "<atlassian-user><repositories>" +
53          "<memory key=\"memory1\" name=\"My memory repository\"></memory>" +
54          "</repositories></atlassian-user>";
55  
56      private String readOnlyMemoryRepository = "<atlassian-user><repositories>" +
57          "<memory key=\"memory1\" name=\"My memory repository\">" +
58          "    <classes>\n" +
59          "        <userManager>com.atlassian.user.impl.memory.MemoryUserManagerReadOnly</userManager>\n" +
60          "        <groupManager>com.atlassian.user.impl.memory.MemoryGroupManagerReadOnly</groupManager>\n" +
61          "    </classes>" +
62          "</memory>" +
63          "</repositories></atlassian-user>";
64  
65  
66      private String cachingMemoryRepository = "<atlassian-user><repositories>" +
67          "<memory key=\"memory1\" name=\"My memory repository\" cache=\"true\"></memory>" +
68          "</repositories></atlassian-user>";
69  
70      private String hibernateRepository = "<atlassian-user><repositories>" +
71          "<hibernate key=\"hibernate1\" name=\"My hibernate repository\">" +
72          "    <classes>" +
73          "        <param name=\"accessor\">com.atlassian.user.impl.hibernate.configuration.MemoryHsqlHibernateAccessor</param>" +
74          "    </classes>" +
75          "</hibernate>" +
76          "</repositories></atlassian-user>";
77  
78      private String cachingHibernateRepository = "<atlassian-user><repositories>" +
79          "<hibernate key=\"hibernate1\" name=\"My hibernate repository\" cache=\"true\">" +
80          "    <classes>" +
81          "        <param name=\"accessor\">com.atlassian.user.impl.hibernate.configuration.MemoryHsqlHibernateAccessor</param>" +
82          "    </classes>" +
83          "</hibernate>" +
84          "</repositories></atlassian-user>";
85  
86      private String ldapRepository = "<atlassian-user><repositories>" +
87          "<ldap key=\"ldap1\" name=\"My LDAP repository\">" +
88          "   <host>localhost</host>" +
89          "   <timeToLive>600</timeToLive>" +
90          "   <readTimeout>123</readTimeout>" +
91          "   <connectTimeout>500</connectTimeout>" +
92          "</ldap>" +
93          "</repositories></atlassian-user>";
94  
95      private String cachingLdapRepository = "<atlassian-user><repositories>" +
96          "<ldap key=\"ldap1\" name=\"My LDAP repository\" cache=\"true\"><timeToLive>600</timeToLive></ldap>" +
97          "</repositories></atlassian-user>";
98  
99      private String osUserRepository = "<atlassian-user><repositories>" +
100         "<osuser key=\"osuser1\" name=\"My OSUser repository\">" +
101         "    <classes>" +
102         "        <param name=\"configFile\">osuser-test.xml</param>" +
103         "    </classes>" +
104         "</osuser>" +
105         "</repositories></atlassian-user>";
106 
107     public void testMemoryRepository() throws Exception
108     {
109         InputStream is = new ByteArrayInputStream(memoryRepository.getBytes());
110         XMLConfiguration config = new XMLConfiguration(is);
111         config.init();
112         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
113 
114         assertEquals("only memory repository present", 1, delegationAccessor.getRepositoryAccessors().size());
115         RepositoryAccessor repository = delegationAccessor.getRepositoryAccessor("memory1");
116         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
117 
118         assertEquals(MemoryUserManager.class, repository.getUserManager().getClass());
119         assertEquals(MemoryGroupManager.class, repository.getGroupManager().getClass());
120         assertEquals(DefaultAuthenticator.class, repository.getAuthenticator().getClass());
121         assertEquals(DefaultEntityQueryParser.class, repository.getEntityQueryParser().getClass());
122         assertEquals(MemoryPropertySetFactory.class, repository.getPropertySetFactory().getClass());
123 
124         repository.getUserManager().createUser("bob");
125         assertEquals(DefaultUser.class, repository.getUserManager().getUser("bob").getClass());
126 
127         repository.getGroupManager().createGroup("confluence-users");
128         assertEquals(DefaultGroup.class, repository.getGroupManager().getGroup("confluence-users").getClass());
129     }
130 
131     public void testReadOnlyMemoryRepository() throws Exception
132     {
133         InputStream is = new ByteArrayInputStream(readOnlyMemoryRepository.getBytes());
134         XMLConfiguration config = new XMLConfiguration(is);
135         config.init();
136         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
137 
138         assertEquals("only memory repository present", 1, delegationAccessor.getRepositoryAccessors().size());
139         RepositoryAccessor repository = delegationAccessor.getRepositoryAccessor("memory1");
140         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
141 
142         assertEquals(MemoryUserManagerReadOnly.class, repository.getUserManager().getClass());
143         assertEquals(MemoryGroupManagerReadOnly.class, repository.getGroupManager().getClass());
144         assertEquals(DefaultAuthenticator.class, repository.getAuthenticator().getClass());
145         assertEquals(DefaultEntityQueryParser.class, repository.getEntityQueryParser().getClass());
146         assertEquals(MemoryPropertySetFactory.class, repository.getPropertySetFactory().getClass());
147 
148         assertEquals(0, PagerUtils.count(repository.getUserManager().getUsers()));
149         assertEquals(0, PagerUtils.count(repository.getGroupManager().getGroups()));
150     }
151 
152     public void testCachingMemoryRepository() throws Exception
153     {
154         InputStream is = new ByteArrayInputStream(cachingMemoryRepository.getBytes());
155         XMLConfiguration config = new CachingXMLConfiguration(is, new EmptyCacheManager());
156         config.init();
157         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
158 
159         assertEquals("only memory repository present", 1, delegationAccessor.getRepositoryAccessors().size());
160         RepositoryAccessor repository = delegationAccessor.getRepositoryAccessor("memory1");
161         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
162 
163         assertEquals(CachingUserManager.class, repository.getUserManager().getClass());
164         assertEquals(CachingGroupManager.class, repository.getGroupManager().getClass());
165         assertEquals(DefaultAuthenticator.class, repository.getAuthenticator().getClass());
166         assertEquals(DefaultEntityQueryParser.class, repository.getEntityQueryParser().getClass());
167         assertEquals(CachingPropertySetFactory.class, repository.getPropertySetFactory().getClass());
168 
169         repository.getUserManager().createUser("bob");
170         assertEquals(DefaultUser.class, repository.getUserManager().getUser("bob").getClass());
171 
172         repository.getGroupManager().createGroup("confluence-users");
173         assertEquals(DefaultGroup.class, repository.getGroupManager().getGroup("confluence-users").getClass());
174     }
175 
176     public void testHibernateRepository() throws Exception
177     {
178         InputStream is = new ByteArrayInputStream(hibernateRepository.getBytes());
179         XMLConfiguration config = new HibernateXMLConfiguration(is, new EmptyCacheManager());
180         config.init();
181         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
182 
183         assertEquals("only hibernate repository present", 1, delegationAccessor.getRepositoryAccessors().size());
184         RepositoryAccessor repository = delegationAccessor.getRepositoryAccessor("hibernate1");
185         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
186 
187         assertEquals(HibernateUserManager.class, repository.getUserManager().getClass());
188         assertEquals(HibernateGroupManager.class, repository.getGroupManager().getClass());
189         assertEquals(DefaultAuthenticator.class, repository.getAuthenticator().getClass());
190         assertEquals(HibernateEntityQueryParser.class, repository.getEntityQueryParser().getClass());
191         assertEquals(HibernatePropertySetFactory.class, repository.getPropertySetFactory().getClass());
192 
193         repository.getUserManager().createUser("bob");
194         assertEquals(DefaultHibernateUser.class, repository.getUserManager().getUser("bob").getClass());
195 
196         repository.getGroupManager().createGroup("confluence-users");
197         assertEquals(DefaultHibernateGroup.class, repository.getGroupManager().getGroup("confluence-users").getClass());
198     }
199 
200     public void testCachingHibernateRepository() throws Exception
201     {
202         InputStream is = new ByteArrayInputStream(cachingHibernateRepository.getBytes());
203         XMLConfiguration config = new HibernateXMLConfiguration(is, new EmptyCacheManager());
204         config.init();
205         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
206 
207         assertEquals("only hibernate repository present", 1, delegationAccessor.getRepositoryAccessors().size());
208         RepositoryAccessor repository = delegationAccessor.getRepositoryAccessor("hibernate1");
209         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
210 
211         assertEquals(CachingUserManager.class, repository.getUserManager().getClass());
212         assertEquals(CachingGroupManager.class, repository.getGroupManager().getClass());
213         assertEquals(DefaultAuthenticator.class, repository.getAuthenticator().getClass());
214         assertEquals(HibernateEntityQueryParser.class, repository.getEntityQueryParser().getClass());
215         assertEquals(CachingPropertySetFactory.class, repository.getPropertySetFactory().getClass());
216 
217         repository.getUserManager().createUser("bob");
218         assertEquals(DefaultHibernateUser.class, repository.getUserManager().getUser("bob").getClass());
219 
220         repository.getGroupManager().createGroup("confluence-users");
221         assertEquals(DefaultHibernateGroup.class, repository.getGroupManager().getGroup("confluence-users").getClass());
222     }
223 
224     public void testOSUserRepository() throws Exception
225     {
226         InputStream is = new ByteArrayInputStream(osUserRepository.getBytes());
227         XMLConfiguration config = new XMLConfiguration(is);
228         config.init();
229         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
230 
231         assertEquals("only osuser repository present", 1, delegationAccessor.getRepositoryAccessors().size());
232         DefaultRepositoryAccessor repository = (DefaultRepositoryAccessor) delegationAccessor.getRepositoryAccessor("osuser1");
233         assertEquals(repository, delegationAccessor.getRepositoryAccessors().get(0));
234 
235         assertEquals(OSUUserManager.class, repository.getUserManager().getClass());
236         assertEquals(OSUGroupManager.class, repository.getGroupManager().getClass());
237         assertEquals(OSUListOfCredentialProvidersAuthenticator.class, repository.getAuthenticator().getClass());
238         assertEquals(DefaultEntityQueryParser.class, repository.getEntityQueryParser().getClass());
239         assertEquals(OSUPropertySetFactory.class, repository.getPropertySetFactory().getClass());
240         assertEquals(OSUPasswordEncryptor.class, repository.getPasswordEncryptor().getClass());
241 
242         User bob = repository.getUserManager().createUser("bob");
243         assertEquals(OSUUser.class, bob.getClass());
244         assertEquals(bob, repository.getUserManager().getUser("bob"));
245 
246         repository.getGroupManager().createGroup("confluence-users");
247         assertEquals(OSUGroup.class, repository.getGroupManager().getGroup("confluence-users").getClass());
248 
249         repository.getPasswordEncryptor().encrypt("secret");
250     }
251 
252     public void testLdapRepository() throws Exception
253     {
254         InputStream is = new ByteArrayInputStream(ldapRepository.getBytes());
255         XMLConfiguration config = new XMLConfiguration(is);
256         config.init();
257         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
258 
259         assertEquals("only ldap accessor present", 1, delegationAccessor.getRepositoryAccessors().size());
260         LdapRepositoryAccessor accessor = (LdapRepositoryAccessor) delegationAccessor.getRepositoryAccessor("ldap1");
261         assertEquals(accessor, delegationAccessor.getRepositoryAccessors().get(0));
262 
263         assertEquals(LDAPUserManagerReadOnly.class, accessor.getUserManager().getClass());
264         assertEquals(LDAPGroupManagerReadOnly.class, accessor.getGroupManager().getClass());
265         assertEquals(DefaultLDAPAuthenticator.class, accessor.getAuthenticator().getClass());
266         assertEquals(com.atlassian.user.impl.ldap.search.query.LDAPEntityQueryParser.class, accessor.getEntityQueryParser().getClass());
267         assertNull(accessor.getPropertySetFactory());
268 
269         RepositoryIdentifier identifier = accessor.getIdentifier();
270         assertEquals("ldap1", identifier.getKey());
271         assertEquals("My LDAP repository", identifier.getName());
272         assertEquals("1", System.getProperty("com.sun.jndi.ldap.connect.pool.initsize"));
273         assertEquals("10", System.getProperty("com.sun.jndi.ldap.connect.pool.prefsize"));
274         assertEquals("0", System.getProperty("com.sun.jndi.ldap.connect.pool.maxsize"));
275         assertEquals("300000", System.getProperty("com.sun.jndi.ldap.connect.pool.timeout"));
276         assertEquals("none", System.getProperty("com.sun.jndi.ldap.connect.pool.debug"));
277 
278         LdapConnectionProperties connectionProperties = accessor.getConnectionProperties();
279         assertTrue(connectionProperties.isPoolingOn());
280         assertEquals("plain ssl", connectionProperties.getSecurityProtocol());
281         assertEquals("simple", connectionProperties.getSecurityAuthentication());
282         assertEquals("com.sun.jndi.ldap.LdapCtxFactory", connectionProperties.getJNDIInitialContextFactoryIdentifier());
283         assertEquals(100, connectionProperties.getSearchBatchSize());
284         assertEquals("ldaps://localhost:389", connectionProperties.getProviderURL());
285         assertEquals(500, connectionProperties.getConnectTimeoutMillis());
286         assertEquals(123, connectionProperties.getReadTimeoutMillis());
287 
288         LdapSearchProperties searchProperties = accessor.getSearchProperties();
289         assertEquals(600, searchProperties.getTimeLimitMillis());
290         assertTrue(searchProperties.isUserSearchScopeAllDepths());
291         assertTrue(searchProperties.isGroupSearchScopeAllDepths());
292     }
293 
294     public void testCachingLdapRepository() throws Exception
295     {
296         InputStream is = new ByteArrayInputStream(cachingLdapRepository.getBytes());
297         XMLConfiguration config = new CachingXMLConfiguration(is, new EmptyCacheManager());
298         config.init();
299         DelegationAccessor delegationAccessor = config.getDelegationAccessor();
300 
301         assertEquals("only ldap accessor present", 1, delegationAccessor.getRepositoryAccessors().size());
302         LdapRepositoryAccessor accessor = (LdapRepositoryAccessor) delegationAccessor.getRepositoryAccessor("ldap1");
303         assertEquals(accessor, delegationAccessor.getRepositoryAccessors().get(0));
304 
305         assertEquals(CachingUserManager.class, accessor.getUserManager().getClass());
306         assertEquals(CachingGroupManager.class, accessor.getGroupManager().getClass());
307         assertEquals(DefaultLDAPAuthenticator.class, accessor.getAuthenticator().getClass());
308         assertEquals(com.atlassian.user.impl.ldap.search.query.LDAPEntityQueryParser.class, accessor.getEntityQueryParser().getClass());
309         assertNull(accessor.getPropertySetFactory());
310 
311         RepositoryIdentifier identifier = accessor.getIdentifier();
312         assertEquals("ldap1", identifier.getKey());
313 
314         assertEquals("1", System.getProperty("com.sun.jndi.ldap.connect.pool.initsize"));
315         assertEquals("10", System.getProperty("com.sun.jndi.ldap.connect.pool.prefsize"));
316         assertEquals("0", System.getProperty("com.sun.jndi.ldap.connect.pool.maxsize"));
317         assertEquals("300000", System.getProperty("com.sun.jndi.ldap.connect.pool.timeout"));
318         assertEquals("none", System.getProperty("com.sun.jndi.ldap.connect.pool.debug"));
319 
320         LdapConnectionProperties connectionProperties = accessor.getConnectionProperties();
321         assertTrue(connectionProperties.isPoolingOn());
322         assertEquals("plain ssl", connectionProperties.getSecurityProtocol());
323         assertEquals("simple", connectionProperties.getSecurityAuthentication());
324         assertEquals("com.sun.jndi.ldap.LdapCtxFactory", connectionProperties.getJNDIInitialContextFactoryIdentifier());
325         assertEquals(100, connectionProperties.getSearchBatchSize());
326         assertEquals(30000, connectionProperties.getConnectTimeoutMillis());
327         assertEquals(60000, connectionProperties.getReadTimeoutMillis());
328 
329         LdapSearchProperties searchProperties = accessor.getSearchProperties();
330         assertEquals(600, searchProperties.getTimeLimitMillis());
331         assertTrue(searchProperties.isUserSearchScopeAllDepths());
332         assertTrue(searchProperties.isGroupSearchScopeAllDepths());
333     }
334 }