From 1db44f06ecba9cd9c83345129d42258a6a22958a Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 19 Jul 2018 15:44:03 -0400 Subject: [PATCH] SHIBUI-666 --- .../JPAMetadataResolverServiceImpl.groovy | 34 ++++++++-------- .../MetadataProvidersController.java | 40 ------------------- .../MetadataResolversController.java | 25 ++++++++++++ 3 files changed, 43 insertions(+), 56 deletions(-) delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index a9485073b..aa2d1e7df 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -46,12 +46,12 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { // TODO: enhance @Override void reloadFilters(String metadataResolverName) { - ChainingMetadataResolver chainingMetadataResolver = (ChainingMetadataResolver)metadataResolver + ChainingMetadataResolver chainingMetadataResolver = (ChainingMetadataResolver) metadataResolver MetadataResolver targetMetadataResolver = chainingMetadataResolver.getResolvers().find { it.id == metadataResolverName } edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver jpaMetadataResolver = metadataResolverRepository.findByName(metadataResolverName) if (targetMetadataResolver && targetMetadataResolver.getMetadataFilter() instanceof MetadataFilterChain) { - MetadataFilterChain metadataFilterChain = (MetadataFilterChain)targetMetadataResolver.getMetadataFilter() + MetadataFilterChain metadataFilterChain = (MetadataFilterChain) targetMetadataResolver.getMetadataFilter() List metadataFilters = new ArrayList<>() @@ -64,7 +64,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { if (entityAttributesFilter.getEntityAttributesFilterTarget().getEntityAttributesFilterTargetType() == EntityAttributesFilterTarget.EntityAttributesFilterTargetType.ENTITY) { rules.put( new EntityIdPredicate(entityAttributesFilter.getEntityAttributesFilterTarget().getValue()), - (List)(List)entityAttributesFilter.getAttributes() + (List) (List) entityAttributesFilter.getAttributes() ) } target.setRules(rules) @@ -76,7 +76,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { if (metadataResolver instanceof RefreshableMetadataResolver) { try { - ((RefreshableMetadataResolver)metadataResolver).refresh() + ((RefreshableMetadataResolver) metadataResolver).refresh() } catch (ResolverException e) { log.warn("error refreshing metadataResolver " + metadataResolverName, e) } @@ -99,15 +99,18 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { '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' ) { metadataResolverRepository.findAll().each { edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver mr -> - constructXmlNodeForResolver(mr, delegate) { - MetadataFilter( - 'xsi:type': 'SignatureValidation', - 'requireSignedRoot': 'true', - 'certificateFile': '%{idp.home}/credentials/inc-md-cert.pem' - ) - //TODO: enhance - mr.metadataFilters.each { edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter filter -> - constructXmlNodeForFilter(filter, delegate) + //TODO: We cannot/do not currently have the code to marshall the internal incommon chaining resolver + if (mr.type != 'BaseMetadataResolver') { + constructXmlNodeForResolver(mr, delegate) { + MetadataFilter( + 'xsi:type': 'SignatureValidation', + 'requireSignedRoot': 'true', + 'certificateFile': '%{idp.home}/credentials/inc-md-cert.pem' + ) + //TODO: enhance + mr.metadataFilters.each { edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter filter -> + constructXmlNodeForFilter(filter, delegate) + } } } } @@ -324,7 +327,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { resolveViaPredicatesOnly: resolver.reloadableMetadataResolverAttributes?.resolveViaPredicatesOnly ?: null, expirationWarningThreshold: resolver.reloadableMetadataResolverAttributes?.expirationWarningThreshold) { - if(resourceType == SVN) { + if (resourceType == SVN) { MetadataResource( 'xmlns:resource': 'urn:mace:shibboleth:2.0:resource', 'xsi:type': 'resource:SVNResource', @@ -338,8 +341,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { 'proxyUserName': resolver.svnMetadataResource.proxyUserName, 'proxyPassword': resolver.svnMetadataResource.proxyPassword) - } - else if (resourceType == CLASSPATH) { + } else if (resourceType == CLASSPATH) { MetadataResource( 'xmlns:resource': 'urn:mace:shibboleth:2.0:resource', 'xsi:type': 'resource:ClasspathResource', diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java deleted file mode 100644 index 538cfa5cf..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java +++ /dev/null @@ -1,40 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.IOException; -import java.io.StringWriter; - -@Controller -@RequestMapping(value = "/api/metadataProviders") -public class MetadataProvidersController { - private static final Logger logger = LoggerFactory.getLogger(MetadataProvidersController.class); - - @Autowired - MetadataResolverService metadataResolverService; - - @RequestMapping(produces = "application/xml") - public ResponseEntity getXml() throws IOException, TransformerException { - // TODO: externalize - try (StringWriter writer = new StringWriter()) { - Transformer transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - - transformer.transform(new DOMSource(metadataResolverService.generateConfiguration()), new StreamResult(writer)); - return ResponseEntity.ok(writer.toString()); - } - } -} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index 1d6c51321..9705ddacc 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -4,6 +4,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -20,7 +21,14 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.IOException; +import java.io.StringWriter; import java.net.URI; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; @@ -36,6 +44,9 @@ public class MetadataResolversController { @Autowired MetadataResolverValidationService metadataResolverValidationService; + @Autowired + MetadataResolverService metadataResolverService; + @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) public ResponseEntity unableToParseJson(Exception ex) { return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); @@ -49,6 +60,20 @@ public ResponseEntity getAll() { return ResponseEntity.ok(resolvers); } + @GetMapping(value = "/MetadataResolvers", produces = "application/xml") + @Transactional(readOnly = true) + public ResponseEntity getXml() throws IOException, TransformerException { + // TODO: externalize + try (StringWriter writer = new StringWriter()) { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + + transformer.transform(new DOMSource(metadataResolverService.generateConfiguration()), new StreamResult(writer)); + return ResponseEntity.ok(writer.toString()); + } + } + @GetMapping("/MetadataResolvers/{resourceId}") @Transactional(readOnly = true) public ResponseEntity getOne(@PathVariable String resourceId) {