/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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. */ package org.jbpm.services.task.identity; import java.util.Iterator; import java.util.Properties; import javax.naming.Context; import org.assertj.core.api.Assertions; import org.assertj.core.api.SoftAssertions; import org.jbpm.services.task.utils.LdapSearcher.SearchScope; import org.junit.Test; import org.kie.api.task.model.Group; import org.kie.api.task.model.OrganizationalEntity; import org.kie.api.task.model.User; import org.kie.internal.task.api.TaskModelProvider; import org.kie.internal.task.api.UserInfo; import static org.jbpm.services.task.utils.LdapSearcher.SearchScope.*; public class LDAPUserInfoImplTest extends LDAPBaseTest { private static final User JOHN = TaskModelProvider.getFactory().newUser("john"); private static final User JOHN_DN = TaskModelProvider.getFactory().newUser("uid=john,ou=People,dc=jbpm,dc=org"); private static final User MARY = TaskModelProvider.getFactory().newUser("mary"); private static final User MARY_DN = TaskModelProvider.getFactory().newUser("uid=mary,ou=People,dc=jbpm,dc=org"); private static final User PETER = TaskModelProvider.getFactory().newUser("peter"); private static final User MIKE = TaskModelProvider.getFactory().newUser("mike"); private static final Group MANAGER = TaskModelProvider.getFactory().newGroup("manager"); private static final Group MANAGER_DN = TaskModelProvider.getFactory().newGroup("cn=manager,ou=Roles,dc=jbpm,dc=org"); private static final Group USER = TaskModelProvider.getFactory().newGroup("user"); private static final Group USER_DN = TaskModelProvider.getFactory().newGroup("cn=user,ou=Roles,dc=jbpm,dc=org"); private static final Group ANALYST = TaskModelProvider.getFactory().newGroup("analyst"); private static final Group DEVELOPER = TaskModelProvider.getFactory().newGroup("developer"); private Properties createUserInfoProperties() { Properties properties = new Properties(); properties.setProperty(Context.PROVIDER_URL, SERVER_URL); properties.setProperty(LDAPUserInfoImpl.USER_CTX, "ou=People,dc=jbpm,dc=org"); properties.setProperty(LDAPUserInfoImpl.ROLE_CTX, "ou=Roles,dc=jbpm,dc=org"); properties.setProperty(LDAPUserInfoImpl.USER_FILTER, "(uid={0})"); properties.setProperty(LDAPUserInfoImpl.ROLE_FILTER, "(cn={0})"); return properties; } private Properties createUserInfoProperties(SearchScope searchScope) { Properties properties = createUserInfoProperties(); properties.setProperty(LDAPUserInfoImpl.SEARCH_SCOPE, searchScope.name()); return properties; } private void testGetDisplayName(OrganizationalEntity entity, String expectedName, boolean customAttribute) { Properties properties = createUserInfoProperties(); if (customAttribute) { properties.setProperty(LDAPUserInfoImpl.NAME_ATTR_ID, "name"); } if (entity.getId().startsWith("uid=") || entity.getId().startsWith("cn=")) { properties.setProperty(LDAPUserInfoImpl.IS_ENTITY_ID_DN, "true"); } UserInfo ldapUserInfo = new LDAPUserInfoImpl(properties); String name = ldapUserInfo.getDisplayName(entity); Assertions.assertThat(name).isNotNull(); Assertions.assertThat(name).isEqualTo(expectedName); } @Test public void testGetDisplayNameForUserByDefaultAttribute() { testGetDisplayName(JOHN, "John Doe", false); } @Test public void testGetDisplayNameForUserDnByDefaultAttribute() { testGetDisplayName(JOHN_DN, "John Doe", false); } @Test public void testGetDisplayNameForUserByCustomAttribute() { testGetDisplayName(MARY, "Mary Snow", true); } @Test public void testGetDisplayNameForUserDnByCustomAttribute() { testGetDisplayName(MARY_DN, "Mary Snow", true); } @Test public void testGetDisplayNameForGroupByDefaultAttribute() { testGetDisplayName(MANAGER, "jBPM manager", false); } @Test public void testGetDisplayNameForGroupDnByDefaultAttribute() { testGetDisplayName(MANAGER_DN, "jBPM manager", false); } @Test public void testGetDisplayNameForGroupByCustomAttribute() { testGetDisplayName(USER, "jBPM user", true); } @Test public void testGetDisplayNameForGroupDnByCustomAttribute() { testGetDisplayName(USER_DN, "jBPM user", true); } private void testGetMembersForGroup(boolean emptyGroup, boolean customAttribute, boolean distinguishedName) { Properties properties = createUserInfoProperties(); if (customAttribute) { properties.setProperty(LDAPUserInfoImpl.MEMBER_ATTR_ID, "representative"); } if (distinguishedName) { properties.setProperty(LDAPUserInfoImpl.IS_ENTITY_ID_DN, "true"); } UserInfo ldapUserInfo = new LDAPUserInfoImpl(properties); Group group; if (distinguishedName) { group = emptyGroup ? USER_DN : MANAGER_DN; } else { group = emptyGroup ? USER : MANAGER; } Iterator<OrganizationalEntity> iterator = ldapUserInfo.getMembersForGroup(group); if (emptyGroup) { Assertions.assertThat(iterator.hasNext()).isFalse(); return; } Assertions.assertThat(iterator.hasNext()).isTrue(); User user = (User) iterator.next(); if (customAttribute) { Assertions.assertThat(user.getId()).isEqualTo(MARY_DN.getId()); } else { Assertions.assertThat(user.getId()).isEqualTo(JOHN_DN.getId()); } Assertions.assertThat(iterator.hasNext()).isFalse(); } @Test public void testGetMembersForGroupByDefaultAttribute() { testGetMembersForGroup(false, false, false); } @Test public void testGetMembersForGroupDnByDefaultAttribute() { testGetMembersForGroup(false, false, true); } @Test public void testGetMembersForGroupByCustomAttribute() { testGetMembersForGroup(false, true, false); } @Test public void testGetMembersForGroupDnByCustomAttribute() { testGetMembersForGroup(false, true, true); } @Test public void testGetMembersForEmptyGroupByDefaultAttribute() { testGetMembersForGroup(true, false, false); } @Test public void testGetMembersForEmptyGroupByCustomAttribute() { testGetMembersForGroup(true, true, false); } private void testHasEmail(Group group, boolean hasEmail, boolean customAttribute) { Properties properties = createUserInfoProperties(); if (customAttribute) { properties.setProperty(LDAPUserInfoImpl.EMAIL_ATTR_ID, "email"); } if (group.getId().startsWith("cn=")) { properties.setProperty(LDAPUserInfoImpl.IS_ENTITY_ID_DN, "true"); } UserInfo ldapUserInfo = new LDAPUserInfoImpl(properties); Assertions.assertThat(ldapUserInfo.hasEmail(group)).isEqualTo(hasEmail); } @Test public void testHasExistingEmailByDefaultAttribute() { testHasEmail(MANAGER, true, false); } @Test public void testHasExistingEmailDnByDefaultAttribute() { testHasEmail(MANAGER_DN, true, false); } @Test public void testHasExistingEmailByCustomAttribute() { testHasEmail(USER, true, true); } @Test public void testHasExistingEmailDnByCustomAttribute() { testHasEmail(USER_DN, true, true); } @Test public void testHasNonExistingEmailByDefaultAttribute() { testHasEmail(USER, false, false); } @Test public void testHasNonExistingEmailByCustomAttribute() { testHasEmail(MANAGER, false, true); } private void testGetEmailForEntity(OrganizationalEntity entity, String email, boolean customAttribute) { Properties properties = createUserInfoProperties(); if (customAttribute) { properties.setProperty(LDAPUserInfoImpl.EMAIL_ATTR_ID, "email"); } if (entity.getId().startsWith("uid=") || entity.getId().startsWith("cn=")) { properties.setProperty(LDAPUserInfoImpl.IS_ENTITY_ID_DN, "true"); } UserInfo ldapUserInfo = new LDAPUserInfoImpl(properties); Assertions.assertThat(ldapUserInfo.getEmailForEntity(entity)).isEqualTo(email); } @Test public void testGetExistingEmailForUserByDefaultAttribute() { testGetEmailForEntity(JOHN, "johndoe@jbpm.org", false); } @Test public void testGetExistingEmailForUserDnByDefaultAttribute() { testGetEmailForEntity(JOHN_DN, "johndoe@jbpm.org", false); } @Test public void testGetExistingEmailForUserByCustomAttribute() { testGetEmailForEntity(MARY, "marysnow@jbpm.org", true); } @Test public void testGetExistingEmailForUserDnByCustomAttribute() { testGetEmailForEntity(MARY_DN, "marysnow@jbpm.org", true); } @Test public void testGetNonExistingEmailForUserByDefaultAttribute() { testGetEmailForEntity(MARY, null, false); } @Test public void testGetNonExistingEmailForUserByCustomAttribute() { testGetEmailForEntity(JOHN, null, true); } @Test public void testGetExistingEmailForGroupByDefaultAttribute() { testGetEmailForEntity(MANAGER, "manager@jbpm.org", false); } @Test public void testGetExistingEmailForGroupDnByDefaultAttribute() { testGetEmailForEntity(MANAGER_DN, "manager@jbpm.org", false); } @Test public void testGetExistingEmailForGroupByCustomAttribute() { testGetEmailForEntity(USER, "user@jbpm.org", true); } @Test public void testGetExistingEmailForGroupDnByCustomAttribute() { testGetEmailForEntity(USER_DN, "user@jbpm.org", true); } @Test public void testGetNonExistingEmailForGroupByDefaultAttribute() { testGetEmailForEntity(USER, null, false); } @Test public void testGetNonExistingEmailForGroupByCustomAttribute() { testGetEmailForEntity(MANAGER, null, true); } private void testGetLanguageForEntity(OrganizationalEntity entity, String language, boolean customAttribute) { Properties properties = createUserInfoProperties(); if (customAttribute) { properties.setProperty(LDAPUserInfoImpl.LANG_ATTR_ID, "language"); } if (entity.getId().startsWith("uid=") || entity.getId().startsWith("cn=")) { properties.setProperty(LDAPUserInfoImpl.IS_ENTITY_ID_DN, "true"); } UserInfo ldapUserInfo = new LDAPUserInfoImpl(properties); Assertions.assertThat(ldapUserInfo.getLanguageForEntity(entity)).isEqualTo(language); } @Test public void testGetLanguageForUserByDefaultAttribute() { testGetLanguageForEntity(JOHN, "en-US", false); } @Test public void testGetLanguageForUserDnByDefaultAttribute() { testGetLanguageForEntity(JOHN_DN, "en-US", false); } @Test public void testGetLanguageForUserByCustomAttribute() { testGetLanguageForEntity(MARY, "fr-FR", true); } @Test public void testGetLanguageForUserDnByCustomAttribute() { testGetLanguageForEntity(MARY_DN, "fr-FR", true); } @Test public void testGetDefaultLanguageForUserByDefaultAttribute() { testGetLanguageForEntity(MARY, "en-UK", false); } @Test public void testGetDefaultLanguageForUserByCustomAttribute() { testGetLanguageForEntity(JOHN, "en-UK", true); } @Test public void testGetLanguageForGroupByDefaultAttribute() { testGetLanguageForEntity(MANAGER, "en-US", false); } @Test public void testGetLanguageForGroupDnByDefaultAttribute() { testGetLanguageForEntity(MANAGER_DN, "en-US", false); } @Test public void testGetLanguageForGroupByCustomAttribute() { testGetLanguageForEntity(USER, "fr-FR", true); } @Test public void testGetLanguageForGroupDnByCustomAttribute() { testGetLanguageForEntity(USER_DN, "fr-FR", true); } @Test public void testGetDefaultLanguageForGroupByDefaultAttribute() { testGetLanguageForEntity(USER, "en-UK", false); } @Test public void testGetDefaultLanguageForGroupByCustomAttribute() { testGetLanguageForEntity(MANAGER, "en-UK", true); } private UserInfo createLdapUserInfoUid(Properties properties) { properties.setProperty(LDAPUserInfoImpl.NAME_ATTR_ID, "uid"); return new LDAPUserInfoImpl(properties); } private UserInfo createLdapUserInfoWithUserCtx(SearchScope searchScope, String userCtx) { Properties properties = createUserInfoProperties(searchScope); properties.setProperty(LDAPUserInfoImpl.USER_CTX, userCtx); return createLdapUserInfoUid(properties); } private UserInfo createLdapUserInfoCn(Properties properties) { properties.setProperty(LDAPUserInfoImpl.NAME_ATTR_ID, "cn"); return new LDAPUserInfoImpl(properties); } private UserInfo createLdapUserInfoWithGroupCtx(SearchScope searchScope, String groupCtx) { Properties properties = createUserInfoProperties(searchScope); properties.setProperty(LDAPUserInfoImpl.ROLE_CTX, groupCtx); return createLdapUserInfoCn(properties); } private void assertUsers(UserInfo userInfo, boolean john, boolean mary, boolean peter, boolean mike) { Assertions.assertThat(userInfo).isNotNull(); SoftAssertions assertions = new SoftAssertions(); assertions.assertThat(userInfo.getDisplayName(JOHN)).as(JOHN.getId()).isEqualTo(john ? JOHN.getId() : null); assertions.assertThat(userInfo.getDisplayName(MARY)).as(MARY.getId()).isEqualTo(mary ? MARY.getId() : null); assertions.assertThat(userInfo.getDisplayName(PETER)).as(PETER.getId()).isEqualTo(peter ? PETER.getId() : null); assertions.assertThat(userInfo.getDisplayName(MIKE)).as(MIKE.getId()).isEqualTo(mike ? MIKE.getId() : null); assertions.assertAll(); } private void assertGroups(UserInfo userInfo, boolean manager, boolean user, boolean analyst, boolean developer) { Assertions.assertThat(userInfo).isNotNull(); SoftAssertions assertions = new SoftAssertions(); assertions.assertThat(userInfo.getDisplayName(MANAGER)).as(MANAGER.getId()) .isEqualTo(manager ? MANAGER.getId() : null); assertions.assertThat(userInfo.getDisplayName(USER)).as(USER.getId()) .isEqualTo(user ? USER.getId() : null); assertions.assertThat(userInfo.getDisplayName(ANALYST)).as(ANALYST.getId()) .isEqualTo(analyst ? ANALYST.getId() : null); assertions.assertThat(userInfo.getDisplayName(DEVELOPER)).as(DEVELOPER.getId()) .isEqualTo(developer ? DEVELOPER.getId() : null); assertions.assertAll(); } @Test public void testUsersObjectScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(OBJECT_SCOPE, "dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, false, false); } @Test public void testUsersObjectScopePeopleContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(OBJECT_SCOPE, "ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, false, false); } @Test public void testUsersObjectScopeJohnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(OBJECT_SCOPE, "uid=john,ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, true, false, false, false); } @Test public void testUsersOneLevelScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(ONELEVEL_SCOPE, "dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, false, false); } @Test public void testUsersOneLevelScopePeopleContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(ONELEVEL_SCOPE, "ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, true, true, false, false); } @Test public void testUsersOneLevelScopeJohnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(ONELEVEL_SCOPE, "uid=john,ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, false, false); } @Test public void testUsersOneLevelScopeEngContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(ONELEVEL_SCOPE, "ou=ENG,ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, true, false); } @Test public void testUsersSubtreeScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(SUBTREE_SCOPE, "dc=jbpm,dc=org"); assertUsers(ldapUserInfo, true, true, true, true); } @Test public void testUsersSubtreeScopePeopleContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(SUBTREE_SCOPE, "ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, true, true, true, true); } @Test public void testUsersSubtreeScopeJohnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(SUBTREE_SCOPE, "uid=john,ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, true, false, false, false); } @Test public void testUsersSubtreeScopeEngContext() { UserInfo ldapUserInfo = createLdapUserInfoWithUserCtx(SUBTREE_SCOPE, "ou=ENG,ou=People,dc=jbpm,dc=org"); assertUsers(ldapUserInfo, false, false, true, true); } @Test public void testGroupsObjectScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(OBJECT_SCOPE, "dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, false, false); } @Test public void testGroupsObjectScopeRolesContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(OBJECT_SCOPE, "ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, false, false); } @Test public void testGroupsObjectScopeManagerContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(OBJECT_SCOPE, "cn=manager,ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, true, false, false, false); } @Test public void testGroupsOneLevelScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(ONELEVEL_SCOPE, "dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, false, false); } @Test public void testGroupsOneLevelScopeRolesContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(ONELEVEL_SCOPE, "ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, true, true, false, false); } @Test public void testGroupsOneLevelScopeManagerContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(ONELEVEL_SCOPE, "cn=manager,ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, false, false); } @Test public void testGroupsOneLevelScopeEngContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(ONELEVEL_SCOPE, "ou=ENG,ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, true, false); } @Test public void testGroupsSubtreeScopeBaseDnContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(SUBTREE_SCOPE, "dc=jbpm,dc=org"); assertGroups(ldapUserInfo, true, true, true, true); } @Test public void testGroupsSubtreeScopeRolesContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(SUBTREE_SCOPE, "ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, true, true, true, true); } @Test public void testGroupsSubtreeScopeManagerContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(SUBTREE_SCOPE, "cn=manager,ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, true, false, false, false); } @Test public void testGroupsSubtreeScopeEngContext() { UserInfo ldapUserInfo = createLdapUserInfoWithGroupCtx(SUBTREE_SCOPE, "ou=ENG,ou=Roles,dc=jbpm,dc=org"); assertGroups(ldapUserInfo, false, false, true, true); } @Test public void testUsersDefaultScope() { UserInfo ldapUserInfo = createLdapUserInfoUid(createUserInfoProperties()); assertUsers(ldapUserInfo, true, true, false, false); } @Test public void testGroupsDefaultScope() { UserInfo ldapUserInfo = createLdapUserInfoCn(createUserInfoProperties()); assertGroups(ldapUserInfo, true, true, false, false); } @Test public void testUsersInvalidScope() { Properties properties = createUserInfoProperties(); properties.setProperty(LDAPUserInfoImpl.SEARCH_SCOPE, "xyz"); UserInfo ldapUserInfo = createLdapUserInfoUid(properties); assertUsers(ldapUserInfo, true, true, false, false); } @Test public void testGroupsInvalidScope() { Properties properties = createUserInfoProperties(); properties.setProperty(LDAPUserInfoImpl.SEARCH_SCOPE, "xyz"); UserInfo ldapUserInfo = createLdapUserInfoCn(properties); assertGroups(ldapUserInfo, true, true, false, false); } }