package com.constellio.app.modules.es.connectors.ldap;
import static com.constellio.app.modules.es.connectors.ldap.ConnectorLDAPServicesImpl.computeSearchFilter;
import static com.constellio.app.modules.es.connectors.ldap.ConnectorLDAPServicesImpl.getSimpleName;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import javax.naming.ldap.LdapContext;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.es.connectors.ldap.ConnectorLDAPServicesImpl.InvalidSearchFilterRuntimeException;
import com.constellio.model.conf.LDAPTestConfig;
import com.constellio.model.conf.ldap.RegexFilter;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.InternetTest;
@InternetTest
public class ConnectorLDAPServicesImplRealTest extends ConstellioTest {
ConnectorLDAPServices connectorLDAPServices;
@Before
public void setUp()
throws Exception {
connectorLDAPServices = new ConnectorLDAPServicesImpl();
}
private LdapContext getValidContext() {
String url = LDAPTestConfig.getUrls().get(0);
String user = LDAPTestConfig.getUser() + "@" + LDAPTestConfig.getDomains().get(0);
String password = LDAPTestConfig.getPassword();
Boolean followReferences = false;
boolean activeDirectory = true;
LdapContext ctx = connectorLDAPServices.connectToLDAP(url, user, password, followReferences, activeDirectory);
return ctx;
}
@Test
@InternetTest
public void whenConnectToLDAPThenOK()
throws Exception {
LdapContext ctx = getValidContext();
assertThat(ctx).isNotNull();
}
//TODO Fix @Test
public void whenTwoThreadsConnectToLDAPAtSameTimeThenOK()
throws Exception {
LDAPConnectionTask task1 = new LDAPConnectionTask();
LDAPConnectionTask task2 = new LDAPConnectionTask();
Timer timer = new Timer();
Date nowPlus1Second = LocalDateTime.now().plusSeconds(1).toDate();
timer.schedule(task1, nowPlus1Second);
timer.schedule(task2, nowPlus1Second);
Thread.sleep(1000 * 2);
assertThat(task1.getContext()).isNotNull();
assertThat(task2.getContext()).isNotNull();
}
@Test
@InternetTest
public void givenAContextWhenGetAllUsersThenOk()
throws Exception {
LdapContext ctx = getValidContext();
Set<String> usersIds = ((ConnectorLDAPServicesImpl) connectorLDAPServices)
.getAllObjectsUsingFilter(ctx, null, "(objectClass=person)",
"distinguishedName", "OU=Departement1,OU=doculibre,DC=test,DC=doculibre,DC=ca").getDocumentIds();
assertThat(usersIds.size()).isEqualTo(3001);
}
@Test
@InternetTest
public void whenGetAllUsersThenOk()
throws Exception {
LdapContext ctx = getValidContext();
String objectClass = "person";
String objectCategory = "user";
RegexFilter filter = null;
Set<String> usersIds = connectorLDAPServices
.getAllObjectsUsingFilter(ctx, objectClass, objectCategory, getContextWith3001Users(), filter).getDocumentIds();
assertThat(usersIds.size()).isEqualTo(3001);
}
@Test
@InternetTest
public void unitTestForConnectorLDAPServicesImpl()
throws Exception {
try {
computeSearchFilter("", "");
fail("invalid parameters");
} catch (InvalidSearchFilterRuntimeException e) {
//OK
String filter = computeSearchFilter("oCat", "oClaz");
assertThat(filter).isEqualTo("(&(objectCategory=oCat)(objectClass=oClaz))");
filter = computeSearchFilter("oCat", null);
assertThat(filter).isEqualTo("(objectCategory=oCat)");
filter = computeSearchFilter(null, "oClaz");
assertThat(filter).isEqualTo("(objectClass=oClaz)");
}
}
@Test
@InternetTest
public void whenGetUsersUsingFilterThenOnlyFilteredUsersAreReturned()
throws Exception {
LdapContext ctx = getValidContext();
String objectClass = "user";
String objectCategory = null;
RegexFilter filter = new RegexFilter("administrator", null);
Set<String> usersIds = connectorLDAPServices
.getAllObjectsUsingFilter(ctx, objectClass, objectCategory, getContextWithTestUsers(), filter).getDocumentIds();
assertThat(usersIds).containsOnly("CN=Administrator,CN=Users,DC=test,DC=doculibre,DC=ca");
}
@Test
@InternetTest
public void unitTest2ForConnectorLDAPServicesImpl()
throws Exception {
assertThat(getSimpleName("CN=admin,CN=users,DN=test")).isEqualTo("admin");
assertThat(getSimpleName("CN=admin, laura,CN=users,DN=test")).isEqualTo("admin, laura");
}
//TODO see avec cola
@Test
@InternetTest
public void whenGetObjectAttributesThenAllBasicADAttributesAreOk()
throws Exception {
LdapContext ctx = getValidContext();
String id = "CN=username0,OU=Departement1,OU=doculibre,DC=test,DC=doculibre,DC=ca";
LDAPObjectAttributes attributes = connectorLDAPServices.getObjectAttributes(ctx, id);
List<Object> altSecurityIdentities = attributes.get("altSecurityIdentities").getValue();
assertThat(altSecurityIdentities).containsOnly("secur2", "secur1");
String commonName = attributes.get("cn").getStringValue();
assertThat(commonName).isEqualTo("username0");
String displayName = attributes.get("displayName").getStringValue();
assertThat(displayName).isEqualTo("firstname0 f.n.0. lastname0");
String givenName = attributes.get("givenName").getStringValue();
assertThat(givenName).isEqualTo("firstname0");
String l = attributes.get("l").getStringValue();
assertThat(l).isEqualTo("city0");
String legacyExchangeDN = attributes.get("legacyExchangeDN").getStringValue();
assertThat(legacyExchangeDN).isEqualTo("lEDN0");
String mail = attributes.get("mail").getStringValue();
assertThat(mail).isEqualTo("username0@doculibre.com");
assertThat(attributes.get("mSMQDigests")).isNull();
String name = attributes.get("name").getStringValue();
assertThat(name).isEqualTo("username0");
String objectCategory = attributes.get("objectCategory").getStringValue();
assertThat(objectCategory).isEqualTo("CN=Person,CN=Schema,CN=Configuration,DC=test,DC=doculibre,DC=ca");
String primaryGroupID = attributes.get("primaryGroupID").getStringValue();
assertThat(primaryGroupID).isEqualTo("513");
String sAMAccountName = attributes.get("sAMAccountName").getStringValue();
assertThat(sAMAccountName).isEqualTo("username0");
String sAMAccountType = attributes.get("sAMAccountType").getStringValue();
assertThat(sAMAccountType).isEqualTo("805306368");
Object sIDHistory = attributes.get("sIDHistory");
assertThat(sIDHistory).isNull();
assertThat(attributes.get("servicePrincipalName")).isNull();
String surname = attributes.get("sn").getStringValue();
assertThat(surname).isEqualTo("lastname0");
String userAccountControl = attributes.get("userAccountControl").getStringValue();
assertThat(userAccountControl).isEqualTo("514");
String userPrincipalName = attributes.get("userPrincipalName").getStringValue();
assertThat(userPrincipalName).isEqualTo("principalname0");
//TODO fixer
String objectGuid = attributes.get("objectGUID").getStringValue();
//assertThat(objectGuid).isEqualTo(("4F 92 A8 C7 AA 66 E6 4A AD D4 05 D8 A4 1A 38 85"));
byte[] objectSid = attributes.get("objectSid").getByteValue();
//assertThat(objectSid).isEqualTo(("1 5 0 0 0 0 0 5 21 0 0 0 51 DD 04 D0 63 52 CE 14 3A 1A 26 7B 80 04 00 00"));
//TODO a tester servicePrincipalName, sIDHistory
//TODO trouver
/*String uNCName = attributes.get("uNC-Name").getStringValue();
assertThat(uNCName).isEqualTo("");
List<String> keywords = (List<String>) attributes.get("keywords").getValue();
assertThat(keywords).containsOnly("");
String groupType = attributes.get("group-Type").getStringValue();
assertThat(groupType).isEqualTo("");
String lDAPDisplayName = attributes.get("lDAP-Display-Name").getStringValue();
assertThat(lDAPDisplayName).isEqualTo("");
String location = attributes.get("location").getStringValue();
assertThat(location).isEqualTo("");
String mSMQLabel = attributes.get("mSMQ-Label").getStringValue();
assertThat(mSMQLabel).isEqualTo("");
String mSMQOwnerID = attributes.get("mSMQ-Owner-ID").getStringValue();
assertThat(mSMQOwnerID).isEqualTo("");
String mSMQQueueType = attributes.get("mSMQ-Queue-Type").getStringValue();
assertThat(mSMQQueueType).isEqualTo("");
String mSSQLAlias = attributes.get("mS-SQL-Alias").getStringValue();
assertThat(mSSQLAlias).isEqualTo("");
String mSSQLDatabase = attributes.get("mS-SQL-Database").getStringValue();
assertThat(mSSQLDatabase).isEqualTo("");
String mSSQLName = attributes.get("mS-SQL-Name").getStringValue();
assertThat(mSSQLName).isEqualTo("");
String mSSQLVersion = attributes.get("mS-SQL-Version").getStringValue();
assertThat(mSSQLVersion).isEqualTo("");
String netbootGUID = attributes.get("netboot-GUID").getStringValue();
assertThat(netbootGUID).isEqualTo("");
String organizationalUnitName = attributes.get("organizational-Unit-Name").getStringValue();
assertThat(organizationalUnitName).isEqualTo("");*/
}
private class LDAPConnectionTask extends TimerTask {
LdapContext ctx;
@Override
public void run() {
ctx = getValidContext();
}
public LdapContext getContext() {
return ctx;
}
}
private Set<String> getContextWith3001Users() {
return new HashSet<>(Arrays.asList("OU=Departement1,OU=doculibre,DC=test,DC=doculibre,DC=ca"));
}
private Set<String> getContextWithTestUsers() {
return new HashSet<>(Arrays.asList("CN=Users,DC=test,DC=doculibre,DC=ca"));
}
}