/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 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.
* 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.
*/
package org.picketlink.test.idm.config;
import org.junit.Test;
import org.picketlink.common.exceptions.ParsingException;
import org.picketlink.config.idm.XMLConfigurationProvider;
import org.picketlink.config.idm.resolver.BasicPropertyResolver;
import org.picketlink.config.idm.resolver.PropertyResolverMapper;
import org.picketlink.idm.config.FileIdentityStoreConfiguration;
import org.picketlink.idm.config.IdentityConfiguration;
import org.picketlink.idm.config.IdentityConfigurationBuilder;
import org.picketlink.idm.config.IdentityStoreConfiguration;
import org.picketlink.idm.config.JPAIdentityStoreConfiguration;
import org.picketlink.idm.config.LDAPIdentityStoreConfiguration;
import org.picketlink.idm.config.LDAPMappingConfiguration;
import org.picketlink.idm.config.SecurityConfigurationException;
import org.picketlink.idm.jpa.model.sample.simple.DigestCredentialTypeEntity;
import org.picketlink.idm.jpa.model.sample.simple.GroupTypeEntity;
import org.picketlink.idm.jpa.model.sample.simple.PartitionTypeEntity;
import org.picketlink.idm.jpa.model.sample.simple.PasswordCredentialTypeEntity;
import org.picketlink.idm.model.AttributedType;
import org.picketlink.idm.model.IdentityType;
import org.picketlink.idm.model.Partition;
import org.picketlink.idm.model.Relationship;
import org.picketlink.idm.model.basic.Grant;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.model.basic.GroupMembership;
import org.picketlink.idm.model.basic.Role;
import org.picketlink.idm.model.basic.User;
import org.picketlink.test.idm.model.entity.MyCustomAccountEntity;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.*;
/**
* Test for parsing of IDM configuration from XML file and checking that content of builders is as expected
*
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class XMLConfigurationTestCase {
@Test
public void testParseFileConfiguration() throws ParsingException {
List<IdentityConfiguration> configs = buildFromFile("config/embedded-file-config.xml");
assertEquals(configs.size(), 1);
IdentityConfiguration config = configs.get(0);
assertEquals("SIMPLE_FILE_STORE_CONFIG", config.getName());
assertTrue(config.getRelationshipPolicy().isGlobalRelationshipSupported(Relationship.class));
assertEquals(config.getStoreConfiguration().size(), 1);
assertTrue(config.getStoreConfiguration().get(0) instanceof FileIdentityStoreConfiguration);
FileIdentityStoreConfiguration fileStoreConfig = (FileIdentityStoreConfiguration)config.getStoreConfiguration().get(0);
assertTrue(fileStoreConfig.isAlwaysCreateFiles());
}
@Test
public void testParseLDAPConfiguration() throws ParsingException {
List<IdentityConfiguration> configs = buildFromFile("config/embedded-ldap-config.xml");
assertEquals(configs.size(), 1);
IdentityConfiguration config = configs.get(0);
assertEquals("SIMPLE_LDAP_STORE_CONFIG", config.getName());
assertTrue(config.getRelationshipPolicy().isGlobalRelationshipSupported(Grant.class));
assertTrue(config.getRelationshipPolicy().isGlobalRelationshipSupported(GroupMembership.class));
assertEquals(config.getStoreConfiguration().size(), 1);
assertTrue(config.getStoreConfiguration().get(0) instanceof LDAPIdentityStoreConfiguration);
LDAPIdentityStoreConfiguration ldapStoreConfig = (LDAPIdentityStoreConfiguration)config.getStoreConfiguration().get(0);
assertEquals("dc=jboss,dc=org", ldapStoreConfig.getBaseDN());
assertEquals("uid=admin,ou=system", ldapStoreConfig.getBindDN());
assertEquals("secret", ldapStoreConfig.getBindCredential());
assertEquals("ldap://localhost:10389", ldapStoreConfig.getLdapURL());
ldapStoreConfig.supportsType(IdentityType.class, IdentityStoreConfiguration.IdentityOperation.read);
ldapStoreConfig.supportsType(IdentityType.class, IdentityStoreConfiguration.IdentityOperation.create);
// Some mapping testing
Map<Class<? extends AttributedType>, LDAPMappingConfiguration> mappingConfig = ldapStoreConfig.getMappingConfig();
assertEquals(mappingConfig.size(), 6);
LDAPMappingConfiguration userMapping = mappingConfig.get(User.class);
assertTrue(userMapping.getObjectClasses().contains("inetOrgPerson"));
assertTrue(userMapping.getObjectClasses().contains("organizationalPerson"));
assertTrue(userMapping.getReadOnlyAttributes().contains("createdDate"));
assertEquals("loginName", userMapping.getIdProperty().getName());
Map<String, String> mappedProps = userMapping.getMappedProperties();
assertEquals(mappedProps.size(), 5);
assertEquals("uid", mappedProps.get("loginName"));
assertEquals("sn", mappedProps.get("lastName"));
LDAPMappingConfiguration groupMapping = mappingConfig.get(Group.class);
assertEquals("ou=Groups,dc=jboss,dc=org", groupMapping.getBaseDN());
assertEquals("name", groupMapping.getIdProperty().getName());
assertEquals("member", groupMapping.getParentMembershipAttributeName());
LDAPMappingConfiguration grantMapping = mappingConfig.get(Grant.class);
assertEquals("member", grantMapping.getMappedProperties().get("assignee"));
assertEquals(grantMapping.getRelatedAttributedType(), Role.class);
}
@Test
public void testParseJPAConfiguration() throws ParsingException {
List<IdentityConfiguration> configs = buildFromFile("config/embedded-jpa-config.xml");
assertEquals(configs.size(), 1);
IdentityConfiguration config = configs.get(0);
assertEquals("SIMPLE_JPA_STORE_CONFIG", config.getName());
assertTrue(config.getRelationshipPolicy().isGlobalRelationshipSupported(Relationship.class));
assertEquals(config.getStoreConfiguration().size(), 1);
assertTrue(config.getStoreConfiguration().get(0) instanceof JPAIdentityStoreConfiguration);
JPAIdentityStoreConfiguration jpaStoreConfig = (JPAIdentityStoreConfiguration)config.getStoreConfiguration().get(0);
jpaStoreConfig.supportsType(IdentityType.class, IdentityStoreConfiguration.IdentityOperation.read);
jpaStoreConfig.supportsType(IdentityType.class, IdentityStoreConfiguration.IdentityOperation.create);
jpaStoreConfig.supportsType(Partition.class, IdentityStoreConfiguration.IdentityOperation.read);
jpaStoreConfig.supportsType(Relationship.class, IdentityStoreConfiguration.IdentityOperation.read);
Set<Class<?>> entityTypes = jpaStoreConfig.getEntityTypes();
assertEquals(entityTypes.size(), 14);
assertTrue(entityTypes.contains(PasswordCredentialTypeEntity.class));
assertTrue(entityTypes.contains(DigestCredentialTypeEntity.class));
assertTrue(entityTypes.contains(PartitionTypeEntity.class));
assertTrue(entityTypes.contains(MyCustomAccountEntity.class));
assertTrue(entityTypes.contains(GroupTypeEntity.class));
}
@Test
public void testParseCustomConfiguration() throws ParsingException {
// First we need to register custom Resolver for MethodInvocationContext type, used in custom config (or alternative is to add it programmatically to builder later)
final CustomIdentityStoreTestCase.MethodInvocationContext methodInvocationContext = new CustomIdentityStoreTestCase.MethodInvocationContext();
PropertyResolverMapper.getInstance().addPropertyResolver(CustomIdentityStoreTestCase.MethodInvocationContext.class,
new BasicPropertyResolver<CustomIdentityStoreTestCase.MethodInvocationContext>() {
@Override
protected CustomIdentityStoreTestCase.MethodInvocationContext resolvePropertyFromString(String stringPropertyValue, Class<CustomIdentityStoreTestCase.MethodInvocationContext> propertyClass) {
return methodInvocationContext;
}
});
List<IdentityConfiguration> configs = buildFromFile("config/embedded-custom-config.xml");
assertEquals(configs.size(), 1);
IdentityConfiguration config = configs.get(0);
assertEquals("default", config.getName());
assertTrue(config.getRelationshipPolicy().isGlobalRelationshipSupported(Relationship.class));
assertEquals(config.getStoreConfiguration().size(), 1);
assertTrue(config.getStoreConfiguration().get(0) instanceof CustomIdentityStoreTestCase.MyIdentityStoreConfiguration);
CustomIdentityStoreTestCase.MyIdentityStoreConfiguration myStoreConfig = (CustomIdentityStoreTestCase.MyIdentityStoreConfiguration)config.getStoreConfiguration().get(0);
assertEquals(methodInvocationContext, myStoreConfig.getMethodInvocationContext());
}
@Test (expected = SecurityConfigurationException.class)
public void testInvalidConfiguration() throws ParsingException {
buildFromFile("config/embedded-invalid-config.xml");
}
private List<IdentityConfiguration> buildFromFile(String configFilePath) {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
InputStream configStream = tcl.getResourceAsStream(configFilePath);
XMLConfigurationProvider xmlConfigurationProvider = new XMLConfigurationProvider();
IdentityConfigurationBuilder idmConfigBuilder = xmlConfigurationProvider.readIDMConfiguration(configStream);
assertNotNull(idmConfigBuilder);
return idmConfigBuilder.buildAll();
}
}