package com.constellio.app.modules.es.connectors.ldap;
import static java.util.Arrays.asList;
import java.sql.Time;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NameClassPair;
import javax.naming.NameParser;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.ExtendedRequest;
import javax.naming.ldap.ExtendedResponse;
import javax.naming.ldap.LdapContext;
import org.joda.time.LocalDate;
import com.constellio.app.modules.es.model.connectors.ldap.enums.DirectoryType;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.conf.ldap.RegexFilter;
public class TestLDAPServices implements ConnectorLDAPServices {
Set<String> firstFetchIds = new HashSet<>(asList("id1", "id2", "id3"));
Set<String> subsequentFetchIds = new HashSet<>(asList("id1", "id2", "id4"));
final LocalDate now;
private boolean throwException;
private boolean errorDuringFirstSearch = false;
public TestLDAPServices(LocalDate now) {
this.now = now;
}
@Override
public ConnectorLDAPSearchResult getAllObjectsUsingFilter(LdapContext ctx, String objectClass, String objectCategory,
Set<String> contexts,
RegexFilter filter) {
if (throwException) {
throw new RuntimeException("test exception");
}
if (TimeProvider.getLocalDate().equals(now)) {
return new ConnectorLDAPSearchResult().setDocumentIds(firstFetchIds).setErrorDuringSearch(errorDuringFirstSearch);
} else {
return new ConnectorLDAPSearchResult().setDocumentIds(subsequentFetchIds).setErrorDuringSearch(
errorDuringFirstSearch);
}
}
@Override
public Map<String, LDAPObjectAttributes> getObjectsAttributes(LdapContext ctx, Set<String> objectsIds) {
if (throwException) {
throw new RuntimeException("test exception");
}
Map<String, LDAPObjectAttributes> returnMap = new HashMap<>();
for (String objectId : objectsIds) {
returnMap.put(objectId, getObjectAttributes(ctx, objectId));
}
return returnMap;
}
@Override
public LDAPObjectAttributes getObjectAttributes(LdapContext ctx, String id) {
if (throwException) {
throw new RuntimeException("test exception");
}
LDAPObjectAttributes returnAttributes = new LDAPObjectAttributes();
String suffix;
if (TimeProvider.getLocalDate().equals(now)) {
suffix = "";
} else {
suffix = "_";
}
returnAttributes.addAttribute("title", new LDAPObjectAttribute().setValue("title" + id + suffix));
returnAttributes.addAttribute("mail", new LDAPObjectAttribute().setValue("mail" + id + suffix));
returnAttributes.addAttribute("distinguishedName", new LDAPObjectAttribute().setValue(id));
return returnAttributes;
}
@Override
public LdapContext connectToLDAP(String url, String user, String password, Boolean followReferences,
boolean activeDirectory) {
if (throwException) {
throw new RuntimeException("test exception");
}
return new FakeLdapContext();
}
@Override
public boolean isObjectEnabled(LDAPObjectAttributes object, DirectoryType directoryType) {
return true;
}
public void setThrowExceptionWhenCommunicatingWithLdap(boolean throwException) {
this.throwException = throwException;
}
public void setErrorWhenFetchingRemoteIds(boolean errorDuringFirstSearch) {
this.errorDuringFirstSearch = errorDuringFirstSearch;
}
private class FakeLdapContext implements LdapContext {
@Override
public ExtendedResponse extendedOperation(ExtendedRequest request)
throws NamingException {
return null;
}
@Override
public LdapContext newInstance(Control[] requestControls)
throws NamingException {
return null;
}
@Override
public void reconnect(Control[] connCtls)
throws NamingException {
}
@Override
public Control[] getConnectControls()
throws NamingException {
return new Control[0];
}
@Override
public void setRequestControls(Control[] requestControls)
throws NamingException {
}
@Override
public Control[] getRequestControls()
throws NamingException {
return new Control[0];
}
@Override
public Control[] getResponseControls()
throws NamingException {
return new Control[0];
}
@Override
public Attributes getAttributes(Name name)
throws NamingException {
return null;
}
@Override
public Attributes getAttributes(String name)
throws NamingException {
return null;
}
@Override
public Attributes getAttributes(Name name, String[] attrIds)
throws NamingException {
return null;
}
@Override
public Attributes getAttributes(String name, String[] attrIds)
throws NamingException {
return null;
}
@Override
public void modifyAttributes(Name name, int mod_op, Attributes attrs)
throws NamingException {
}
@Override
public void modifyAttributes(String name, int mod_op, Attributes attrs)
throws NamingException {
}
@Override
public void modifyAttributes(Name name, ModificationItem[] mods)
throws NamingException {
}
@Override
public void modifyAttributes(String name, ModificationItem[] mods)
throws NamingException {
}
@Override
public void bind(Name name, Object obj, Attributes attrs)
throws NamingException {
}
@Override
public void bind(String name, Object obj, Attributes attrs)
throws NamingException {
}
@Override
public void rebind(Name name, Object obj, Attributes attrs)
throws NamingException {
}
@Override
public void rebind(String name, Object obj, Attributes attrs)
throws NamingException {
}
@Override
public DirContext createSubcontext(Name name, Attributes attrs)
throws NamingException {
return null;
}
@Override
public DirContext createSubcontext(String name, Attributes attrs)
throws NamingException {
return null;
}
@Override
public DirContext getSchema(Name name)
throws NamingException {
return null;
}
@Override
public DirContext getSchema(String name)
throws NamingException {
return null;
}
@Override
public DirContext getSchemaClassDefinition(Name name)
throws NamingException {
return null;
}
@Override
public DirContext getSchemaClassDefinition(String name)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes, String[] attributesToReturn)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(String name, Attributes matchingAttributes, String[] attributesToReturn)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(String name, Attributes matchingAttributes)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(Name name, String filter, SearchControls cons)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls cons)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<SearchResult> search(String name, String filterExpr, Object[] filterArgs, SearchControls cons)
throws NamingException {
return null;
}
@Override
public Object lookup(Name name)
throws NamingException {
return null;
}
@Override
public Object lookup(String name)
throws NamingException {
return null;
}
@Override
public void bind(Name name, Object obj)
throws NamingException {
}
@Override
public void bind(String name, Object obj)
throws NamingException {
}
@Override
public void rebind(Name name, Object obj)
throws NamingException {
}
@Override
public void rebind(String name, Object obj)
throws NamingException {
}
@Override
public void unbind(Name name)
throws NamingException {
}
@Override
public void unbind(String name)
throws NamingException {
}
@Override
public void rename(Name oldName, Name newName)
throws NamingException {
}
@Override
public void rename(String oldName, String newName)
throws NamingException {
}
@Override
public NamingEnumeration<NameClassPair> list(Name name)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<NameClassPair> list(String name)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<Binding> listBindings(Name name)
throws NamingException {
return null;
}
@Override
public NamingEnumeration<Binding> listBindings(String name)
throws NamingException {
return null;
}
@Override
public void destroySubcontext(Name name)
throws NamingException {
}
@Override
public void destroySubcontext(String name)
throws NamingException {
}
@Override
public Context createSubcontext(Name name)
throws NamingException {
return null;
}
@Override
public Context createSubcontext(String name)
throws NamingException {
return null;
}
@Override
public Object lookupLink(Name name)
throws NamingException {
return null;
}
@Override
public Object lookupLink(String name)
throws NamingException {
return null;
}
@Override
public NameParser getNameParser(Name name)
throws NamingException {
return null;
}
@Override
public NameParser getNameParser(String name)
throws NamingException {
return null;
}
@Override
public Name composeName(Name name, Name prefix)
throws NamingException {
return null;
}
@Override
public String composeName(String name, String prefix)
throws NamingException {
return null;
}
@Override
public Object addToEnvironment(String propName, Object propVal)
throws NamingException {
return null;
}
@Override
public Object removeFromEnvironment(String propName)
throws NamingException {
return null;
}
@Override
public Hashtable<?, ?> getEnvironment()
throws NamingException {
return null;
}
@Override
public void close()
throws NamingException {
}
@Override
public String getNameInNamespace()
throws NamingException {
return null;
}
}
}