package org.apereo.cas.adaptors.ldap.services; import org.apereo.cas.adaptors.ldap.AbstractLdapTests; import org.apereo.cas.adaptors.ldap.services.config.LdapServiceRegistryConfiguration; import org.apereo.cas.authentication.principal.ShibbolethCompatiblePersistentIdGenerator; import org.apereo.cas.services.AbstractRegisteredService; import org.apereo.cas.services.AnonymousRegisteredServiceUsernameAttributeProvider; import org.apereo.cas.services.DefaultRegisteredServiceProperty; import org.apereo.cas.services.DefaultRegisteredServiceUsernameProvider; import org.apereo.cas.services.RefuseRegisteredServiceProxyPolicy; import org.apereo.cas.services.RegexMatchingRegisteredServiceProxyPolicy; import org.apereo.cas.services.RegexRegisteredService; import org.apereo.cas.services.RegisteredService; import org.apereo.cas.services.RegisteredServiceProperty; import org.apereo.cas.services.ReturnAllAttributeReleasePolicy; import org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy; import org.apereo.cas.services.ServiceRegistryDao; import org.apereo.cas.support.oauth.services.OAuthRegisteredService; import org.apereo.cas.support.saml.services.SamlRegisteredService; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.junit.Assert.*; /** * Unit test for {@link LdapServiceRegistryDao} class. * * @author Misagh Moayyed * @author Marvin S. Addison * @since 4.0.0 */ @RunWith(SpringRunner.class) @SpringBootTest(classes = {LdapServiceRegistryConfiguration.class, RefreshAutoConfiguration.class}) @TestPropertySource(locations = "classpath:/ldapsvc.properties") @EnableScheduling public class LdapServiceRegistryDaoTests extends AbstractLdapTests { @Autowired @Qualifier("serviceRegistryDao") private ServiceRegistryDao dao; @BeforeClass public static void bootstrap() throws Exception { initDirectoryServer(); } @Before public void setUp() throws Exception { this.dao.load().forEach(service -> this.dao.delete(service)); } @Test public void verifyEmptyRegistry() { assertEquals(0, this.dao.load().size()); } @Test public void verifyNonExistingService() { assertNull(this.dao.findServiceById(9999991)); } @Test public void verifySavingServices() { this.dao.save(getRegexRegisteredService()); this.dao.save(getRegexRegisteredService()); final List<RegisteredService> services = this.dao.load(); assertEquals(2, services.size()); } @Test public void verifyUpdatingServices() { this.dao.save(getRegexRegisteredService()); final List<RegisteredService> services = this.dao.load(); final AbstractRegisteredService rs = (AbstractRegisteredService) this.dao.findServiceById(services.get(0).getId()); assertNotNull(rs); rs.setEvaluationOrder(9999); rs.setUsernameAttributeProvider(new DefaultRegisteredServiceUsernameProvider()); rs.setName("Another Test Service"); rs.setDescription("The new description"); rs.setServiceId("https://hello.world"); rs.setProxyPolicy(new RegexMatchingRegisteredServiceProxyPolicy("https")); rs.setAttributeReleasePolicy(new ReturnAllowedAttributeReleasePolicy()); assertNotNull(this.dao.save(rs)); final RegisteredService rs3 = this.dao.findServiceById(rs.getId()); assertEquals(rs3.getName(), rs.getName()); assertEquals(rs3.getDescription(), rs.getDescription()); assertEquals(rs3.getEvaluationOrder(), rs.getEvaluationOrder()); assertEquals(rs3.getUsernameAttributeProvider(), rs.getUsernameAttributeProvider()); assertEquals(rs3.getProxyPolicy(), rs.getProxyPolicy()); assertEquals(rs3.getUsernameAttributeProvider(), rs.getUsernameAttributeProvider()); assertEquals(rs3.getServiceId(), rs.getServiceId()); } @Test public void verifySamlService() { final SamlRegisteredService r = new SamlRegisteredService(); r.setName("verifySamlService"); r.setServiceId("Testing"); r.setDescription("description"); r.setAttributeReleasePolicy(new ReturnAllAttributeReleasePolicy()); final Map fmt = new HashMap(); fmt.put("key", "value"); r.setAttributeNameFormats(fmt); r.setMetadataCriteriaDirection("INCLUDE"); r.setMetadataCriteriaRemoveEmptyEntitiesDescriptors(true); r.setMetadataSignatureLocation("location"); r.setRequiredAuthenticationContextClass("Testing"); final SamlRegisteredService r2 = (SamlRegisteredService) this.dao.save(r); assertEquals(r, r2); } @Test public void verifyOAuthServices() { final OAuthRegisteredService r = new OAuthRegisteredService(); r.setName("test1456"); r.setServiceId("testId"); r.setTheme("theme"); r.setDescription("description"); r.setAttributeReleasePolicy(new ReturnAllAttributeReleasePolicy()); r.setClientId("testoauthservice"); r.setClientSecret("anothertest"); r.setBypassApprovalPrompt(true); final RegisteredService r2 = this.dao.save(r); assertEquals(r, r2); } @Test public void verifySavingServiceChangesDn() { this.dao.save(getRegexRegisteredService()); final List<RegisteredService> services = this.dao.load(); final AbstractRegisteredService rs = (AbstractRegisteredService) this.dao.findServiceById(services.get(0).getId()); final long originalId = rs.getId(); assertNotNull(rs); rs.setId(666); assertNotNull(this.dao.save(rs)); assertNotEquals(rs.getId(), originalId); } @Test public void verifyDeletingSingleService() throws Exception { final RegisteredService rs = getRegexRegisteredService(); final RegisteredService rs2 = getRegexRegisteredService(); this.dao.save(rs2); this.dao.save(rs); this.dao.load(); this.dao.delete(rs2); final List<RegisteredService> services = this.dao.load(); assertEquals(1, services.size()); assertEquals(services.get(0).getId(), rs.getId()); assertEquals(services.get(0).getName(), rs.getName()); } @Test public void verifyDeletingServices() throws Exception { this.dao.save(getRegexRegisteredService()); this.dao.save(getRegexRegisteredService()); final List<RegisteredService> services = this.dao.load(); services.forEach(registeredService -> this.dao.delete(registeredService)); assertEquals(0, this.dao.load().size()); } private static RegisteredService getRegexRegisteredService() { final AbstractRegisteredService rs = new RegexRegisteredService(); rs.setName("Service Name Regex"); rs.setProxyPolicy(new RefuseRegisteredServiceProxyPolicy()); rs.setUsernameAttributeProvider(new AnonymousRegisteredServiceUsernameAttributeProvider( new ShibbolethCompatiblePersistentIdGenerator("hello") )); rs.setDescription("Service description"); rs.setServiceId("^http?://.+"); rs.setTheme("the theme name"); rs.setEvaluationOrder(123); rs.setDescription("Here is another description"); rs.setRequiredHandlers(Stream.of("handler1", "handler2").collect(Collectors.toSet())); final Map<String, RegisteredServiceProperty> propertyMap = new HashMap<>(); final DefaultRegisteredServiceProperty property = new DefaultRegisteredServiceProperty(); final Set<String> values = new HashSet<>(); values.add("value1"); values.add("value2"); property.setValues(values); propertyMap.put("field1", property); rs.setProperties(propertyMap); return rs; } }