diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java index 3b2eab911..0222ba46e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverConfiguration.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService; @@ -39,7 +40,7 @@ public class MetadataResolverConfiguration { @Bean public MetadataResolver metadataResolver() throws ResolverException, ComponentInitializationException { - ChainingMetadataResolver metadataResolver = new ChainingMetadataResolver(); + ChainingMetadataResolver metadataResolver = new OpenSamlChainingMetadataResolver(); metadataResolver.setId("chain"); List resolvers = new ArrayList<>(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java new file mode 100644 index 000000000..e5265cc29 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlChainingMetadataResolver.java @@ -0,0 +1,60 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; + +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; +import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements; +import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.resolver.ResolverException; +import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver; +import org.opensaml.saml.metadata.resolver.MetadataResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Bill Smith (wsmith@unicon.net) + */ +public class OpenSamlChainingMetadataResolver extends ChainingMetadataResolver { + @Nonnull private final Logger log = LoggerFactory.getLogger(OpenSamlChainingMetadataResolver.class); + + @Nonnull @NonnullElements private List mutableResolvers; + + public OpenSamlChainingMetadataResolver() { + this.mutableResolvers = Collections.emptyList(); + } + + public OpenSamlChainingMetadataResolver(@Nonnull List mutableResolvers) { + this.mutableResolvers = mutableResolvers; + } + + @Override + public void setResolvers(@Nonnull @NonnullElements final List newResolvers) + throws ResolverException { + if (newResolvers == null || newResolvers.isEmpty()) { + mutableResolvers = Collections.emptyList(); + return; + } + + mutableResolvers = new ArrayList<>(Collections2.filter(newResolvers, Predicates.notNull())); + } + + @Nonnull + @NonnullElements + @Override + public List getResolvers() { + return mutableResolvers; + } + + @Override + protected void doInitialize() throws ComponentInitializationException { + super.doInitialize(); + if (mutableResolvers == null) { + log.warn("OpenSamlChainingMetadataResolver was not configured with any member MetadataResolvers"); + mutableResolvers = Collections.emptyList(); + } + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy index 2cb3c7d9d..1796e3b70 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestConfiguration.groovy @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlChainingMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.service.IndexWriterService @@ -36,7 +37,7 @@ class TestConfiguration { @Bean MetadataResolver metadataResolver() { - ChainingMetadataResolver metadataResolver = new ChainingMetadataResolver() + ChainingMetadataResolver metadataResolver = new OpenSamlChainingMetadataResolver() metadataResolver.setId("chain") String resolverId = "test" diff --git a/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json b/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json index 2b5d368e4..ca8ea2646 100644 --- a/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-common.editor.schema.json @@ -159,7 +159,23 @@ "initializeFromBackupFile": [ true ] - } + }, + "widget": { + "id": "datalist", + "data": [ + "PT0S", + "PT30S", + "PT1M", + "PT10M", + "PT30M", + "PT1H", + "PT4H", + "PT12H", + "PT24H" + ] + }, + "default": null, + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "Require Valid Metadata?", diff --git a/ui/src/assets/schema/provider/filebacked-http-common.schema.json b/ui/src/assets/schema/provider/filebacked-http-common.schema.json index 4e01b4f76..2b318c44c 100644 --- a/ui/src/assets/schema/provider/filebacked-http-common.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-common.schema.json @@ -96,7 +96,23 @@ "initializeFromBackupFile": [ true ] - } + }, + "widget": { + "id": "datalist", + "data": [ + "PT0S", + "PT30S", + "PT1M", + "PT10M", + "PT30M", + "PT1H", + "PT4H", + "PT12H", + "PT24H" + ] + }, + "default": null, + "pattern": "^(R\\d*\\/)?P(?:\\d+(?:\\.\\d+)?Y)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?W)?(?:\\d+(?:\\.\\d+)?D)?(?:T(?:\\d+(?:\\.\\d+)?H)?(?:\\d+(?:\\.\\d+)?M)?(?:\\d+(?:\\.\\d+)?S)?)?$" }, "requireValidMetadata": { "title": "Require Valid Metadata?",