package net.sf.lab3f.ldap; import java.io.FileInputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.Vector; import com.novell.ldap.LDAPAttribute; import com.novell.ldap.LDAPAttributeSet; import com.novell.ldap.LDAPConnection; import com.novell.ldap.LDAPEntry; import com.novell.ldap.LDAPException; import com.novell.ldap.LDAPMessage; import com.novell.ldap.LDAPModification; import com.novell.ldap.LDAPSearchQueue; import com.novell.ldap.LDAPSearchResult; import com.novell.ldap.LDAPSearchResultReference; import com.novell.ldap.LDAPResponseQueue; import com.novell.ldap.util.Base64; public class Main implements Ldapable{ private LDAPConnection conn; private Properties props = new Properties(); public void stop () throws Exception{ conn.disconnect(); } public void start () throws Exception{ props.load(new FileInputStream("conf/ldap.properties")); conn = new LDAPConnection(); conn.connect("localhost", 389); conn.bind(LDAPConnection.LDAP_V3, props.getProperty("admin"), props.getProperty("passwd").getBytes()); System.out.println("[INFO] LDAP connection established"); } public boolean add(String dn, Map <String, String[]> params){ if(conn == null) return false; try{ Vector <LDAPAttribute> v = new Vector <LDAPAttribute> (); LDAPAttributeSet attrs = new LDAPAttributeSet(); Set <String> keys = params.keySet(); Iterator <String> iter = keys.iterator(); while(iter.hasNext()){ String key = iter.next(); LDAPAttribute attr = new LDAPAttribute(key); for(String s : params.get(key))attr.addValue(s); LDAPModification mod = new LDAPModification(LDAPModification.ADD, attr); v.add(attr); } attrs.addAll(v); LDAPEntry ent = new LDAPEntry(dn, attrs); conn.add(ent, (LDAPResponseQueue)null); return true; } catch(LDAPException ex){System.out.println(ex);return false;} } public boolean delete(String dn){ if(conn == null) return false; try{ conn.delete(dn, (LDAPResponseQueue)null); return true; } catch(LDAPException ex){System.out.println(ex);return false;} } public boolean modify(String dn, Map <String, String[]> params){ if(conn == null) return false; try{ Vector <LDAPModification> v = new Vector <LDAPModification> (); Set <String> keys = params.keySet(); Iterator <String> iter = keys.iterator(); while(iter.hasNext()){ String key = iter.next(); LDAPAttribute attr = new LDAPAttribute(key); for(String s : params.get(key))attr.addValue(s); LDAPModification mod = new LDAPModification(LDAPModification.REPLACE, attr); v.add(mod); } conn.modify(dn, v.toArray(new LDAPModification[]{}), (LDAPResponseQueue)null); return true; } catch(LDAPException ex){System.out.println(ex);return false;} } public Map <String, Map<String, String[]>> searchOne(String searchBase, String searchFilter, String[] attrs){ return search(searchBase, LDAPConnection.SCOPE_ONE, searchFilter, attrs); } public Map <String, Map<String, String[]>> searchSub(String searchBase, String searchFilter, String[] attrs){ return search(searchBase, LDAPConnection.SCOPE_SUB, searchFilter, attrs); } public Map <String, Map<String, String[]>> searchBase(String searchBase, String searchFilter, String[] attrs){ return search(searchBase, LDAPConnection.SCOPE_BASE, searchFilter, attrs); } private Map <String, Map<String, String[]>> search(String searchBase, int scope, String searchFilter, String[] attrs){ try{ LDAPSearchQueue queue = conn.search(searchBase, scope, searchFilter, attrs, false, (LDAPSearchQueue)null); //, (LDAPSearchConstraints)null); LDAPMessage message = null; Map <String, Map<String, String[]>> replay = new HashMap <String, Map<String, String[]>>(); while((message = queue.getResponse()) != null ){ if(!(message instanceof LDAPSearchResult)) continue; LDAPEntry entry = ((LDAPSearchResult)message).getEntry(); LDAPAttributeSet attributeSet = entry.getAttributeSet(); Iterator allAttributes = attributeSet.iterator(); Map <String, String[]> attrsMap = new HashMap <String, String[]> (); attrsMap.put("dn", new String[]{entry.getDN()}); while(allAttributes.hasNext()){ LDAPAttribute attribute = (LDAPAttribute)allAttributes.next(); String attributeName = attribute.getName(); Vector <String> v = new Vector <String> (); Enumeration allValues = attribute.getStringValues(); if(allValues == null) continue; while(allValues.hasMoreElements()) v.add((String) allValues.nextElement()); attrsMap.put(attributeName, v.toArray(new String[]{})); replay.put(entry.getDN(), attrsMap); } } return replay.size() == 0 ? null : replay; } catch(LDAPException ex){System.out.println(ex);return null;} } public String encodeB64(String s){ if(Base64.isLDIFSafe(s))return " " + s; return ": " + Base64.encode(s); } }