1   package com.atlassian.user.impl.ldap.configuration;
2   
3   import com.atlassian.user.configuration.*;
4   import com.atlassian.user.impl.ldap.properties.factory.LdapConnectionPropertiesFactory;
5   import com.atlassian.user.impl.ldap.properties.factory.LdapMembershipPropertiesFactory;
6   import com.atlassian.user.impl.ldap.properties.factory.LdapSearchPropertiesFactory;
7   import com.atlassian.user.impl.ldap.properties.LdapConnectionProperties;
8   import com.atlassian.user.impl.ldap.properties.LdapSearchProperties;
9   import com.atlassian.user.impl.ldap.properties.LdapMembershipProperties;
10  import com.atlassian.user.impl.ldap.repository.DefaultLdapContextFactory;
11  import com.atlassian.user.impl.ldap.search.DefaultLdapFilterFactory;
12  
13  import java.util.HashMap;
14  import java.util.Map;
15  import java.util.Properties;
16  
17  public class LdapRepositoryProcessor extends DefaultRepositoryProcessor
18  {
19      public RepositoryAccessor process(RepositoryConfiguration config) throws ConfigurationException
20      {
21          setConnectionPoolProperties(config);
22  
23          Properties schemaMappingsProperties = parseSchemaMappings(config);
24          Properties serverProperties = parseLDAPServerConfiguration(config);
25  
26          LdapConnectionProperties connectionProperties = new LdapConnectionPropertiesFactory().createInstance(serverProperties);
27          LdapSearchProperties searchProperties = new LdapSearchPropertiesFactory().createInstance(schemaMappingsProperties);
28          LdapMembershipProperties membershipProperties = new LdapMembershipPropertiesFactory().createInstance(schemaMappingsProperties);
29  
30          config.addComponent("connectionProperties", connectionProperties);
31          config.addComponent("searchProperties", searchProperties);
32          config.addComponent("membershipProperties", membershipProperties);
33  
34          config.addComponent(Configuration.LDAP_SCHEMA_MAPPINGS_PROPERTIES, schemaMappingsProperties);
35          config.addComponent(Configuration.SERVER, serverProperties);
36  
37          config.addComponent("contextFactory", new DefaultLdapContextFactory(connectionProperties));
38          config.addComponent("filterFactory", new DefaultLdapFilterFactory(searchProperties));
39  
40          config.addComponent(Configuration.USERADAPTOR, createBean(Configuration.USERADAPTOR, config));
41          config.addComponent(Configuration.USERFACTORY, createBean(Configuration.USERFACTORY, config));
42          config.addComponent(Configuration.GROUPFACTORY, createBean(Configuration.GROUPFACTORY, config));
43          config.addComponent(Configuration.GROUPADAPTOR, createBean(Configuration.GROUPADAPTOR, config));
44  
45          return super.process(config);
46      }
47  
48      public void setConnectionPoolProperties(RepositoryConfiguration config)
49      {
50          Map<String, String> properties = new HashMap<String, String>();
51          properties.put("com.sun.jndi.ldap.connect.pool.maxsize", config.getStringComponent(Configuration.MAXSIZE));
52          properties.put("com.sun.jndi.ldap.connect.pool.initsize", config.getStringComponent(Configuration.INITSIZE));
53          properties.put("com.sun.jndi.ldap.connect.pool.prefsize", config.getStringComponent(Configuration.PREFSIZE));
54          properties.put("com.sun.jndi.ldap.connect.pool.debug", config.getStringComponent(Configuration.DEBUG));
55          properties.put("com.sun.jndi.ldap.connect.pool.protocol", config.getStringComponent(Configuration.SECURITY_PROTOCOL));
56          properties.put("com.sun.jndi.ldap.connect.pool.authentication", config.getStringComponent(Configuration.POOL_AUTHENTICATION));
57          properties.put("com.sun.jndi.ldap.connect.pool.timeout", config.getStringComponent(Configuration.TIMEOUT));
58          properties.put("javax.net.ssl.trustStore", config.getStringComponent(Configuration.TRUSTSTORE));
59  
60          for (Map.Entry<String, String> entry : properties.entrySet())
61          {
62              String value = entry.getValue();
63              if (value != null) System.setProperty(entry.getKey(), value);
64          }
65      }
66  
67      public Properties parseLDAPServerConfiguration(RepositoryConfiguration config)
68      {
69          Properties serverProperties = new Properties();
70  
71          String[] propertyKeys = new String[]{
72              Configuration.HOST,
73              Configuration.PORT,
74              Configuration.SECURITY_PRINCIPAL,
75              Configuration.SECURITY_CREDENTIAL,
76              Configuration.SECURITY_PROTOCOL,
77              Configuration.AUTHENTICATION,
78              Configuration.BASE_CONTEXT,
79              Configuration.BATCH_SIZE,
80              Configuration.INITIAL_CONTEXT_FACTORY_JNDI,
81              Configuration.POOLING_ON,
82              Configuration.CONNECT_TIMEOUT,
83              Configuration.READ_TIMEOUT,
84          };
85  
86          for (String key : propertyKeys)
87          {
88              String value = (String) config.getComponent(key);
89              if (value == null) continue;
90              serverProperties.put(key, value);
91          }
92          return serverProperties;
93      }
94  
95      public Properties parseSchemaMappings(RepositoryConfiguration config)
96      {
97          Properties schemaMappingsProperties = new Properties();
98  
99          String[] propertyKeys = new String[]{
100             Configuration.BASE_USER_NAMESPACE,
101             Configuration.BASE_GROUP_NAMESPACE,
102             Configuration.USERNAME_ATTRIBUTE,
103             Configuration.GROUPNAME_ATTRIBUTE,
104             Configuration.USER_SEARCH_FILTER,
105             Configuration.GROUP_SEARCH_FILTER,
106             Configuration.FIRSTNAME_ATTRIBUTE,
107             Configuration.SURNAME_ATTRIBUTE,
108             Configuration.EMAIL_ATTRIBUTE,
109             Configuration.MEMBERSHIP_ATTRIBUTE,
110             Configuration.USER_SEARCH_ALL_DEPTHS,
111             Configuration.GROUP_SEARCH_ALL_DEPTHS,
112             Configuration.USE_UNQUALIFIED_USER_NAME_FOR_MEMBERSHIP_COMPARISON,
113             Configuration.TIME_TO_LIVE,
114         };
115 
116         for (String key : propertyKeys)
117         {
118             String value = (String) config.getComponent(key);
119             if (value == null) continue;
120             schemaMappingsProperties.setProperty(key, value);
121         }
122 
123         return schemaMappingsProperties;
124     }
125 }