import javax.naming.InvalidNameException;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import org.apache.commons.logging.LogFactory;
import org.argeo.ArgeoException;
import org.osgi.framework.Filter;
-import org.osgi.service.useradmin.User;
/**
* A user admin based on a LDAP server. Requires a {@link TransactionManager}
"com.sun.jndi.ldap.LdapCtxFactory");
connEnv.put(Context.PROVIDER_URL, getUri().toString());
connEnv.put("java.naming.ldap.attributes.binary",
- LdifName.userpassword.name());
+ LdifName.userPassword.name());
initialLdapContext = new InitialLdapContext(connEnv, null);
// StartTlsResponse tls = (StartTlsResponse) ctx
+ name);
return res;
} catch (NamingException e) {
- throw new UserDirectoryException("Cannot get role for " + name, e);
+ return null;
}
}
@Override
protected List<DirectoryUser> doGetRoles(Filter f) {
- // TODO Auto-generated method stub
try {
String searchFilter = f != null ? f.toString() : "(|("
+ objectClass + "=" + getUserObjectClass() + ")("
searchBase, searchFilter, searchControls);
ArrayList<DirectoryUser> res = new ArrayList<DirectoryUser>();
- while (results.hasMoreElements()) {
+ results: while (results.hasMoreElements()) {
SearchResult searchResult = results.next();
Attributes attrs = searchResult.getAttributes();
+ Attribute objectClassAttr = attrs.get(objectClass.name());
+ LdapName dn = toDn(searchBase, searchResult);
LdifUser role;
- if (attrs.get(objectClass.name()).contains(
- getGroupObjectClass()))
- role = new LdifGroup(this, toDn(searchBase, searchResult),
- attrs);
- else if (attrs.get(objectClass.name()).contains(
- getUserObjectClass()))
- role = new LdifUser(this, toDn(searchBase, searchResult),
- attrs);
- else
- throw new UserDirectoryException(
- "Unsupported LDAP type for "
- + searchResult.getName());
+ if (objectClassAttr.contains(getGroupObjectClass()))
+ role = new LdifGroup(this, dn, attrs);
+ else if (objectClassAttr.contains(getUserObjectClass()))
+ role = new LdifUser(this, dn, attrs);
+ else {
+ log.warn("Unsupported LDAP type for "
+ + searchResult.getName());
+ continue results;
+ }
res.add(role);
}
return res;
}
}
- @Override
- protected void doGetUser(String key, String value,
- List<DirectoryUser> collectedUsers) {
- try {
- String searchFilter = "(&(" + objectClass + "="
- + getUserObjectClass() + ")(" + key + "=" + value + "))";
-
- SearchControls searchControls = new SearchControls();
- searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-
- String searchBase = getBaseDn();
- NamingEnumeration<SearchResult> results = getLdapContext().search(
- searchBase, searchFilter, searchControls);
-
- SearchResult searchResult = null;
- if (results.hasMoreElements()) {
- searchResult = (SearchResult) results.nextElement();
- if (results.hasMoreElements())
- searchResult = null;
- }
- if (searchResult != null)
- collectedUsers.add(new LdifUser(this, toDn(searchBase,
- searchResult), searchResult.getAttributes()));
- } catch (Exception e) {
- throw new UserDirectoryException("Cannot get user with " + key
- + "=" + value, e);
- }
-
- }
-
private LdapName toDn(String baseDn, Binding binding)
throws InvalidNameException {
return new LdapName(binding.isRelative() ? binding.getName() + ","
}
@Override
- protected List<DirectoryGroup> getDirectGroups(User user) {
- List<DirectoryGroup> directGroups = new ArrayList<DirectoryGroup>();
+ protected List<LdapName> getDirectGroups(LdapName dn) {
+ List<LdapName> directGroups = new ArrayList<LdapName>();
try {
String searchFilter = "(&(" + objectClass + "="
+ getGroupObjectClass() + ")(" + getMemberAttributeId()
- + "=" + user.getName() + "))";
+ + "=" + dn + "))";
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
while (results.hasMoreElements()) {
SearchResult searchResult = (SearchResult) results
.nextElement();
- LdifGroup group = new LdifGroup(this, toDn(searchBase,
- searchResult), searchResult.getAttributes());
- directGroups.add(group);
+ directGroups.add(toDn(searchBase, searchResult));
}
return directGroups;
} catch (Exception e) {
- throw new ArgeoException("Cannot populate direct members of "
- + user, e);
+ throw new ArgeoException("Cannot populate direct members of " + dn,
+ e);
}
}
@Override
- protected void prepare(WorkingCopy wc) {
+ protected void prepare(UserDirectoryWorkingCopy wc) {
try {
getLdapContext().reconnect(getLdapContext().getConnectControls());
// delete
}
// add
for (LdapName dn : wc.getNewUsers().keySet()) {
- if (!entryExists(dn))
+ if (entryExists(dn))
throw new UserDirectoryException("User to create found "
+ dn);
}
}
@Override
- protected void commit(WorkingCopy wc) {
+ protected void commit(UserDirectoryWorkingCopy wc) {
try {
// delete
for (LdapName dn : wc.getDeletedUsers().keySet()) {
}
@Override
- protected void rollback(WorkingCopy wc) {
+ protected void rollback(UserDirectoryWorkingCopy wc) {
// prepare not impacting
}