package org.josso.atlassian.seraph; import com.atlassian.crowd.embedded.api.CrowdDirectoryService; import com.atlassian.crowd.embedded.api.Directory; import org.apache.log4j.Logger; import org.josso.gateway.SSONameValuePair; import org.josso.gateway.identity.SSOUser; import java.util.*; /** * @author <a href=mailto:sgonzalez@atricore.org>Sebastian Gonzalez Oyuela</a> */ public class DnBasedCrowdDirectorySelector extends AbstractCrowdDirectorySelectorStrategy { private static final Logger logger = Logger.getLogger(DnBasedCrowdDirectorySelector.class); private String dnUserProperty; private Map<String, String> dirsByDn = new HashMap<String, String>(); public DnBasedCrowdDirectorySelector(Map<String, String> initParams, CrowdDirectoryService directoryService) { super(initParams, directoryService); String str = initParams.get("directory.dn.map"); dnUserProperty = initParams.get("user.dn.property"); if (dnUserProperty == null) dnUserProperty = "josso_user_dn"; StringTokenizer st = new StringTokenizer(str, ";", false); while (st.hasMoreTokens()) { String nvPair = st.nextToken(); int split = nvPair.indexOf(':'); String dn = nvPair.substring(0, split); String dirName = nvPair.substring(split + 1); logger.info("Configuring base DN ["+dn+"] for Directory ["+dirName+"]"); dirsByDn.put(dn, dirName); } } public Directory lookupDirectory(SSOUser user) { String directoryName = getDirectoryNameForUser(user); List<Directory> all = getDirectoryService().findAllDirectories(); for (int i = 0; i < all.size(); i++) { Directory directory = all.get(i); if (directoryName.equals(directory.getName())) { logger.debug("Crowd User Directory ["+directory.getId()+"/"+directory.getName()+"] found for ["+user.getName()+"]"); return directory; } } logger.error("No Crowd User Directory found for ["+user.getName()+"]"); return null; } protected String getDirectoryNameForUser(SSOUser user) { SSONameValuePair[] props = user.getProperties(); String dn = null; for (SSONameValuePair prop : props) { if (prop.getName().equalsIgnoreCase(dnUserProperty)) { dn = prop.getValue(); break; } } if (dn == null) { logger.error("SSOUser does not have property " + dnUserProperty); return null; } // Match DN with dir name, i.e. dc=my-domain,dc=com:dirname; for (String baseDn : dirsByDn.keySet()) { logger.error("[" + dn + "] ["+baseDn+"]"); if (dn.endsWith(baseDn)) { String dirName = dirsByDn.get(baseDn); logger.error("Found configured base DN ["+baseDn+"]for user ["+user.getName()+"], using directory ["+dirName+"]"); return dirName; } } logger.error("No based DN found for user DN ["+dn+"]"); return null; } }