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);
}
}