TSK-1024: Add tests for ldapclient
This commit is contained in:
parent
dbe17fff57
commit
08571e7216
3
pom.xml
3
pom.xml
|
@ -75,6 +75,9 @@
|
||||||
<version.archunit>0.13.0</version.archunit>
|
<version.archunit>0.13.0</version.archunit>
|
||||||
<version.mockito>3.2.4</version.mockito>
|
<version.mockito>3.2.4</version.mockito>
|
||||||
<version.junit.mockito>3.2.4</version.junit.mockito>
|
<version.junit.mockito>3.2.4</version.junit.mockito>
|
||||||
|
<!-- byte buddy 1.9.7+ is needed to solve dependency errors with spring mock tests see LdapClientTest -->
|
||||||
|
<version.byte-buddy>1.9.7</version.byte-buddy>
|
||||||
|
<version.byte-buddy-agent>1.9.7</version.byte-buddy-agent>
|
||||||
<version.powermock>2.0.5</version.powermock>
|
<version.powermock>2.0.5</version.powermock>
|
||||||
<version.hamcrest>2.2</version.hamcrest>
|
<version.hamcrest>2.2</version.hamcrest>
|
||||||
<version.equalsverifier>3.1.12</version.equalsverifier>
|
<version.equalsverifier>3.1.12</version.equalsverifier>
|
||||||
|
|
|
@ -139,6 +139,30 @@
|
||||||
<version>${version.spring.restdocs}</version>
|
<version>${version.spring.restdocs}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<version>${version.mockito}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-junit-jupiter</artifactId>
|
||||||
|
<version>${version.junit.mockito}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.bytebuddy</groupId>
|
||||||
|
<artifactId>byte-buddy</artifactId>
|
||||||
|
<version>${version.byte-buddy}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.bytebuddy</groupId>
|
||||||
|
<artifactId>byte-buddy-agent</artifactId>
|
||||||
|
<version>${version.byte-buddy-agent}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package pro.taskana.ldap;
|
package pro.taskana.ldap;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.naming.directory.SearchControls;
|
import javax.naming.directory.SearchControls;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -64,6 +65,8 @@ public class LdapClient {
|
||||||
|
|
||||||
private String groupsOfUser;
|
private String groupsOfUser;
|
||||||
|
|
||||||
|
private String baseDn;
|
||||||
|
|
||||||
private int minSearchForLength;
|
private int minSearchForLength;
|
||||||
|
|
||||||
private int maxNumberOfReturnedAccessIds;
|
private int maxNumberOfReturnedAccessIds;
|
||||||
|
@ -182,16 +185,22 @@ public class LdapClient {
|
||||||
throw new SystemException(
|
throw new SystemException(
|
||||||
"LdapClient was called but is not active due to missing configuration: " + message);
|
"LdapClient was called but is not active due to missing configuration: " + message);
|
||||||
}
|
}
|
||||||
|
// Obviously Spring LdapTemplate does have a inconsistency and always adds the base name to the
|
||||||
|
// given DN.
|
||||||
|
// https://stackoverflow.com/questions/55285743/spring-ldaptemplate-how-to-lookup-fully-qualified-dn-with-configured-base-dn
|
||||||
|
// Therefore we have to remove the base name from the dn before performing the lookup
|
||||||
|
// (?i) --> case insensitive replacement
|
||||||
|
String nameWithoutBaseDn = name.replaceAll("(?i)" + Pattern.quote("," + baseDn), "");
|
||||||
|
LOGGER.debug(
|
||||||
|
"Removes baseDN {} from given DN. New DN to be used: {}", baseDn, nameWithoutBaseDn);
|
||||||
String[] groupAttributesToReturn;
|
String[] groupAttributesToReturn;
|
||||||
if (CN.equals(groupNameAttribute)) {
|
if (CN.equals(groupNameAttribute)) {
|
||||||
groupAttributesToReturn = new String[] {CN};
|
groupAttributesToReturn = new String[] {CN};
|
||||||
} else {
|
} else {
|
||||||
groupAttributesToReturn = new String[] {getGroupNameAttribute(), CN};
|
groupAttributesToReturn = new String[] {getGroupNameAttribute(), CN};
|
||||||
}
|
}
|
||||||
|
|
||||||
final AccessIdResource accessId =
|
final AccessIdResource accessId =
|
||||||
ldapTemplate.lookup(name, groupAttributesToReturn, new GroupContextMapper());
|
ldapTemplate.lookup(nameWithoutBaseDn, groupAttributesToReturn, new GroupContextMapper());
|
||||||
LOGGER.debug("Exit from searchGroupByDn. Retrieved the following group: {}", accessId);
|
LOGGER.debug("Exit from searchGroupByDn. Retrieved the following group: {}", accessId);
|
||||||
return accessId;
|
return accessId;
|
||||||
}
|
}
|
||||||
|
@ -261,6 +270,10 @@ public class LdapClient {
|
||||||
return env.getProperty("taskana.ldap.groupSearchBase");
|
return env.getProperty("taskana.ldap.groupSearchBase");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getBaseDn() {
|
||||||
|
return env.getProperty("taskana.ldap.baseDn");
|
||||||
|
}
|
||||||
|
|
||||||
public String getGroupSearchFilterName() {
|
public String getGroupSearchFilterName() {
|
||||||
return env.getProperty("taskana.ldap.groupSearchFilterName");
|
return env.getProperty("taskana.ldap.groupSearchFilterName");
|
||||||
}
|
}
|
||||||
|
@ -298,7 +311,7 @@ public class LdapClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
private void init() {
|
void init() {
|
||||||
LOGGER.debug("Entry to init()");
|
LOGGER.debug("Entry to init()");
|
||||||
String strMinSearchForLength = getMinSearchForLengthAsString();
|
String strMinSearchForLength = getMinSearchForLengthAsString();
|
||||||
if (strMinSearchForLength == null || strMinSearchForLength.isEmpty()) {
|
if (strMinSearchForLength == null || strMinSearchForLength.isEmpty()) {
|
||||||
|
@ -326,6 +339,7 @@ public class LdapClient {
|
||||||
groupSearchFilterValue = getGroupSearchFilterValue();
|
groupSearchFilterValue = getGroupSearchFilterValue();
|
||||||
groupNameAttribute = getGroupNameAttribute();
|
groupNameAttribute = getGroupNameAttribute();
|
||||||
groupsOfUser = getGroupsOfUser();
|
groupsOfUser = getGroupsOfUser();
|
||||||
|
baseDn = getBaseDn();
|
||||||
|
|
||||||
ldapTemplate.setDefaultCountLimit(maxNumberOfReturnedAccessIds);
|
ldapTemplate.setDefaultCountLimit(maxNumberOfReturnedAccessIds);
|
||||||
|
|
||||||
|
@ -364,6 +378,9 @@ public class LdapClient {
|
||||||
if (groupsOfUser == null) {
|
if (groupsOfUser == null) {
|
||||||
message += " taskana.ldap.groupsOfUser is not configured.";
|
message += " taskana.ldap.groupsOfUser is not configured.";
|
||||||
}
|
}
|
||||||
|
if (baseDn == null) {
|
||||||
|
message += " taskana.ldap.baseDn is not configured.";
|
||||||
|
}
|
||||||
if (!message.equals(emptyMessage)) {
|
if (!message.equals(emptyMessage)) {
|
||||||
throw new SystemException(message);
|
throw new SystemException(message);
|
||||||
}
|
}
|
||||||
|
@ -383,7 +400,7 @@ public class LdapClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Context Mapper for user entries. */
|
/** Context Mapper for user entries. */
|
||||||
private class UserContextMapper extends AbstractContextMapper<AccessIdResource> {
|
class UserContextMapper extends AbstractContextMapper<AccessIdResource> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AccessIdResource doMapFromContext(final DirContextOperations context) {
|
public AccessIdResource doMapFromContext(final DirContextOperations context) {
|
||||||
|
@ -397,7 +414,7 @@ public class LdapClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Context Mapper for user entries. */
|
/** Context Mapper for user entries. */
|
||||||
private class GroupContextMapper extends AbstractContextMapper<AccessIdResource> {
|
class GroupContextMapper extends AbstractContextMapper<AccessIdResource> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AccessIdResource doMapFromContext(final DirContextOperations context) {
|
public AccessIdResource doMapFromContext(final DirContextOperations context) {
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package pro.taskana.ldap;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.lenient;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.jupiter.MockitoSettings;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.ldap.core.LdapTemplate;
|
||||||
|
|
||||||
|
@MockitoSettings
|
||||||
|
class LdapClientTest {
|
||||||
|
|
||||||
|
@Mock Environment environment;
|
||||||
|
|
||||||
|
@Mock LdapTemplate ldapTemplate;
|
||||||
|
|
||||||
|
@InjectMocks LdapClient cut;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testLdap() {
|
||||||
|
|
||||||
|
setUpEnvMock();
|
||||||
|
cut.init();
|
||||||
|
|
||||||
|
cut.searchGroupByDn("cn=developersgroup,ou=groups,o=taskanatest");
|
||||||
|
|
||||||
|
verify(ldapTemplate)
|
||||||
|
.lookup(
|
||||||
|
eq("cn=developersgroup,ou=groups"), any(), any(LdapClient.GroupContextMapper.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpEnvMock() {
|
||||||
|
Stream.of(
|
||||||
|
new String[][] {
|
||||||
|
{"taskana.ldap.useLdap", "true"},
|
||||||
|
{"taskana.ldap.baseDn", "o=TaskanaTest"},
|
||||||
|
{"taskana.ldap.userSearchBase", "ou=people"},
|
||||||
|
{"taskana.ldap.userSearchFilterName", "objectclass"},
|
||||||
|
{"taskana.ldap.groupsOfUser", "memberUid"},
|
||||||
|
{"taskana.ldap.groupNameAttribute", "cn"},
|
||||||
|
{"taskana.ldap.groupSearchFilterValue", "groupOfUniqueNames"},
|
||||||
|
{"taskana.ldap.groupSearchFilterName", "objectclass"},
|
||||||
|
{"taskana.ldap.groupSearchBase", "ou=groups"},
|
||||||
|
{"taskana.ldap.userIdAttribute", "uid"},
|
||||||
|
{"taskana.ldap.userLastnameAttribute", "sn"},
|
||||||
|
{"taskana.ldap.userFirstnameAttribute", "givenName"},
|
||||||
|
{"taskana.ldap.userFirstnameAttribute", "givenName"},
|
||||||
|
{"taskana.ldap.userSearchFilterValue", "person"},
|
||||||
|
{"taskana.ldap.bindDn", "uid=admin,ou=system"},
|
||||||
|
{"taskana.ldap.bindPassword", "secret"},
|
||||||
|
{"taskana.ldap.serverUrl", "ldap://localhost:10389"},
|
||||||
|
})
|
||||||
|
.forEach(
|
||||||
|
strings ->
|
||||||
|
lenient().when(this.environment.getProperty(strings[0])).thenReturn(strings[1]));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue