/*
* (C) Copyright 2006-2008 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*
* $Id$
*/
package org.nuxeo.ecm.directory.ldap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentModelList;
import org.nuxeo.ecm.directory.Session;
/**
* Tests for NXP-2461: Manage LDAP directories with missing entries for identifier field.
*
* @author Anahide Tchertchian
*/
public class TestLDAPSessionWithMissingId extends LDAPDirectoryTestCase {
protected static final String USER_SCHEMANAME = "user";
protected static final String GROUP_SCHEMANAME = "group";
@Override
@Before
public void setUp() throws Exception {
super.setUp();
// override default defs
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
runtimeHarness.deployContrib("org.nuxeo.ecm.directory.ldap.tests", EXTERNAL_SERVER_SETUP_OVERRIDE);
} else {
runtimeHarness.deployContrib("org.nuxeo.ecm.directory.ldap.tests", INTERNAL_SERVER_SETUP_OVERRIDE);
getLDAPDirectory("userDirectory").setTestServer(server);
getLDAPDirectory("groupDirectory").setTestServer(server);
}
}
@Override
@After
public void tearDown() throws Exception {
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
runtimeHarness.undeployContrib("org.nuxeo.ecm.directory.ldap.tests", EXTERNAL_SERVER_SETUP_OVERRIDE);
} else {
runtimeHarness.undeployContrib("org.nuxeo.ecm.directory.ldap.tests", INTERNAL_SERVER_SETUP_OVERRIDE);
}
super.tearDown();
}
// override tests to get specific use cases
@SuppressWarnings("unchecked")
@Test
public void testGetEntry() throws Exception {
try (Session session = getLDAPDirectory("userDirectory").getSession()) {
DocumentModel entry = session.getEntry("Administrator");
assertNull(entry);
entry = session.getEntry("ogrisel+Administrator@nuxeo.com");
assertEquals("ogrisel+Administrator@nuxeo.com", entry.getId());
assertEquals("Administrator", entry.getProperty(USER_SCHEMANAME, "username"));
assertEquals("Manager", entry.getProperty(USER_SCHEMANAME, "lastName"));
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
assertEquals(Long.valueOf(1), entry.getProperty(USER_SCHEMANAME, "intField"));
}
// assertNull(entry.getProperty(USER_SCHEMANAME, "sn"));
assertEquals("Administrator", entry.getProperty(USER_SCHEMANAME, "firstName"));
// assertNull(entry.getProperty(USER_SCHEMANAME, "givenName"));
// assertNull(entry.getProperty(USER_SCHEMANAME, "cn"));
assertNull(entry.getProperty(USER_SCHEMANAME, "password"));
// assertNull(entry.getProperty(USER_SCHEMANAME, "userPassword"));
List<String> val = (List<String>) entry.getProperty(USER_SCHEMANAME, "employeeType");
assertTrue(val.isEmpty());
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// LDAP references do not work with the internal test server
List<String> groups = (List<String>) entry.getProperty(USER_SCHEMANAME, "groups");
assertEquals(2, groups.size());
assertTrue(groups.contains("members"));
assertTrue(groups.contains("administrators"));
}
DocumentModel entry2 = session.getEntry("ogrisel+user1@nuxeo.com");
assertNotNull(entry2);
assertEquals("ogrisel+user1@nuxeo.com", entry2.getId());
assertEquals("user1", entry2.getProperty(USER_SCHEMANAME, "username"));
assertEquals("One", entry2.getProperty(USER_SCHEMANAME, "lastName"));
assertEquals("User", entry2.getProperty(USER_SCHEMANAME, "firstName"));
assertNull(entry2.getProperty(USER_SCHEMANAME, "password"));
// assertNull(entry2.getProperty(USER_SCHEMANAME, "userPassword"));
assertEquals(Arrays.asList("Boss"), entry2.getProperty(USER_SCHEMANAME, "employeeType"));
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// default value for missing attribute
assertEquals(Long.valueOf(0), entry2.getProperty(USER_SCHEMANAME, "intField"));
// LDAP references do not work with the internal test server
if (HAS_DYNGROUP_SCHEMA) {
assertEquals(Arrays.asList("dyngroup1", "dyngroup2", "members", "subgroup"),
entry2.getProperty(USER_SCHEMANAME, "groups"));
} else {
assertEquals(Arrays.asList("members", "subgroup"), entry2.getProperty(USER_SCHEMANAME, "groups"));
}
}
DocumentModel entry3 = session.getEntry("UnexistingEntry");
assertNull(entry3);
// test special character escaping
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// for some reason this do not work with the internal
// ApacheDS server (bug?)
DocumentModel entry4 = session.getEntry("Admi*");
assertNull(entry4);
DocumentModel entry5 = session.getEntry("");
assertNull(entry5);
DocumentModel entry6 = session.getEntry("(objectClass=*)");
assertNull(entry6);
}
}
}
@SuppressWarnings("unchecked")
@Test
public void testGetEntry2() {
try (Session session = getLDAPDirectory("groupDirectory").getSession()) {
DocumentModel entry = session.getEntry("administrators");
assertNotNull(entry);
assertEquals("administrators", entry.getId());
assertEquals("administrators", entry.getProperty(GROUP_SCHEMANAME, "groupname"));
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// LDAP references do not work with the internal test server
List<String> members = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "members");
assertNotNull(members);
assertEquals(1, members.size());
assertTrue(members.contains("ogrisel+Administrator@nuxeo.com"));
List<String> subGroups = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "subGroups");
assertNotNull(subGroups);
assertEquals(0, subGroups.size());
List<String> parentGroups = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "parentGroups");
assertNotNull(parentGroups);
assertEquals(0, parentGroups.size());
}
entry = session.getEntry("members");
assertNotNull(entry);
assertEquals("members", entry.getId());
assertEquals("members", entry.getProperty(GROUP_SCHEMANAME, "groupname"));
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// LDAP references do not work with the internal test server
List<String> members = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "members");
assertEquals(2, members.size());
assertTrue(members.contains("ogrisel+Administrator@nuxeo.com"));
assertTrue(members.contains("ogrisel+user1@nuxeo.com"));
List<String> subGroups = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "subGroups");
assertEquals(1, subGroups.size());
assertTrue(subGroups.contains("submembers"));
List<String> parentGroups = (List<String>) entry.getProperty(GROUP_SCHEMANAME, "parentGroups");
assertEquals(0, parentGroups.size());
}
entry = session.getEntry("submembers");
assertNotNull(entry);
assertEquals("submembers", entry.getId());
assertEquals("submembers", entry.getProperty(GROUP_SCHEMANAME, "groupname"));
if (USE_EXTERNAL_TEST_LDAP_SERVER) {
// LDAP references do not work with the internal test server
assertEquals(Arrays.asList(), entry.getProperty(GROUP_SCHEMANAME, "members"));
assertEquals(Arrays.asList(), entry.getProperty(GROUP_SCHEMANAME, "subGroups"));
if (HAS_DYNGROUP_SCHEMA) {
assertEquals(Arrays.asList("dyngroup1", "members"),
entry.getProperty(GROUP_SCHEMANAME, "parentGroups"));
} else {
assertEquals(Arrays.asList("members"), entry.getProperty(GROUP_SCHEMANAME, "parentGroups"));
}
}
}
}
@Test
public void testQuery1() {
try (Session session = getLDAPDirectory("userDirectory").getSession()) {
Map<String, Serializable> filter = new HashMap<>();
filter.put("username", "user");
Set<String> fulltext = new HashSet<>();
fulltext.add("username");
DocumentModelList entries = session.query(filter, fulltext);
assertNotNull(entries);
assertEquals(2, entries.size());
List<String> entryIds = new ArrayList<>();
for (DocumentModel entry : entries) {
entryIds.add(entry.getId());
}
Collections.sort(entryIds);
assertEquals("ogrisel+user1@nuxeo.com", entryIds.get(0));
assertEquals("ogrisel+user3@nuxeo.com", entryIds.get(1));
}
}
}