Commit f1cfc21f authored by Matt Tucker's avatar Matt Tucker Committed by matt

Added searchFilter feature (JM-130).


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@1078 b35dd754-fafc-0310-a699-88a17e54d16e
parent 2f5ecc4e
......@@ -34,6 +34,9 @@ import javax.naming.directory.*;
* <li>ldap.usernameField -- default value is "uid".</li>
* <li>ldap.nameField -- default value is "cn".</li>
* <li>ldap.emailField -- default value is "mail".</li>
* <li>ldap.searchFilter -- the filter used to load the list of users. The
* default value is in the form "([usernameField]={0})" where [usernameField]
* is the value of ldap.usernameField.
* <li>ldap.ldapDebugEnabled</li>
* <li>ldap.sslEnabled</li>
* <li>ldap.autoFollowReferrals</li>
......@@ -59,6 +62,7 @@ public class LdapManager {
private String initialContextFactory;
private boolean followReferrals = false;
private boolean connectionPoolEnabled = true;
private String searchFilter = null;
private static LdapManager instance = new LdapManager();
......@@ -103,6 +107,15 @@ public class LdapManager {
this.connectionPoolEnabled = Boolean.valueOf(
JiveGlobals.getXMLProperty("ldap.connectionPoolEnabled")).booleanValue();
}
if (JiveGlobals.getXMLProperty("ldap.searchFilter") != null) {
this.searchFilter = JiveGlobals.getXMLProperty("ldap.searchFilter");
}
else {
StringBuffer filter = new StringBuffer();
filter.append("(").append(usernameField).append("={0})");
this.searchFilter = filter.toString();
}
this.adminDN = JiveGlobals.getXMLProperty("ldap.adminDN");
if (adminDN != null && adminDN.trim().equals("")) {
adminDN = null;
......@@ -141,6 +154,7 @@ public class LdapManager {
Log.debug("\t emailField: " + emailField);
Log.debug("\t adminDN: " + adminDN);
Log.debug("\t adminPassword: " + adminPassword);
Log.debug("\t searchFilter: " + searchFilter);
Log.debug("\t ldapDebugEnabled: " + ldapDebugEnabled);
Log.debug("\t sslEnabled: " + sslEnabled);
Log.debug("\t initialContextFactory: " + initialContextFactory);
......@@ -385,11 +399,7 @@ public class LdapManager {
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(new String[] { usernameField });
StringBuffer filter = new StringBuffer();
filter.append("(").append(usernameField).append("=");
filter.append(username).append(")");
NamingEnumeration answer = ctx.search("", filter.toString(), constraints);
NamingEnumeration answer = ctx.search("", searchFilter, new String[] {username}, constraints);
if (debug) {
Log.debug("... search finished");
......@@ -710,4 +720,33 @@ public class LdapManager {
this.adminPassword = adminPassword;
JiveGlobals.setXMLProperty("ldap.adminPassword", adminPassword);
}
/**
* Returns the filter used for searching the directory for users.
*
* @return the search filter.
*/
public String getSearchFilter() {
return searchFilter;
}
/**
* Sets the filter used for searching the directory for users. The filter should
* contain a single token "{0}" that will be dynamically replaced with the
* user's unique ID.
*
* @param searchFilter the search filter.
*/
public void setSearchFilter(String searchFilter) {
if (searchFilter == null || "".equals(searchFilter)) {
StringBuffer filter = new StringBuffer();
filter.append("(").append(usernameField).append("={0})");
this.searchFilter = filter.toString();
JiveGlobals.deleteXMLProperty("ldap.searchFilter");
}
else {
this.searchFilter = searchFilter;
JiveGlobals.setXMLProperty("ldap.searchFilter", searchFilter);
}
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ package org.jivesoftware.messenger.ldap;
import org.jivesoftware.messenger.user.*;
import org.jivesoftware.messenger.JiveGlobals;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.JiveConstants;
import javax.naming.directory.*;
import javax.naming.NamingEnumeration;
......@@ -21,6 +22,7 @@ import javax.naming.ldap.Control;
import javax.naming.ldap.SortControl;
import javax.naming.ldap.LdapContext;
import java.util.*;
import java.text.MessageFormat;
/**
* LDAP implementation of the UserProvider interface. All data in the directory is
......@@ -32,6 +34,8 @@ public class LdapUserProvider implements UserProvider {
private LdapManager manager;
private Map<String, String> searchFields;
private int userCount = -1;
private long expiresStamp = System.currentTimeMillis();
public LdapUserProvider() {
manager = LdapManager.getInstance();
......@@ -99,7 +103,10 @@ public class LdapUserProvider implements UserProvider {
}
public int getUserCount() {
// TODO: cache result for X minutes
// Cache user count for 5 minutes.
if (userCount != -1 && System.currentTimeMillis() < expiresStamp) {
return userCount;
}
int count = 0;
DirContext ctx = null;
try {
......@@ -108,7 +115,7 @@ public class LdapUserProvider implements UserProvider {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(new String[] { manager.getUsernameField() });
String filter = "(" + manager.getUsernameField() + "=*)";
String filter = MessageFormat.format(manager.getSearchFilter(), "*");
NamingEnumeration answer = ctx.search("", filter, constraints);
while (answer.hasMoreElements()) {
count++;
......@@ -122,6 +129,8 @@ public class LdapUserProvider implements UserProvider {
try { ctx.close(); }
catch (Exception ignored) { }
}
this.userCount = count;
this.expiresStamp = System.currentTimeMillis() + JiveConstants.MINUTE *5;
return count;
}
......@@ -140,9 +149,8 @@ public class LdapUserProvider implements UserProvider {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(new String[] { manager.getUsernameField() });
String filter = "(" + manager.getUsernameField() + "=*)";
String filter = MessageFormat.format(manager.getSearchFilter(), "*");
NamingEnumeration answer = ctx.search("", filter, constraints);
while (answer.hasMoreElements()) {
// Get the next userID.
usernames.add(
......@@ -192,7 +200,7 @@ public class LdapUserProvider implements UserProvider {
{
constraints.setCountLimit(startIndex+numResults);
}
String filter = "(" + manager.getUsernameField() + "=*)";
String filter = MessageFormat.format(manager.getSearchFilter(), "*");
NamingEnumeration answer = ctx.search("", filter, constraints);
// If client-side sorting is enabled, read in all results, sort, then get a sublist.
if (Boolean.valueOf(JiveGlobals.getXMLProperty(
......@@ -297,13 +305,16 @@ public class LdapUserProvider implements UserProvider {
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(new String[] { manager.getUsernameField() });
StringBuffer filter = new StringBuffer();
if (fields.size() > 1) {
filter.append("(|");
}
for (String field:fields) {
String attribute = searchFields.get(field);
if (filter.length() != 0) {
filter.append(" || ");
}
filter.append("(").append(attribute).append("=").append(query).append(")");
}
if (fields.size() > 1) {
filter.append(")");
}
NamingEnumeration answer = ctx.search("", filter.toString(), constraints);
while (answer.hasMoreElements()) {
// Get the next userID.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment