///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.ldap; import java.util.ArrayList; import java.util.List; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import org.apache.commons.lang.StringUtils; import org.projectforge.common.StringHelper; /** * @author Kai Reinhard (k.reinhard@micromata.de) */ public class LdapUtils { private static final String ATTRIBUTE_SEPARATOR_CHAR = ","; /** * Escapes the following characters: , (comma), = (equals), + (plus), < (less than), > (greater than), # (number sign), ; (semicolon), \ * (backslash), and " (quotation mark). * @param name * @return null if name is null otherwise the string name with escaped special characters. */ public static String escapeCommonName(final String name) { if (name == null) { return null; } final StringBuffer buf = new StringBuffer(name.length() + 5); for (int i = 0; i < name.length(); i++) { final char ch = name.charAt(i); if (",=+<>#;\\\"".indexOf(ch) >= 0) { buf.append("\\"); } buf.append(ch); } return buf.toString(); } public static String getOu(final String... organizationalUnits) { if (organizationalUnits == null) { return ""; } if (organizationalUnits.length == 1 && organizationalUnits[0] != null && organizationalUnits[0].startsWith("ou=") == true) { // organizationalUnit is already in the form ou=...,ou=.... Nothing to be done. return organizationalUnits[0]; } final StringBuffer buf = new StringBuffer(); buildOu(buf, null, organizationalUnits); return buf.toString(); } public static String getOu(final String ou, final String[] organizationalUnits) { final StringBuffer buf = new StringBuffer(); buildOu(buf, ou, organizationalUnits); return buf.toString(); } public static void buildOu(final StringBuffer buf, final String ou, final String[] organizationalUnits) { if (ou == null && organizationalUnits == null) { return; } boolean first = true; if (ou != null) { first = false; if (ou.startsWith("ou=") == false) { buf.append("ou="); } buf.append(ou); } for (final String unit : organizationalUnits) { if (unit == null) { continue; } if (first == true) { first = false; } else { buf.append(','); } if (unit.startsWith("ou=") == false) { buf.append("ou="); } buf.append(unit); } } public static void buildOu(final StringBuffer buf, final String... organizationalUnits) { buildOu(buf, null, organizationalUnits); } public static void appendOu(final StringBuffer buf, final String... organizationalUnits) { if (organizationalUnits == null) { return; } for (final String ou : organizationalUnits) { if (ou == null) { continue; } buf.append(','); if (ou.startsWith("ou=") == false) { buf.append("ou="); } buf.append(ou); } } public static String getOrganizationalUnit(final String dn) { if (dn == null || dn.indexOf("ou=") < 0) { return null; } final String[] entries = StringUtils.split(dn, ","); final StringBuffer buf = new StringBuffer(); boolean first = true; for (String entry : entries) { if (entry == null) { continue; } entry = entry.trim(); if (entry.startsWith("ou=") == false || entry.length() < 4) { continue; } if (first == true) { first = false; } else { buf.append(","); } buf.append(entry); } return buf.toString(); } public static String getOrganizationalUnit(final String dn, final String ouBase) { if (StringUtils.isNotBlank(ouBase) == true) { return getOrganizationalUnit(dn + "," + ouBase); } else { return getOrganizationalUnit(dn); } } public static Object getAttributeValue(final Attributes attributes, final String attrId) throws NamingException { final Attribute attr = attributes.get(attrId); if (attr == null) { return null; } return attr.get(); } public static String getAttributeStringValue(final Attributes attributes, final String attrId) throws NamingException { final Attribute attr = attributes.get(attrId); if (attr == null) { return null; } return (String) attr.get(); } public static String[] getAttributeStringValues(final Attributes attributes, final String attrId) throws NamingException { final Attribute attr = attributes.get(attrId); if (attr == null) { return null; } final NamingEnumeration< ? > enumeration = attr.getAll(); final List<String> list = new ArrayList<String>(); while (enumeration.hasMore() == true) { final Object attrValue = enumeration.next(); if (attrValue == null) { list.add(null); } list.add(String.valueOf(attrValue)); } return list.toArray(new String[list.size()]); } public static Integer getAttributeIntegerValue(final Attributes attributes, final String attrId) throws NamingException { final Attribute attr = attributes.get(attrId); if (attr == null) { return null; } return (Integer) attr.get(); } public static Attribute putAttribute(final Attributes attributes, final String attrId, final String attrValue) { final Attribute attr = attributes.get(attrId); if (attrValue == null) { return attr; } if (attr == null) { return attributes.put(attrId, attrValue); } attr.add(attrValue); return attr; } /** * "customers,users" -> "ou=customers,ou=users". * @param attrId * @param value * @return */ public static String splitMultipleAttribute(final String attrId, final String value) { if (value == null) { return null; } final int pos = value.indexOf(ATTRIBUTE_SEPARATOR_CHAR); if (pos < 0) { return attrId + "=" + value; } final String[] strs = StringHelper.splitAndTrim(value, ATTRIBUTE_SEPARATOR_CHAR); final StringBuffer buf = new StringBuffer(); boolean first = true; for (final String str : strs) { if (first == true) { first = false; } else { buf.append(", "); } buf.append(attrId).append('=').append(str); } return buf.toString(); } public static List<String> getMissedObjectClasses(final String[] expectedAdditionalObjectClasses, final String expectedObjectClass, final String[] objectClasses) { List<String> list = null; if (expectedObjectClass != null && (objectClasses == null || StringHelper.isIn(expectedObjectClass, objectClasses) == false)) { list = addEntry(list, expectedObjectClass); } if (expectedAdditionalObjectClasses != null) { for (final String objectClass : expectedAdditionalObjectClasses) { // objectClasses of users doesn't match the expected ones. if (objectClasses == null || StringHelper.isIn(objectClass, objectClasses) == false) { list = addEntry(list, objectClass); } } } return list; } private static List<String> addEntry(List<String> list, final String entry) { if (list == null) { list = new ArrayList<String>(); } list.add(entry); return list; } }