Skip to content

Commit

Permalink
SHIBUI-521(546): xml rendering and unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 27, 2018
1 parent 473080b commit 66dcaba
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.filters.*
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository
import groovy.util.logging.Slf4j
Expand All @@ -22,6 +23,9 @@ import org.opensaml.saml.saml2.metadata.EntityDescriptor
import org.springframework.beans.factory.annotation.Autowired
import org.w3c.dom.Document

import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.CLASSPATH
import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.SVN

@Slf4j
class JPAMetadataResolverServiceImpl implements MetadataResolverService {

Expand Down Expand Up @@ -272,4 +276,49 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
childNodes()
}
}

void constructXmlNodeForResolver(ResourceBackedMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) {
//This might throw an InvalidResourceTypeException if both resource types do not satisfy validation rules
//But this validation step already would have been performed by higher app layers such as REST controllers,
//and if this is not done, an exception thrown here would be trully considered a server side error bug which would
//need to be taken care of
def resourceType = resolver.validateAndDetermineResourceType()

markupBuilderDelegate.MetadataProvider(
id: resolver.name,
'xsi:type': 'ResourceBackedMetadataProvider',
parserPoolRef: resolver.reloadableMetadataResolverAttributes?.parserPoolRef,
minRefreshDelay: resolver.reloadableMetadataResolverAttributes?.minRefreshDelay,
maxRefreshDelay: resolver.reloadableMetadataResolverAttributes?.maxRefreshDelay,
refreshDelayFactor: resolver.reloadableMetadataResolverAttributes?.refreshDelayFactor,
indexesRef: resolver.reloadableMetadataResolverAttributes?.indexesRef,
resolveViaPredicatesOnly: resolver.reloadableMetadataResolverAttributes?.resolveViaPredicatesOnly ?: null,
expirationWarningThreshold: resolver.reloadableMetadataResolverAttributes?.expirationWarningThreshold) {

if(resourceType == SVN) {
MetadataResource(
'xmlns:resource': 'urn:mace:shibboleth:2.0:resource',
'xsi:type': 'resource:SVNResource',
'resourceFile': resolver.svnMetadataResource.resourceFile,
'repositoryURL': resolver.svnMetadataResource.repositoryURL,
'workingCopyDirectory': resolver.svnMetadataResource.workingCopyDirectory,
'username': resolver.svnMetadataResource.username,
'password': resolver.svnMetadataResource.password,
'proxyHost': resolver.svnMetadataResource.proxyHost,
'proxyPort': resolver.svnMetadataResource.proxyHost,
'proxyUserName': resolver.svnMetadataResource.proxyUserName,
'proxyPassword': resolver.svnMetadataResource.proxyPassword)

}
else if (resourceType == CLASSPATH) {
MetadataResource(
'xmlns:resource': 'urn:mace:shibboleth:2.0:resource',
'xsi:type': 'resource:ClasspathResource',
'file': resolver.classpathMetadataResource.file)
}

childNodes()
}

}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Transient;

import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.CLASSPATH;
import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.SVN;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.test.annotation.DirtiesContext
import org.springframework.test.context.ContextConfiguration

import spock.lang.Specification
Expand All @@ -31,7 +30,6 @@ import static edu.internet2.tier.shibboleth.admin.ui.util.TestHelpers.*
@ContextConfiguration(classes = [CoreShibUiConfiguration, SearchConfiguration])
@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"])
@EntityScan("edu.internet2.tier.shibboleth.admin.ui")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
class IncommonJPAMetadataResolverServiceImplTests extends Specification {
@Autowired
MetadataResolverService metadataResolverService
Expand All @@ -42,6 +40,10 @@ class IncommonJPAMetadataResolverServiceImplTests extends Specification {
@Autowired
AttributeUtility attributeUtility

def cleanup() {
metadataResolverRepository.deleteAll()
}

def 'simple test generation of metadata-providers.xml'() {
when:
def mr = metadataResolverRepository.findAll().iterator().next()
Expand Down Expand Up @@ -137,6 +139,9 @@ class IncommonJPAMetadataResolverServiceImplTests extends Specification {

// Generate and test edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver.
metadataResolverRepository.save(new TestObjectGenerator(attributeUtility).localDynamicMetadataResolver())

// Generate and test edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver
metadataResolverRepository.save(new TestObjectGenerator(attributeUtility).resourceBackedMetadataResolverForSVN())
}

return resolver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ClasspathMetadataResource
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.SvnMetadataResource
import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository

Expand Down Expand Up @@ -42,7 +44,6 @@ import static edu.internet2.tier.shibboleth.admin.ui.util.TestHelpers.generatedX
@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration])
@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"])
@EntityScan("edu.internet2.tier.shibboleth.admin.ui")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
class JPAMetadataResolverServiceImplTests extends Specification {
@Autowired
MetadataResolverRepository metadataResolverRepository
Expand Down Expand Up @@ -80,6 +81,7 @@ class JPAMetadataResolverServiceImplTests extends Specification {
}

def cleanup() {
metadataResolverRepository.deleteAll()
writer.close()
}

Expand Down Expand Up @@ -170,6 +172,48 @@ class JPAMetadataResolverServiceImplTests extends Specification {
generatedXmlIsTheSameAsExpectedXml('/conf/532.xml', domBuilder.parseText(writer.toString()))
}

def 'test generating ResourceBackedMetadataResolver with SVN resource type xml snippet'() {
given:
def resolver = new edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver().with {
it.name = 'SVNResourceMetadata'
it.svnMetadataResource = new SvnMetadataResource().with {
it.resourceFile = 'entity.xml'
it.repositoryURL = 'https://svn.example.org/repo/path/to.dir'
it.workingCopyDirectory = '%{idp.home}/metadata/svn'
it
}
it
}

when:
genXmlSnippet(markupBuilder) {
JPAMetadataResolverServiceImpl.cast(metadataResolverService).constructXmlNodeForResolver(resolver, it) {}
}

then:
generatedXmlIsTheSameAsExpectedXml('/conf/546-svn.xml', domBuilder.parseText(writer.toString()))
}

def 'test generating ResourceBackedMetadataResolver with classpath resource type xml snippet'() {
given:
def resolver = new edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver().with {
it.name = 'ClasspathResourceMetadata'
it.classpathMetadataResource = new ClasspathMetadataResource().with {
it.file = '/path/to/a/classpath/location/metadata.xml'
it
}
it
}

when:
genXmlSnippet(markupBuilder) {
JPAMetadataResolverServiceImpl.cast(metadataResolverService).constructXmlNodeForResolver(resolver, it) {}
}

then:
generatedXmlIsTheSameAsExpectedXml('/conf/546-classpath.xml', domBuilder.parseText(writer.toString()))
}

static genXmlSnippet(MarkupBuilder xml, Closure xmlNodeGenerator) {
xml.MetadataProvider('id': 'ShibbolethMetadata',
'xmlns': 'urn:mace:shibboleth:2.0:metadata',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,19 @@ class TestObjectGenerator {
}
}

ResourceBackedMetadataResolver resourceBackedMetadataResolverForSVN() {
new ResourceBackedMetadataResolver().with {
it.name = 'SVNResourceMetadata'
it.svnMetadataResource = new SvnMetadataResource().with {
it.resourceFile = 'entity.xml'
it.repositoryURL = 'https://svn.example.org/repo/path/to.dir'
it.workingCopyDirectory = '%{idp.home}/metadata/svn'
it
}
it
}
}

FileBackedHttpMetadataResolver buildFileBackedHttpMetadataResolver() {
def resolver = new FileBackedHttpMetadataResolver()
resolver.name = generator.randomString(10)
Expand Down
8 changes: 8 additions & 0 deletions backend/src/test/resources/conf/278.2.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,13 @@
xsi:type="DynamicHttpMetadataProvider">
<MetadataFilter certificateFile="%{idp.home}/credentials/inc-md-cert.pem" requireSignedRoot="true" xsi:type="SignatureValidation"/>
</MetadataProvider>
<MetadataProvider id="SVNResourceMetadata" xsi:type="ResourceBackedMetadataProvider">
<MetadataResource xmlns:resource="urn:mace:shibboleth:2.0:resource"
xsi:type="resource:SVNResource"
resourceFile="entity.xml"
repositoryURL="https://svn.example.org/repo/path/to.dir"
workingCopyDirectory="%{idp.home}/metadata/svn" />
<MetadataFilter certificateFile="%{idp.home}/credentials/inc-md-cert.pem" requireSignedRoot="true" xsi:type="SignatureValidation"/>
</MetadataProvider>

</MetadataProvider>
8 changes: 8 additions & 0 deletions backend/src/test/resources/conf/278.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,12 @@
xsi:type="DynamicHttpMetadataProvider">
<MetadataFilter certificateFile="%{idp.home}/credentials/inc-md-cert.pem" requireSignedRoot="true" xsi:type="SignatureValidation"/>
</MetadataProvider>
<MetadataProvider id="SVNResourceMetadata" xsi:type="ResourceBackedMetadataProvider">
<MetadataResource xmlns:resource="urn:mace:shibboleth:2.0:resource"
xsi:type="resource:SVNResource"
resourceFile="entity.xml"
repositoryURL="https://svn.example.org/repo/path/to.dir"
workingCopyDirectory="%{idp.home}/metadata/svn" />
<MetadataFilter certificateFile="%{idp.home}/credentials/inc-md-cert.pem" requireSignedRoot="true" xsi:type="SignatureValidation"/>
</MetadataProvider>
</MetadataProvider>
13 changes: 13 additions & 0 deletions backend/src/test/resources/conf/546-classpath.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file is an EXAMPLE metadata configuration file. -->
<MetadataProvider id="ShibbolethMetadata"
xmlns="urn:mace:shibboleth:2.0:metadata"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ChainingMetadataProvider"
xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd urn:mace:shibboleth:2.0:resource http://shibboleth.net/schema/idp/shibboleth-resource.xsd urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd urn:oasis:names:tc:SAML:2.0:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd">
<MetadataProvider id="ClasspathResourceMetadata" xsi:type="ResourceBackedMetadataProvider">
<MetadataResource xmlns:resource="urn:mace:shibboleth:2.0:resource"
xsi:type="resource:ClasspathResource"
file="/path/to/a/classpath/location/metadata.xml"/>
</MetadataProvider>
</MetadataProvider>
16 changes: 16 additions & 0 deletions backend/src/test/resources/conf/546-svn.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file is an EXAMPLE metadata configuration file. -->
<MetadataProvider id="ShibbolethMetadata"
xmlns="urn:mace:shibboleth:2.0:metadata"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ChainingMetadataProvider"
xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd urn:mace:shibboleth:2.0:resource http://shibboleth.net/schema/idp/shibboleth-resource.xsd urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd urn:oasis:names:tc:SAML:2.0:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd">
<MetadataProvider id="SVNResourceMetadata" xsi:type="ResourceBackedMetadataProvider">
<MetadataResource xmlns:resource="urn:mace:shibboleth:2.0:resource"
xsi:type="resource:SVNResource"
resourceFile="entity.xml"
repositoryURL="https://svn.example.org/repo/path/to.dir"
workingCopyDirectory="%{idp.home}/metadata/svn" />
</MetadataProvider>

</MetadataProvider>

0 comments on commit 66dcaba

Please sign in to comment.