diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java index 2ec5f01ab..f13ffad5a 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java @@ -6,10 +6,16 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter; import edu.internet2.tier.shibboleth.admin.ui.domain.filters.SignatureValidationFilter; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlFunctionDrivenDynamicHTTPMetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml.OpenSamlLocalDynamicMetadataResolver; import edu.internet2.tier.shibboleth.admin.ui.repository.FilterRepository; import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; +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.RefreshableMetadataResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,6 +33,7 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import java.net.URI; +import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -46,6 +53,9 @@ public class MetadataFiltersController { @Autowired private FilterRepository filterRepository; + @Autowired + org.opensaml.saml.metadata.resolver.MetadataResolver chainingMetadataResolver; + private static final Supplier HTTP_404_CLIENT_ERROR_EXCEPTION = () -> new HttpClientErrorException(NOT_FOUND); @ExceptionHandler @@ -78,6 +88,7 @@ public ResponseEntity create(@PathVariable String metadataResolverId, @Reques // we reload the filters here after save metadataResolverService.reloadFilters(persistedMr.getName()); + refreshOrInitResolver(metadataResolver); MetadataFilter persistedFilter = newlyPersistedFilter(persistedMr.getMetadataFilters().stream(), createdFilter.getResourceId()); @@ -86,6 +97,33 @@ public ResponseEntity create(@PathVariable String metadataResolverId, @Reques .body(persistedFilter); } + private void refreshOrInitResolver(MetadataResolver resolver) { + List resolvers = ((ChainingMetadataResolver) chainingMetadataResolver).getResolvers(); + resolvers.stream().filter(it -> it.getId().equals(resolver.getResourceId())).forEach(it -> { + if (it instanceof RefreshableMetadataResolver) { + try { + ((RefreshableMetadataResolver) it).refresh(); + } catch (ResolverException e) { + //TODO what should we do if we can't refresh? + } + } else if (it instanceof OpenSamlFunctionDrivenDynamicHTTPMetadataResolver) { + try { + ((OpenSamlFunctionDrivenDynamicHTTPMetadataResolver) it).refresh(); + } catch (ComponentInitializationException e) { + //TODO what should we do if we can't refresh? + } + } else if (it instanceof OpenSamlLocalDynamicMetadataResolver) { + try { + ((OpenSamlLocalDynamicMetadataResolver) it).refresh(); + } catch (ComponentInitializationException e) { + //TODO what should we do if we can't refresh? + } + } else { + //TODO we shouldn't get here, but if we do... throw exception? + } + }); + } + @PutMapping("/Filters/{resourceId}") public ResponseEntity update(@PathVariable String metadataResolverId, @PathVariable String resourceId, @@ -120,6 +158,7 @@ public ResponseEntity update(@PathVariable String metadataResolverId, // TODO: this is wrong metadataResolverService.reloadFilters(metadataResolver.getName()); + refreshOrInitResolver(metadataResolver); return ResponseEntity.ok().body(persistedFilter); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java index 76d3d9384..5f4c10905 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFileBackedHTTPMetadataResolver.java @@ -3,6 +3,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; +import net.shibboleth.utilities.java.support.xml.ParserPool; import org.apache.http.HttpResponse; import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; @@ -22,7 +23,8 @@ public class OpenSamlFileBackedHTTPMetadataResolver extends FileBackedHTTPMetada private OpenSamlMetadataResolverDelegate delegate; - public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, + public OpenSamlFileBackedHTTPMetadataResolver(ParserPool parserPool, + IndexWriter indexWriter, FileBackedHttpMetadataResolver sourceResolver) throws ResolverException { super(HttpClients.createMinimal(), sourceResolver.getMetadataURL(), sourceResolver.getBackingFile()); this.indexWriter = indexWriter; @@ -34,7 +36,7 @@ public OpenSamlFileBackedHTTPMetadataResolver(IndexWriter indexWriter, OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( this, sourceResolver.getHttpMetadataResolverAttributes()); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( - this, sourceResolver.getReloadableMetadataResolverAttributes()); + this, sourceResolver.getReloadableMetadataResolverAttributes(), parserPool); this.setBackupFile(sourceResolver.getBackingFile()); this.setBackupFileInitNextRefreshDelay(toMillis(sourceResolver.getBackupFileInitNextRefreshDelay())); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java index 94ded9133..ad3ee65d9 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFilesystemMetadataResolver.java @@ -2,6 +2,7 @@ import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.resolver.ResolverException; +import net.shibboleth.utilities.java.support.xml.ParserPool; import org.apache.lucene.index.IndexWriter; import org.joda.time.DateTime; import org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver; @@ -17,9 +18,10 @@ public class OpenSamlFilesystemMetadataResolver extends FilesystemMetadataResolv private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver; private OpenSamlMetadataResolverDelegate delegate; - public OpenSamlFilesystemMetadataResolver(File metadataFile, + public OpenSamlFilesystemMetadataResolver(ParserPool parserPool, IndexWriter indexWriter, - edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver) throws ResolverException { + edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver sourceResolver, + File metadataFile) throws ResolverException { super(metadataFile); this.indexWriter = indexWriter; this.sourceResolver = sourceResolver; @@ -28,7 +30,7 @@ public OpenSamlFilesystemMetadataResolver(File metadataFile, this.setId(sourceResolver.getResourceId()); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromReloadableMetadataResolverAttributes( - this, sourceResolver.getReloadableMetadataResolverAttributes()); + this, sourceResolver.getReloadableMetadataResolverAttributes(), parserPool); } // TODO: this is still probably not the best way to do this? diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java index 2887fa85a..1235660d8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlFunctionDrivenDynamicHTTPMetadataResolver.java @@ -2,6 +2,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.xml.ParserPool; import org.apache.http.impl.client.HttpClients; import org.apache.lucene.index.IndexWriter; import org.opensaml.saml.metadata.resolver.impl.FunctionDrivenDynamicHTTPMetadataResolver; @@ -14,7 +15,8 @@ public class OpenSamlFunctionDrivenDynamicHTTPMetadataResolver extends FunctionD private DynamicHttpMetadataResolver sourceResolver; private OpenSamlMetadataResolverDelegate delegate; - public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter, + public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(ParserPool parserPool, + IndexWriter indexWriter, DynamicHttpMetadataResolver sourceResolver) { super(HttpClients.createMinimal()); this.indexWriter = indexWriter; @@ -24,7 +26,7 @@ public OpenSamlFunctionDrivenDynamicHTTPMetadataResolver(IndexWriter indexWriter this.setId(sourceResolver.getResourceId()); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromDynamicMetadataResolverAttributes( - this, sourceResolver.getDynamicMetadataResolverAttributes()); + this, sourceResolver.getDynamicMetadataResolverAttributes(), parserPool); OpenSamlMetadataResolverConstructorHelper.updateOpenSamlMetadataResolverFromHttpMetadataResolverAttributes( this, sourceResolver.getHttpMetadataResolverAttributes()); @@ -45,4 +47,10 @@ protected void initMetadataResolver() throws ComponentInitializationException { this.sourceResolver.getResourceId(), indexWriter); } + + public void refresh() throws ComponentInitializationException { + delegate.addIndexedDescriptorsFromBackingStore(this.getBackingStore(), + this.sourceResolver.getResourceId(), + indexWriter); + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java index abbfbd26b..be6adb54d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/opensaml/OpenSamlLocalDynamicMetadataResolver.java @@ -1,6 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.opensaml; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; +import net.shibboleth.utilities.java.support.xml.ParserPool; import org.apache.lucene.index.IndexWriter; import org.opensaml.core.xml.XMLObject; import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager; @@ -16,9 +17,10 @@ public class OpenSamlLocalDynamicMetadataResolver extends LocalDynamicMetadataRe private edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver; private OpenSamlMetadataResolverDelegate delegate; - public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager manager, + public OpenSamlLocalDynamicMetadataResolver(ParserPool parserPool, IndexWriter indexWriter, - edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver) { + edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver sourceResolver, + @Nonnull XMLObjectLoadSaveManager manager) { super(manager); this.indexWriter = indexWriter; this.sourceResolver = sourceResolver; @@ -27,7 +29,7 @@ public OpenSamlLocalDynamicMetadataResolver(@Nonnull XMLObjectLoadSaveManager