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 }